From 287cc564767b003ceec56c2fbdf186475643ed62 Mon Sep 17 00:00:00 2001 From: Terry W Brady Date: Fri, 14 Jul 2017 09:46:23 -0700 Subject: [PATCH 001/193] Port 6x to 7x --- .../dspace/util/SolrUpgradeStatistics6.java | 662 ++++++++++++++++++ dspace/config/launcher.xml | 7 + dspace/solr/statistics/conf/schema.xml | 16 +- 3 files changed, 677 insertions(+), 8 deletions(-) create mode 100644 dspace-api/src/main/java/org/dspace/util/SolrUpgradeStatistics6.java diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradeStatistics6.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradeStatistics6.java new file mode 100644 index 0000000000..9006dcc018 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradeStatistics6.java @@ -0,0 +1,662 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.util; + +import org.apache.commons.cli.*; +import org.apache.commons.cli.ParseException; +import org.apache.log4j.Logger; +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.impl.HttpSolrServer; +import org.apache.solr.client.solrj.response.FacetField; +import org.apache.solr.client.solrj.response.QueryResponse; +import org.apache.solr.client.solrj.util.ClientUtils; +import org.apache.solr.common.SolrDocument; +import org.apache.solr.common.SolrDocumentList; +import org.apache.solr.common.SolrInputDocument; +import org.apache.solr.common.SolrInputField; +import org.dspace.content.Bitstream; +import org.dspace.content.Community; +import org.dspace.content.Item; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.BitstreamService; +import org.dspace.content.service.CollectionService; +import org.dspace.content.service.CommunityService; +import org.dspace.content.service.ItemService; +import org.dspace.core.Constants; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.eperson.Group; +import org.dspace.eperson.factory.EPersonServiceFactory; +import org.dspace.eperson.service.EPersonService; +import org.dspace.eperson.service.GroupService; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.*; + +/** + * CLI tool to upgrade legacy id references in SOLR statistics to DSpace 6 UUID's. + * + * This command will need to be run iteratively over each statistics shard until all legacy id values have been replaced. + * + * If a legacy id cannot be resolved from the database, the id will remain unchanged. + * "field:* AND NOT(field:*-*)" can be used to locate legacy ids + * + * See DS-3602 for the origin of this issue. This code is targeted for inclusion in the DSpace 6.1 release. + * + * Recommendation: for a large repository, run this command with -Xmx2000m if possible. + * + * To process 1,000,000 statistics records, it took 60 min to complete. + * + * @author Terry Brady, Georgetown University Library + */ +public class SolrUpgradeStatistics6 +{ + //Command line parameter constants + private static final String INDEX_NAME_OPTION = "i"; + private static final String NUMREC_OPTION = "n"; + private static final String BATCH_OPTION = "b"; + private static final String TYPE_OPTION = "t"; + private static final String HELP_OPTION = "h"; + private static final int NUMREC_DEFAULT = 100000; + private static final int BATCH_DEFAULT = 10000; + + //After processing each batch of updates to SOLR, evaulate if the hibernate cache needs to be cleared + private static final int CACHE_LIMIT = 20000; + + //Maximum number of solr ids to pull in a facet query... when processing infrequently accessed ids, the + //facet size may grow. + private static final int FACET_LIMIT = 1000; + //Once the number of records returned from a facet is smaller than this number, process all items for a query + private static final int FACET_CUTOFF = 10; + + private static final String INDEX_DEFAULT = "statistics"; + private static final String MIGQUERY = "NOT(dspaceMig:*)"; + + + //Counters to determine the number of items to process + private int numRec = NUMREC_DEFAULT; + private int batchSize = BATCH_DEFAULT; + + //Cache management + private int numProcessed = 0; + private long totalCache = 0; + private long numUncache = 0; + private List docs = new ArrayList(); + private Context context; + + + //Enum to identify the named SOLR statistics fields to update + private enum FIELD{ + id, + scopeId, + owningComm, + owningColl, + owningItem, + epersonid, + owner, + submitter, + actor; + } + + //Logger + private static final Logger log = Logger.getLogger(SolrUpgradeStatistics6.class); + + //DSpace Servcies + private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); + protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); + protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); + protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); + protected EPersonService epersonService = EPersonServiceFactory.getInstance().getEPersonService(); + protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService(); + + // This code will operate on one shard at a time, therefore the SOLR web service will be accessed directly rather + // than make use of the DSpace Solr Logger which only writes to the current shard + private HttpSolrServer server; + + //Allows for smart use of hibernate cache + private Item lastItem = null; + private Bitstream lastBitstream = null; + + //Report on process times + private long startTime = -1; + private long lastTime = -1; + + + /** + * Construct the utility class from the command line options + * @param indexName name of the statistics shard to update + * @param numRec maximum number of records to process + * @throws IOException + * @throws SolrServerException + */ + public SolrUpgradeStatistics6(String indexName, int numRec, int batchSize) throws SolrServerException, IOException { + String serverPath = configurationService.getProperty("solr-statistics.server"); + serverPath = serverPath.replaceAll("statistics$", indexName); + System.out.println("Connecting to " + serverPath); + server = new HttpSolrServer(serverPath); + server.setMaxTotalConnections(1); + this.numRec = numRec; + this.batchSize = batchSize; + refreshContext(); + } + + /* + * Process a batch of updates to SOLR + */ + private void batchUpdateStats() throws SolrServerException, IOException { + if (docs.size() > 0) { + server.add(docs); + server.commit(true, true); + docs.clear(); + } + + } + + /** + * Refresh the DSpace Context object in order to periodically release objects from memory + * @throws IOException + * @throws SolrServerException + */ + private void refreshContext() throws SolrServerException, IOException { + if (context != null) { + try { + totalCache += numUncache + context.getCacheSize(); + } catch (SQLException e) { + } + } + this.context = new Context(Context.Mode.READ_ONLY); + lastItem = null; + lastBitstream = null; + numUncache = 0; + } + + /* + * Compute the number of items that were cached by hibernate since the context was cleared. + */ + private long getCacheCounts(boolean fromStart) { + long count = 0; + try { + count = context.getCacheSize(); + } catch (Exception e) { + //no action + } + count += this.numUncache; + if (fromStart) { + count += totalCache; + } + return count; + } + + /** + * Compute the time since the last batch was processed + * @param fromStart if true, report on processing time since the start of the program + * @return the time in ms since the start time + */ + private long logTime(boolean fromStart) { + long ret = 0; + long cur = new Date().getTime(); + if (lastTime == -1) { + startTime = cur; + } else if (fromStart){ + ret = cur - startTime; + } else { + ret = cur - lastTime; + } + lastTime = cur; + return ret; + } + + /* + * Format ms count as h:mm:ss + * @param dur Duration in ms + * @return duration formatted as h:mm:ss + */ + private String duration(long dur) { + long sec = dur / 1000; + long hh = sec / 3600; + long mm = (sec % 3600) / 60; + long ss = (sec % 60); + return String.format("%d:%02d:%02d", hh,mm,ss); + } + + /** + * Print a status message appended with the processing time for the operation + * @param header Message to display + * @param fromStart if true, report on processing time since the start of the program + */ + private void printTime(int numProcessed, boolean fromStart) { + long dur = logTime(fromStart); + long totalDur = logTime(true); + String stotalDur = duration(totalDur); + long cacheSize = 0; + try { + cacheSize = context.getCacheSize(); + } catch (SQLException e) { + log.error("Cannot get cache size", e); + } + String label = fromStart ? "TOTAL" : "Processed"; + System.out.println(String.format("%s (%s; %s; %s)", + String.format("\t%,12d %10s...", numProcessed, label), + String.format("%,6d sec; %s", dur/1000, stotalDur), + String.format("DB cache: %,6d/%,8d", cacheSize, getCacheCounts(fromStart)), + String.format("Docs: %,6d", docs.size()) + )); + } + + /* + * Create command line option processor + */ + private static Options makeOptions() { + Options options = new Options(); + options.addOption(HELP_OPTION, "help", false, "Get help on options for this command."); + options.addOption(INDEX_NAME_OPTION, "index-name", true, + "The names of the indexes to process. At least one is required (default=statistics)"); + options.addOption(NUMREC_OPTION, "num-rec", true, "Total number of records to update (defaut=100,000)."); + options.addOption(BATCH_OPTION, "batch-size", true, "Number of records to batch update to SOLR at one time (default=10,000)."); + options.addOption(TYPE_OPTION, "type", true, "(4) Communities, (3) Collections, (2) Items (0) Bitstreams (default=all)"); + return options; + } + + /** + * A utility method to print out all available command-line options and exit given the specified code. + * + * @param options the supported options. + * @param exitCode the exit code to use. The method will call System#exit(int) with the given code. + */ + private static void printHelpAndExit(Options options, int exitCode) + { + HelpFormatter myhelp = new HelpFormatter(); + myhelp.printHelp(SolrUpgradeStatistics6.class.getSimpleName() + "\n", options); + System.out.println("\n\nCommand Defaults"); + System.out.println("\tsolr-upgradeD6-statistics [-i statistics] [-n num_recs_to_process] [-b num_rec_to_update_at_once]"); + System.out.println(""); + System.out.println("\tAfter upgrading to DSpace 6, this process should be run iteratively over every statistics shard "); + System.out.println("\t\tuntil there are no remaining records with legacy ids present."); + System.out.println("\t\tThis process can be run while the system is in use."); + System.out.println(""); + System.out.println("\tIt will take 20-30 min to process 1,000,000 legacy records. "); + System.out.println(""); + System.out.println("\tUse the -n option to manage the workload on your server. "); + System.out.println("\t\tTo process all records, set -n to 10000000 or to 100000000 (10M or 100M)"); + System.out.println("\tIf possible, please allocate 2GB of memory to this process (e.g. -Xmx2000m)"); + System.out.println(""); + System.out.println("\tThis process will rewrite most solr statistics records and may temporarily double "); + System.out.println("\t\tthe size of your statistics repositories. Consider optimizing your solr repos when complete."); + + System.exit(exitCode); + } + + /** + * Entry point for command-line invocation + * @param args command-line arguments; see help for description + * @throws ParseException if the command-line arguments cannot be parsed + */ + public static void main(String[] args) throws ParseException + { + CommandLineParser parser = new PosixParser(); + Options options = makeOptions(); + + System.out.println(" * This process should be run iteratively over every statistics shard "); + System.out.println(" * until there are no remaining records with legacy ids present."); + System.out.println(" * This process can be run while the system is in use."); + System.out.println(" * It is likely to take 1 hour/1,000,000 legacy records to be udpated."); + System.out.println(" *"); + System.out.println(" * This process will rewrite most solr statistics records and may temporarily double "); + System.out.println(" *\tthe size of your statistics repositories. Consider optimizing your solr repos when complete."); + System.out.println(" * -------------------------------------------------------------------"); + + String indexName = INDEX_DEFAULT; + int numrec = NUMREC_DEFAULT; + int batchSize = BATCH_DEFAULT; + try + { + CommandLine line = parser.parse(options, args); + if (line.hasOption(HELP_OPTION)) + { + printHelpAndExit(options, 0); + } + + if (line.hasOption(INDEX_NAME_OPTION)) + { + indexName = line.getOptionValue(INDEX_NAME_OPTION, INDEX_DEFAULT); + } + else + { + System.err.println("No index name provided, defaulting to : "+ INDEX_DEFAULT); + } + + if (line.hasOption(NUMREC_OPTION)) { + numrec = Integer.parseInt(line.getOptionValue(NUMREC_OPTION,""+NUMREC_DEFAULT)); + } + if (line.hasOption(BATCH_OPTION)) { + batchSize = Integer.parseInt(line.getOptionValue(BATCH_OPTION,""+BATCH_DEFAULT)); + } + + } + catch (ParseException e) + { + System.err.println("Cannot read command options"); + printHelpAndExit(options, 1); + } + + try { + SolrUpgradeStatistics6 upgradeStats = new SolrUpgradeStatistics6(indexName, numrec, batchSize); + upgradeStats.run(); + } catch (SolrServerException e) { + log.error("Error querying stats", e); + } catch (SQLException e) { + log.error("Error querying stats", e); + } catch (IOException e) { + log.error("Error querying stats", e); + } + } + + + /* + * Report on the existence of legacy id records within a shard + */ + private void runReport() throws SolrServerException { + System.out.println(); + System.out.println("================================================================="); + System.out.println("\t*** Statistics Records with Legacy Id ***\n"); + long total = runReportQuery(); + System.out.println("\t--------------------------------------"); + System.out.println(String.format("\t%,12d\t%s", total, "TOTAL")); + System.out.println("================================================================="); + System.out.println(); + } + /* + * Report on the existence of specific legacy id records within a shard + */ + private long runReportQuery() throws SolrServerException { + StringBuilder sb = new StringBuilder(MIGQUERY); + SolrQuery sQ = new SolrQuery(); + sQ.setQuery(sb.toString()); + sQ.setFacet(true); + sQ.addFacetField("type"); + sQ.addFacetField("scopeType"); + QueryResponse sr = server.query(sQ); + + long total = 0; + long unexpected = 0; + for(FacetField ff: sr.getFacetFields()) { + String s = ff.getName().equals("type") ? "View" : "Search"; + for(FacetField.Count count: ff.getValues()) { + String name = count.getName(); + int id = Integer.parseInt(name); + if (id == Constants.COMMUNITY) { + name = "Community " + s; + } else if (id == Constants.COLLECTION) { + name = "Collection " + s; + } else if (id == Constants.ITEM) { + name = "Item " + s; + } else if (id == Constants.BITSTREAM) { + name = "Bistream " + s; + } else { + /* + * In testing, I discovered some unexpected values in the scopeType field. + * It looks like they may have been a result of a CSV import/export error. + * This will group any unexpected values into one report line. + */ + unexpected += count.getCount(); + continue; + } + System.out.println(String.format("\t%,12d\t%s", count.getCount(), name)); + total += count.getCount(); + } + } + if (unexpected > 0) { + System.out.println(String.format("\t%,12d\t%s", unexpected, "Unexpected Type & Full Site")); + total += unexpected; + } + long rem = sr.getResults().getNumFound() - total; + if (rem > 0) { + System.out.println(String.format("\t%,12d\t%s", rem, "Other Records")); + total += rem; + } + return total; + } + + /* + * Process records with a legacy id. + * From the command line, the user may specify records of a specific type to update + * Otherwise, the following sequence will be applied in order to optimize hibernate caching. + * + * Communities and Collections - retain in the cache since each is likely to be re-used + * Items - retain in the cache until a new item is processed + * Bitstreams - retain in the cache until a new bitstream is processed + */ + private void run() throws SolrServerException, SQLException, IOException { + runReport(); + logTime(false); + for(int processed = updateRecords(MIGQUERY); (processed != 0) && (numProcessed < numRec); processed = updateRecords(MIGQUERY)){ + printTime(numProcessed, false); + batchUpdateStats(); + if (context.getCacheSize() > CACHE_LIMIT) { + refreshContext(); + } + } + printTime(numProcessed, true); + + if (numProcessed > 0) { + runReport(); + } + } + + + + /* + * Update records associated with a particular object id + * @param query Query to retrieve all of the statistics records associated with a particular object + * @param field Field to use for grouping records + * @return number of items processed. 0 indicates that no more work is available (or the max processed has been reached). + */ + private int updateRecords(String query) throws SolrServerException, SQLException, IOException { + int initNumProcessed = numProcessed; + SolrQuery sQ = new SolrQuery(); + sQ.setQuery(query); + sQ.setRows(batchSize); + + //Ensure that items are grouped by id + //Sort by id fails due to presense of id and string fields. The ord function seems to help + sQ.addSort("type", SolrQuery.ORDER.desc); + sQ.addSort("scopeType", SolrQuery.ORDER.desc); + sQ.addSort("ord(owningItem)", SolrQuery.ORDER.desc); + sQ.addSort("id", SolrQuery.ORDER.asc); + sQ.addSort("scopeId", SolrQuery.ORDER.asc); + + QueryResponse sr = server.query(sQ); + SolrDocumentList sdl = sr.getResults(); + + for(int i=0; i vals = ifield.getValues(); + ArrayList newvals = new ArrayList<>(); + for(Object oval: vals) { + try { + UUID uuid = null; + if (col == FIELD.owner) { + if (oval.toString().length() > 1) { + String owntype = oval.toString().substring(0, 1); + int legacy = Integer.parseInt(oval.toString().substring(1)); + uuid = mapOwner(owntype, legacy); + } + } else { + int legacy = Integer.parseInt(oval.toString()); + if (col == FIELD.id) { + Object otype = input.getFieldValue("type"); + if (otype != null) { + int type = Integer.parseInt(otype.toString()); + uuid = mapType(type, legacy); + } + } else if (col == FIELD.scopeId) { + Object otype = input.getFieldValue("scopeType"); + if (otype != null) { + int type = Integer.parseInt(otype.toString()); + uuid = mapType(type, legacy); + } + } else { + uuid = mapId(col, legacy); + } + } + if (uuid != null) { + newvals.add(uuid.toString()); + } + } catch (NumberFormatException e) { + log.warn("Non numeric legacy id "+ col.name() +":" + oval.toString()); + } + } + if (newvals.size() > 0) { + input.removeField(col.name()); + for(String nv: newvals) { + input.addField(col.name(), nv); + } + + } + } + } + + /* + * Determine if the last processed item should be cleared from the hibernate cache + * @param item Current item being processed + */ + private void checkLastItem(Item item) throws SQLException { + if (item != null) { + if (lastItem == null) { + lastItem = item; + } else if (!lastItem.getID().equals(item.getID())) { + numUncache++; + context.uncacheEntity(lastItem); + lastItem = item; + } + } + } + + /* + * Determine if the last processed bitstream should be cleared from the hibernate cache + * @param bitstream Current bitstream being processed + */ + private void checkLastBitstream(Bitstream bitstream) throws SQLException { + if (bitstream != null) { + if (lastBitstream == null) { + lastBitstream = bitstream; + } else if (!lastBitstream.getID().equals(bitstream.getID())) { + numUncache++; + context.uncacheEntity(lastBitstream); + lastBitstream = bitstream; + } + } + } + + /* + * Retrieve the UUID corresponding to a legacy id found in a SOLR statistics record + * @param col Solr Statistic Field being processed + * @param val Value to lookup as a legacy id + */ + private UUID mapId(FIELD col, int val) throws SQLException { + + if (col == FIELD.owningComm) { + Community comm = communityService.findByLegacyId(context, val); + return comm == null ? null : comm.getID(); + } + if (col == FIELD.owningColl) { + org.dspace.content.Collection coll = collectionService.findByLegacyId(context, val); + return coll == null ? null : coll.getID(); + } + if (col == FIELD.owningItem) { + Item item = itemService.findByLegacyId(context, val); + checkLastItem(item); + return item == null ? null : item.getID(); + } + if (col == FIELD.epersonid || col == FIELD.actor || col == FIELD.submitter) { + EPerson per = epersonService.findByLegacyId(context, val); + return per == null ? null : per.getID(); + } + return null; + } + + /* + * Retrieve the UUID corresponding to a legacy id found in a SOLR statistics record + * @param type Identifying type field for id OR scopeType field for scopeId + * @param val Value to lookup as a legacy id + */ + private UUID mapType(int type, int val) throws SQLException { + if (type == Constants.COMMUNITY) { + Community comm = communityService.findByLegacyId(context, val); + return comm == null ? null : comm.getID(); + } + if (type == Constants.COLLECTION) { + org.dspace.content.Collection coll = collectionService.findByLegacyId(context, val); + return coll == null ? null : coll.getID(); + } + if (type == Constants.ITEM) { + Item item = itemService.findByLegacyId(context, val); + checkLastItem(item); + return item == null ? null : item.getID(); + } + if (type == Constants.BITSTREAM) { + Bitstream bit = bitstreamService.findByLegacyId(context, val); + UUID uuid = bit == null ? null : bit.getID(); + //A bitstream is unlikely to be processed more than once, to clear immediately + checkLastBitstream(bit); + return uuid; + } + return null; + } + + /* + * Retrieve the UUID corresponding to a legacy owner found in a SOLR statistics record + * Legacy owner fields are prefixed in solr with "e" or "g" + * @param owntype Identifying type field (e - eperson, g - group) + * @param val Value to lookup as a legacy id + */ + private UUID mapOwner(String owntype, int val) throws SQLException { + if (owntype.equals("e")) { + EPerson per = epersonService.findByLegacyId(context, val); + return per == null ? null : per.getID(); + } else if (owntype.equals("g")) { + Group perg = groupService.findByLegacyId(context, val); + return perg == null ? null : perg.getID(); + } + return null; + } + +} \ No newline at end of file diff --git a/dspace/config/launcher.xml b/dspace/config/launcher.xml index bf2c22618c..ab337941eb 100644 --- a/dspace/config/launcher.xml +++ b/dspace/config/launcher.xml @@ -242,6 +242,13 @@ reindex + + solr-upgradeD6-statistics + Upgrade statistics (integer to UUID) to DSpace 6 + + org.dspace.util.SolrUpgradeStatistics6 + + stat-general Compile the general statistics diff --git a/dspace/solr/statistics/conf/schema.xml b/dspace/solr/statistics/conf/schema.xml index 6386beee53..1f34744821 100644 --- a/dspace/solr/statistics/conf/schema.xml +++ b/dspace/solr/statistics/conf/schema.xml @@ -286,19 +286,19 @@ --> - + - + - - - + + + @@ -313,7 +313,7 @@ - + @@ -323,8 +323,8 @@ - - + + From eefb535214e95d501d96a648c83329308d01ad5b Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Wed, 18 Jul 2018 10:30:16 +0200 Subject: [PATCH 002/193] setting DSpace classes to debug mode by default --- dspace/config/log4j.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace/config/log4j.properties b/dspace/config/log4j.properties index 5acdacd310..30e69fc137 100644 --- a/dspace/config/log4j.properties +++ b/dspace/config/log4j.properties @@ -22,7 +22,7 @@ log.dir=${dspace.dir}/log # Log level for all DSpace-specific code (org.dspace.*) # Possible values (from most to least info): DEBUG, INFO, WARN, ERROR, FATAL # Defaults to INFO -loglevel.dspace=INFO +loglevel.dspace=DEBUG # loglevel.other # Log level for other third-party tools/APIs used by DSpace From 26d6ca9bac5b57e8986c6526ed2a7312237fea73 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Thu, 19 Jul 2018 12:05:19 +0200 Subject: [PATCH 003/193] adds first draft of OpenSearchContoller --- .../dspace/app/rest/OpenSearchController.java | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java new file mode 100644 index 0000000000..69ce59378c --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java @@ -0,0 +1,208 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.dom.DOMSource; +import org.w3c.dom.Document; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.beans.factory.annotation.Autowired; + +import org.apache.log4j.Logger; + +import org.dspace.app.rest.utils.ScopeResolver; +import org.dspace.app.rest.utils.ContextUtil; +import org.dspace.app.util.service.OpenSearchService; +import org.dspace.core.LogManager; +import org.dspace.core.Context; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.CollectionService; +import org.dspace.content.service.CommunityService; +import org.dspace.content.DSpaceObject; +import org.dspace.app.util.SyndicationFeed; +import org.dspace.app.util.factory.UtilServiceFactory; +import org.dspace.discovery.SearchUtils; +import org.dspace.discovery.configuration.DiscoveryConfiguration; +import org.dspace.discovery.DiscoverQuery; +import org.dspace.discovery.DiscoverResult; +import org.dspace.discovery.SearchServiceException; +import org.dspace.discovery.configuration.DiscoverySearchFilter; +import org.dspace.authorize.factory.AuthorizeServiceFactory; +import org.dspace.authorize.service.AuthorizeService; + +/** + * This class provides a controller for OpenSearch support. + * It creates a namespace /opensearch in the DSpace REST webapp. + * + * @author Oliver Goldschmidt (o.goldschmidt at tuhh.de) + */ +@Controller +@RequestMapping("/opensearch") +public class OpenSearchController { + + private static final Logger log = Logger.getLogger(ScopeResolver.class); + + private List searchIndices = null; + + private CommunityService communityService; + private CollectionService collectionService; + private AuthorizeService authorizeService; + private OpenSearchService openSearchService; + + private Context context; + + /** + * This method provides the OpenSearch query on the path /search + * It will pass the result as a OpenSearchDocument directly to the client + */ + @GetMapping("/search") + public void search(HttpServletRequest request, + HttpServletResponse response, + @RequestParam(name="query", required=false) String query, + @RequestParam(name="format", required=false) String format, + Model model) throws IOException, ServletException { + context = ContextUtil.obtainContext(request); + openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + + // get enough request parameters to decide on action to take + if (format == null || "".equals(format)) + { + // default to atom + format = "atom"; + } + + log.debug("Searching for "+query+" in format "+format); + + // do some sanity checking + // TODO: make that work correctly + if (!openSearchService.getFormats().contains(format)) + { + response.sendError(HttpServletResponse.SC_BAD_REQUEST); + //return "error"; + } + + // then the rest - we are processing the query + DSpaceObject container = null; + + // TODO: support pagination parameters + DiscoverQuery queryArgs = new DiscoverQuery(); + queryArgs.setQuery(query); + + // Perform the search + DiscoverResult qResults = null; + try + { + qResults = SearchUtils.getSearchService().search(context, + container, queryArgs); + } + catch (SearchServiceException e) + { + log.error( + LogManager.getHeader(context, "opensearch", "query=" + + queryArgs.getQuery() + + ",error=" + e.getMessage()), e); + throw new RuntimeException(e.getMessage(), e); + } + + // Log + log.info("opensearch done, query=\"" + query + "\",results=" + + qResults.getTotalSearchResults()); + + // format and return results + Map labelMap = getLabels(request); + List dsoResults = qResults.getDspaceObjects(); + Document resultsDoc = openSearchService.getResultsDoc(context, format, query, + (int) qResults.getTotalSearchResults(), qResults.getStart(), + qResults.getMaxResults(), container, dsoResults, labelMap); + try + { + Transformer xf = TransformerFactory.newInstance().newTransformer(); + response.setContentType(openSearchService.getContentType(format)); + xf.transform(new DOMSource(resultsDoc), + new StreamResult(response.getWriter())); + } + catch (TransformerException e) + { + log.error(e); + throw new ServletException(e.toString()); + } + } + + /** + * This method provides the OpenSearch servicedescription document on the path /service + * It will pass the result as a OpenSearchDocument directly to the client + */ + @GetMapping("/service") + public void service(HttpServletRequest request, + HttpServletResponse response) throws IOException { + log.debug("Show OpenSearch Service document"); + openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + String svcDescrip = openSearchService.getDescription(null); + log.debug("opensearchdescription is "+svcDescrip); + response.setContentType(openSearchService + .getContentType("opensearchdescription")); + response.setContentLength(svcDescrip.length()); + response.getWriter().write(svcDescrip); + } + + /** + * Internal method for controller initialization + * Not used currently + */ + private void init() + { + if (searchIndices == null) + { + searchIndices = new ArrayList(); + DiscoveryConfiguration discoveryConfiguration = SearchUtils + .getDiscoveryConfiguration(); + searchIndices.add("any"); + for (DiscoverySearchFilter sFilter : discoveryConfiguration.getSearchFilters()) + { + searchIndices.add(sFilter.getIndexFieldName()); + } + } + communityService = ContentServiceFactory.getInstance().getCommunityService(); + collectionService = ContentServiceFactory.getInstance().getCollectionService(); + authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); + } + + /** + * Internal method to get labels for the returned document + */ + private Map getLabels(HttpServletRequest request) + { + // TODO: get strings from translation file or configuration + Map labelMap = new HashMap(); + labelMap.put(SyndicationFeed.MSG_UNTITLED, "notitle"); + labelMap.put(SyndicationFeed.MSG_LOGO_TITLE, "logo.title"); + labelMap.put(SyndicationFeed.MSG_FEED_DESCRIPTION, "general-feed.description"); + labelMap.put(SyndicationFeed.MSG_UITYPE, SyndicationFeed.UITYPE_JSPUI); + for (String selector : SyndicationFeed.getDescriptionSelectors()) + { + labelMap.put("metadata." + selector, selector); + } + return labelMap; + } +} From 38f094caa8be16978e47739b320948866f2f6866 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Fri, 20 Jul 2018 19:28:46 +0200 Subject: [PATCH 004/193] adds rpp and start parameter --- .../org/dspace/app/rest/OpenSearchController.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java index 69ce59378c..c068330ee2 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java @@ -80,9 +80,17 @@ public class OpenSearchController { public void search(HttpServletRequest request, HttpServletResponse response, @RequestParam(name="query", required=false) String query, + @RequestParam(name="start", required=false) Integer start, + @RequestParam(name="rpp", required=false) Integer count, @RequestParam(name="format", required=false) String format, Model model) throws IOException, ServletException { context = ContextUtil.obtainContext(request); + if (start == null) { + start = 0; + } + if (count == null) { + count = -1; + } openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); // get enough request parameters to decide on action to take @@ -108,6 +116,8 @@ public class OpenSearchController { // TODO: support pagination parameters DiscoverQuery queryArgs = new DiscoverQuery(); queryArgs.setQuery(query); + queryArgs.setStart(start); + queryArgs.setMaxResults(count); // Perform the search DiscoverResult qResults = null; @@ -156,6 +166,7 @@ public class OpenSearchController { @GetMapping("/service") public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { +// TODO: the URL tags are missing in document, get them in there! log.debug("Show OpenSearch Service document"); openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); String svcDescrip = openSearchService.getDescription(null); From d903daadce53af88a3661a8c94100e5304a112e6 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Mon, 23 Jul 2018 10:17:18 +0200 Subject: [PATCH 005/193] turn on opensearch in local.cfg, adopts new URL path in default configuration --- dspace/config/dspace.cfg | 9 ++++----- dspace/config/local.cfg.EXAMPLE | 6 ++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index 908970092d..7bf26136b5 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -1336,8 +1336,8 @@ webui.feed.item.author = dc.contributor.author websvc.opensearch.enable = false # context for html request URLs - change only for non-standard servlet mapping websvc.opensearch.uicontext = simple-search -# context for RSS/Atom request URLs - change only for non-standard servlet mapping -websvc.opensearch.svccontext = open-search/ +# context for RSS/Atom request URLs - change only for non-standard module mapping +websvc.opensearch.svccontext = opensearch/search # present autodiscovery link in every page head websvc.opensearch.autolink = true # number of hours to retain results before recalculating @@ -1356,9 +1356,8 @@ websvc.opensearch.samplequery = photosynthesis # tags used to describe search service websvc.opensearch.tags = IR DSpace # result formats offered - use 1 or more comma-separated from: html,atom,rss -# NB: html is required for autodiscovery in browsers to function, -# and must be the first in the list if present -websvc.opensearch.formats = html,atom,rss +# NB: html is not supported in DSpace7, use normal search m,odule instead +websvc.opensearch.formats = atom,rss #### Content Inline Disposition Threshold #### diff --git a/dspace/config/local.cfg.EXAMPLE b/dspace/config/local.cfg.EXAMPLE index 2bf60a0281..37261acb04 100644 --- a/dspace/config/local.cfg.EXAMPLE +++ b/dspace/config/local.cfg.EXAMPLE @@ -199,3 +199,9 @@ db.schema = public # Authentication by Password (encrypted in DSpace's database). See authentication-password.cfg for default configuration. # Enabled by default in authentication.cfg #plugin.sequence.org.dspace.authenticate.AuthenticationMethod = org.dspace.authenticate.PasswordAuthentication + +#### OpenSearch Settings #### +# NB: for result data formatting, OpenSearch uses Syndication Feed Settings +# so even if Syndication Feeds are not enabled, they must be configured +# enable open search +websvc.opensearch.enable = true From f3bdbe43cf2cc936b7016073ede64529ca2553d2 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Mon, 23 Jul 2018 10:53:50 +0200 Subject: [PATCH 006/193] support enable/disable of OpenSearch module from config file --- .../app/util/OpenSearchServiceImpl.java | 5 + .../app/util/service/OpenSearchService.java | 7 ++ .../dspace/app/rest/OpenSearchController.java | 116 ++++++++++-------- 3 files changed, 74 insertions(+), 54 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java index d0824923c7..c020750ae8 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java @@ -96,6 +96,11 @@ public class OpenSearchServiceImpl implements OpenSearchService, InitializingBea return formats; } + @Override + public boolean isEnabled() { + return enabled; + } + @Override public String getContentType(String format) { return "html".equals(format) ? "text/html" : diff --git a/dspace-api/src/main/java/org/dspace/app/util/service/OpenSearchService.java b/dspace-api/src/main/java/org/dspace/app/util/service/OpenSearchService.java index 5b54bfcddd..45259de8c0 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/service/OpenSearchService.java +++ b/dspace-api/src/main/java/org/dspace/app/util/service/OpenSearchService.java @@ -41,6 +41,13 @@ public interface OpenSearchService { */ public List getFormats(); + /** + * Determine if the module is active + * + * @return boolean indicator if the OpenSearch module is enabled or not + */ + public boolean isEnabled(); + /** * Returns a mime-type associated with passed format * diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java index c068330ee2..948ee48705 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java @@ -92,70 +92,74 @@ public class OpenSearchController { count = -1; } openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + if (openSearchService.isEnabled()) { + // get enough request parameters to decide on action to take + if (format == null || "".equals(format)) + { + // default to atom + format = "atom"; + } - // get enough request parameters to decide on action to take - if (format == null || "".equals(format)) - { - // default to atom - format = "atom"; - } + log.debug("Searching for "+query+" in format "+format); - log.debug("Searching for "+query+" in format "+format); + // do some sanity checking + // TODO: make that work correctly + if (!openSearchService.getFormats().contains(format)) + { + response.sendError(HttpServletResponse.SC_BAD_REQUEST); + //return "error"; + } - // do some sanity checking - // TODO: make that work correctly - if (!openSearchService.getFormats().contains(format)) - { - response.sendError(HttpServletResponse.SC_BAD_REQUEST); - //return "error"; - } + // then the rest - we are processing the query + DSpaceObject container = null; - // then the rest - we are processing the query - DSpaceObject container = null; + // TODO: support pagination parameters + DiscoverQuery queryArgs = new DiscoverQuery(); + queryArgs.setQuery(query); + queryArgs.setStart(start); + queryArgs.setMaxResults(count); - // TODO: support pagination parameters - DiscoverQuery queryArgs = new DiscoverQuery(); - queryArgs.setQuery(query); - queryArgs.setStart(start); - queryArgs.setMaxResults(count); - - // Perform the search - DiscoverResult qResults = null; - try - { - qResults = SearchUtils.getSearchService().search(context, + // Perform the search + DiscoverResult qResults = null; + try + { + qResults = SearchUtils.getSearchService().search(context, container, queryArgs); - } - catch (SearchServiceException e) - { - log.error( + } + catch (SearchServiceException e) + { + log.error( LogManager.getHeader(context, "opensearch", "query=" + queryArgs.getQuery() + ",error=" + e.getMessage()), e); - throw new RuntimeException(e.getMessage(), e); - } + throw new RuntimeException(e.getMessage(), e); + } - // Log - log.info("opensearch done, query=\"" + query + "\",results=" + // Log + log.info("opensearch done, query=\"" + query + "\",results=" + qResults.getTotalSearchResults()); - // format and return results - Map labelMap = getLabels(request); - List dsoResults = qResults.getDspaceObjects(); - Document resultsDoc = openSearchService.getResultsDoc(context, format, query, + // format and return results + Map labelMap = getLabels(request); + List dsoResults = qResults.getDspaceObjects(); + Document resultsDoc = openSearchService.getResultsDoc(context, format, query, (int) qResults.getTotalSearchResults(), qResults.getStart(), qResults.getMaxResults(), container, dsoResults, labelMap); - try - { - Transformer xf = TransformerFactory.newInstance().newTransformer(); - response.setContentType(openSearchService.getContentType(format)); - xf.transform(new DOMSource(resultsDoc), + try + { + Transformer xf = TransformerFactory.newInstance().newTransformer(); + response.setContentType(openSearchService.getContentType(format)); + xf.transform(new DOMSource(resultsDoc), new StreamResult(response.getWriter())); + } + catch (TransformerException e) + { + log.error(e); + throw new ServletException(e.toString()); + } } - catch (TransformerException e) - { - log.error(e); - throw new ServletException(e.toString()); + else { + log.debug("OpenSearch Service is disabled"); } } @@ -166,15 +170,19 @@ public class OpenSearchController { @GetMapping("/service") public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { -// TODO: the URL tags are missing in document, get them in there! log.debug("Show OpenSearch Service document"); openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); - String svcDescrip = openSearchService.getDescription(null); - log.debug("opensearchdescription is "+svcDescrip); - response.setContentType(openSearchService + if (openSearchService.isEnabled()) { + String svcDescrip = openSearchService.getDescription(null); + log.debug("opensearchdescription is "+svcDescrip); + response.setContentType(openSearchService .getContentType("opensearchdescription")); - response.setContentLength(svcDescrip.length()); - response.getWriter().write(svcDescrip); + response.setContentLength(svcDescrip.length()); + response.getWriter().write(svcDescrip); + } + else { + log.debug("OpenSearch Service is disabled"); + } } /** From b00bae2c236c44f9d1aed419842b728b22a1b83e Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Wed, 1 Aug 2018 11:13:13 +0200 Subject: [PATCH 007/193] improves error display for disabled opensearch and invalid format --- .../dspace/app/rest/OpenSearchController.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java index 948ee48705..b260559053 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java @@ -24,6 +24,7 @@ import org.w3c.dom.Document; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.boot.autoconfigure.web.ErrorController; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; @@ -59,10 +60,10 @@ import org.dspace.authorize.service.AuthorizeService; */ @Controller @RequestMapping("/opensearch") -public class OpenSearchController { +public class OpenSearchController implements ErrorController { private static final Logger log = Logger.getLogger(ScopeResolver.class); - + private static final String errorpath = "/error"; private List searchIndices = null; private CommunityService communityService; @@ -106,7 +107,11 @@ public class OpenSearchController { // TODO: make that work correctly if (!openSearchService.getFormats().contains(format)) { - response.sendError(HttpServletResponse.SC_BAD_REQUEST); + String err = "Format "+format+" is not supported."; + response.setContentType("text/html"); + response.setContentLength(err.length()); + response.getWriter().write(err); + //response.sendError(HttpServletResponse.SC_BAD_REQUEST); //return "error"; } @@ -160,6 +165,10 @@ public class OpenSearchController { } else { log.debug("OpenSearch Service is disabled"); + String err = "OpenSearch Service is disabled"; + response.setContentType("text/html"); + response.setContentLength(err.length()); + response.getWriter().write(err); } } @@ -182,9 +191,23 @@ public class OpenSearchController { } else { log.debug("OpenSearch Service is disabled"); + String err = "OpenSearch Service is disabled"; + response.setContentType("text/html"); + response.setContentLength(err.length()); + response.getWriter().write(err); } } + @RequestMapping(value = errorpath) + public String error() { + return "Error handling"; + } + + @Override + public String getErrorPath() { + return errorpath; + } + /** * Internal method for controller initialization * Not used currently From 07c7fee64f065c49afe8690fc481b9174c9e0c59 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 13 Aug 2018 12:55:13 -0400 Subject: [PATCH 008/193] [DS-3970] Remove confusing log message. --- .../main/java/org/dspace/statistics/SolrLoggerServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java index e6c09ea32b..007b4defaa 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java @@ -151,7 +151,6 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea @Override public void afterPropertiesSet() throws Exception { - log.info("solr-statistics.spidersfile:" + configurationService.getProperty("solr-statistics.spidersfile")); log.info("solr-statistics.server:" + configurationService.getProperty("solr-statistics.server")); log.info("usage-statistics.dbfile:" + configurationService.getProperty("usage-statistics.dbfile")); From 81b41a2b781e36ba661fbb4f20deec993daaf9fb Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 13 Aug 2018 14:42:56 -0400 Subject: [PATCH 009/193] [DS-3980] Replace absurd MIME types with 'application/octet-stream'. --- .../src/main/java/org/dspace/core/Email.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/dspace-api/src/main/java/org/dspace/core/Email.java b/dspace-api/src/main/java/org/dspace/core/Email.java index 0ce631e6b8..6f6a8a7a2a 100644 --- a/dspace-api/src/main/java/org/dspace/core/Email.java +++ b/dspace-api/src/main/java/org/dspace/core/Email.java @@ -32,10 +32,12 @@ import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; +import javax.mail.internet.ContentType; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; +import javax.mail.internet.ParseException; import org.apache.log4j.Logger; import org.dspace.services.ConfigurationService; @@ -103,7 +105,6 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @author Robert Tansley * @author Jim Downing - added attachment handling code * @author Adan Roman Ruiz at arvo.es - added inputstream attachment handling code - * @version $Revision: 5844 $ */ public class Email { /** @@ -207,7 +208,24 @@ public class Email { attachments.add(new FileAttachment(f, name)); } + /** When given a bad MIME type for an attachment, use this instead. */ + private static final String DEFAULT_ATTACHMENT_TYPE = "application/octet-stream"; + public void addAttachment(InputStream is, String name, String mimetype) { + if (null == mimetype) { + log.error("Null MIME type replaced with '" + DEFAULT_ATTACHMENT_TYPE + + "' for attachment '" + name + "'"); + mimetype = DEFAULT_ATTACHMENT_TYPE; + } else { + try { new ContentType(mimetype); } // Just try to parse it. + catch (ParseException ex) { + log.error("Bad MIME type '" + mimetype + + "' replaced with '" + DEFAULT_ATTACHMENT_TYPE + + "' for attachment '" + name + "'", ex); + mimetype = DEFAULT_ATTACHMENT_TYPE; + } + } + moreAttachments.add(new InputStreamAttachment(is, name, mimetype)); } From 7bb8a8e9c464a5ee175f7d40568e1d840b47977a Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 13 Aug 2018 15:23:18 -0400 Subject: [PATCH 010/193] [DS-3980] Conform to coding standard. --- dspace-api/src/main/java/org/dspace/core/Email.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/core/Email.java b/dspace-api/src/main/java/org/dspace/core/Email.java index 6f6a8a7a2a..a5163350e1 100644 --- a/dspace-api/src/main/java/org/dspace/core/Email.java +++ b/dspace-api/src/main/java/org/dspace/core/Email.java @@ -217,8 +217,9 @@ public class Email { + "' for attachment '" + name + "'"); mimetype = DEFAULT_ATTACHMENT_TYPE; } else { - try { new ContentType(mimetype); } // Just try to parse it. - catch (ParseException ex) { + try { + new ContentType(mimetype); // Just try to parse it. + } catch (ParseException ex) { log.error("Bad MIME type '" + mimetype + "' replaced with '" + DEFAULT_ATTACHMENT_TYPE + "' for attachment '" + name + "'", ex); From cbaad2e71403169089560490b8d58dd5e8576e4f Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Mon, 13 Aug 2018 16:52:04 -0500 Subject: [PATCH 011/193] Implemented method for Browser Entries --- .../app/rest/repository/BrowseEntryLinkRepository.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java index 52fe6a894b..998c5eb8bd 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java @@ -61,8 +61,11 @@ public class BrowseEntryLinkRepository extends AbstractDSpaceRestRepository // FIXME this should be bind automatically and available as method // argument String scope = null; + String startsWith = null; + if (request != null) { scope = request.getParameter("scope"); + startsWith = request.getParameter("startsWith"); } @@ -103,7 +106,7 @@ public class BrowseEntryLinkRepository extends AbstractDSpaceRestRepository // bs.setJumpToItem(focus); // bs.setJumpToValue(valueFocus); // bs.setJumpToValueLang(valueFocusLang); - // bs.setStartsWith(startsWith); + bs.setStartsWith(startsWith); if (pageable != null) { bs.setOffset(pageable.getOffset()); bs.setResultsPerPage(pageable.getPageSize()); From e25a732e6b362f87e1802ca454febfbb0c237616 Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Thu, 16 Aug 2018 00:35:19 -0500 Subject: [PATCH 012/193] Implemented startsWith for Items --- .../dspace/app/rest/repository/BrowseItemLinkRepository.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java index 348e24152d..243100983e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java @@ -61,11 +61,13 @@ public class BrowseItemLinkRepository extends AbstractDSpaceRestRepository String scope = null; String filterValue = null; String filterAuthority = null; + String startsWith = null; if (request != null) { scope = request.getParameter("scope"); filterValue = request.getParameter("filterValue"); filterAuthority = request.getParameter("filterAuthority"); + startsWith = request.getParameter("startsWith"); } Context context = obtainContext(); BrowseEngine be = new BrowseEngine(context); @@ -128,7 +130,7 @@ public class BrowseItemLinkRepository extends AbstractDSpaceRestRepository // bs.setJumpToItem(focus); // bs.setJumpToValue(valueFocus); // bs.setJumpToValueLang(valueFocusLang); - // bs.setStartsWith(startsWith); + bs.setStartsWith(startsWith); if (pageable != null) { bs.setOffset(pageable.getOffset()); bs.setResultsPerPage(pageable.getPageSize()); From c02a5aa7782566a03e5e98f5252068a5bd234efa Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Thu, 16 Aug 2018 18:55:50 -0500 Subject: [PATCH 013/193] Wrote Integration Tests --- .../app/rest/BrowsesResourceControllerIT.java | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java index ceb32ce419..52008b0244 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java @@ -7,6 +7,7 @@ */ package org.dspace.app.rest; +import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasItem; @@ -498,4 +499,169 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe "Item 7", "2016-01-12") ))); } + + + @Test + public void testBrowseByStartsWith() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. 7 public items that are readable by Anonymous + Item item1 = ItemBuilder.createItem(context, col1) + .withTitle("Alan Turing") + .withAuthor("Alan Mathison Turing") + .withIssueDate("1912-06-23") + .withSubject("Computing") + .build(); + + Item item2 = ItemBuilder.createItem(context, col1) + .withTitle("Blade Runner") + .withAuthor("Ridley Scott") + .withIssueDate("1982-06-25") + .withSubject("Science Fiction") + .build(); + + Item item5 = ItemBuilder.createItem(context, col1) + .withTitle("Python") + .withAuthor("Guido van Rossum") + .withIssueDate("1990") + .withSubject("Computing") + .build(); + + Item item4 = ItemBuilder.createItem(context, col1) + .withTitle("Java") + .withAuthor("James Gosling") + .withIssueDate("1995-05-23") + .withSubject("Computing") + .build(); + + Item item6 = ItemBuilder.createItem(context, col2) + .withTitle("Zeta Reticuli") + .withAuthor("Universe") + .withIssueDate("2018-01-01") + .withSubject("Astronomy") + .build(); + + Item item7 = ItemBuilder.createItem(context, col2) + .withTitle("Moon") + .withAuthor("Universe") + .withIssueDate("2018-01-02") + .withSubject("Astronomy") + .build(); + + Item item3 = ItemBuilder.createItem(context, col1) + .withTitle("T-800") + .withAuthor("James Cameron") + .withIssueDate("2029") + .withSubject("Science Fiction") + .build(); + + // ---- BROWSES BY ITEM ---- + + //** WHEN ** + //An anonymous user browses the items in the Browse by date issued endpoint + //with startsWith set to 1990 + getClient().perform(get("/api/discover/browses/dateissued/items") + .param("startsWith", "1990")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the "remaining" five items to be present + .andExpect(jsonPath("$.page.totalElements", is(5))) + .andExpect(jsonPath("$.page.number", is(0))) + + //Verify that the index jumps to the "Python" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item5, + "Python", "1990"), + ItemMatcher.matchItemWithTitleAndDateIssued(item4, + "Java", "1995-05-23"), + ItemMatcher.matchItemWithTitleAndDateIssued(item6, + "Zeta Reticuli", "2018-01-01"), + ItemMatcher.matchItemWithTitleAndDateIssued(item7, + "Moon", "2018-01-02"), + ItemMatcher.matchItemWithTitleAndDateIssued(item3, + "T-800", "2029") + ))); + //** WHEN ** + //An anonymous user browses the items in the Browse by Title endpoint + //with startsWith set to Blade + getClient().perform(get("/api/discover/browses/title/items") + .param("startsWith", "T")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the "T-800" and "Zeta Reticuli" items to be present + .andExpect(jsonPath("$.page.totalElements", is(2))) + .andExpect(jsonPath("$.page.number", is(0))) + + //Verify that the index jumps to the "T-800" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item3, + "T-800", "2029"), + ItemMatcher.matchItemWithTitleAndDateIssued(item6, + "Zeta Reticuli", "2018-01-01") + ))); + // ---- BROWSES BY ENTRIES ---- + + //** WHEN ** + //An anonymous user browses the entries in the Browse by Author endpoint + //with startsWith set to J + getClient().perform(get("/api/discover/browses/author/entries") + .param("startsWith", "J")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the entries "James Cameron" and "James Gosling" to be present + .andExpect(jsonPath("$.page.totalElements", is(2))) + .andExpect(jsonPath("$.page.number", is(0))) + + //Verify that the index filters to the "James'" items. + .andExpect(jsonPath("$._embedded.browseEntries", + contains(BrowseEntryResourceMatcher.matchBrowseEntry("James Cameron", 1), + BrowseEntryResourceMatcher.matchBrowseEntry("James Gosling", 1) + ))); + //** WHEN ** + //An anonymous user browses the entries in the Browse by Subject endpoint + //with startsWith set to C + getClient().perform(get("/api/discover/browses/subject/entries") + .param("startsWith", "C")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the entry "Computing" to be present + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$.page.number", is(0))) + + //Verify that the index filters to the "Computing'" items. + .andExpect(jsonPath("$._embedded.browseEntries", + contains(BrowseEntryResourceMatcher.matchBrowseEntry("Computing", 3) + ))); + } } \ No newline at end of file From cd94bbd0eefb893b6c3a56c3a90f13d1966d0581 Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Fri, 17 Aug 2018 12:15:42 -0500 Subject: [PATCH 014/193] Checkstyle errors fixed Added ITs for startsWith + Scope --- .../app/rest/BrowsesResourceControllerIT.java | 106 +++++++++++++----- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java index 52008b0244..d024de5f7a 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java @@ -7,7 +7,6 @@ */ package org.dspace.app.rest; -import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasItem; @@ -519,49 +518,49 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe //2. 7 public items that are readable by Anonymous Item item1 = ItemBuilder.createItem(context, col1) .withTitle("Alan Turing") - .withAuthor("Alan Mathison Turing") + .withAuthor("Turing, Alan Mathison") .withIssueDate("1912-06-23") .withSubject("Computing") .build(); Item item2 = ItemBuilder.createItem(context, col1) .withTitle("Blade Runner") - .withAuthor("Ridley Scott") + .withAuthor("Scott, Ridley") .withIssueDate("1982-06-25") .withSubject("Science Fiction") .build(); - Item item5 = ItemBuilder.createItem(context, col1) + Item item3 = ItemBuilder.createItem(context, col1) .withTitle("Python") - .withAuthor("Guido van Rossum") + .withAuthor("Van Rossum, Guido") .withIssueDate("1990") .withSubject("Computing") .build(); - Item item4 = ItemBuilder.createItem(context, col1) + Item item4 = ItemBuilder.createItem(context, col2) .withTitle("Java") - .withAuthor("James Gosling") + .withAuthor("Gosling, James") .withIssueDate("1995-05-23") .withSubject("Computing") .build(); - - Item item6 = ItemBuilder.createItem(context, col2) + + Item item5 = ItemBuilder.createItem(context, col2) .withTitle("Zeta Reticuli") .withAuthor("Universe") .withIssueDate("2018-01-01") .withSubject("Astronomy") .build(); - Item item7 = ItemBuilder.createItem(context, col2) + Item item6 = ItemBuilder.createItem(context, col2) .withTitle("Moon") .withAuthor("Universe") .withIssueDate("2018-01-02") .withSubject("Astronomy") .build(); - Item item3 = ItemBuilder.createItem(context, col1) + Item item7 = ItemBuilder.createItem(context, col2) .withTitle("T-800") - .withAuthor("James Cameron") + .withAuthor("Cameron, James") .withIssueDate("2029") .withSubject("Science Fiction") .build(); @@ -586,20 +585,21 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe //Verify that the index jumps to the "Python" item. .andExpect(jsonPath("$._embedded.items", - contains(ItemMatcher.matchItemWithTitleAndDateIssued(item5, + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item3, "Python", "1990"), ItemMatcher.matchItemWithTitleAndDateIssued(item4, "Java", "1995-05-23"), + ItemMatcher.matchItemWithTitleAndDateIssued(item5, + "Zeta Reticuli", + "2018-01-01"), ItemMatcher.matchItemWithTitleAndDateIssued(item6, - "Zeta Reticuli", "2018-01-01"), - ItemMatcher.matchItemWithTitleAndDateIssued(item7, "Moon", "2018-01-02"), - ItemMatcher.matchItemWithTitleAndDateIssued(item3, + ItemMatcher.matchItemWithTitleAndDateIssued(item7, "T-800", "2029") ))); //** WHEN ** //An anonymous user browses the items in the Browse by Title endpoint - //with startsWith set to Blade + //with startsWith set to T getClient().perform(get("/api/discover/browses/title/items") .param("startsWith", "T")) @@ -615,18 +615,18 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe //Verify that the index jumps to the "T-800" item. .andExpect(jsonPath("$._embedded.items", - contains(ItemMatcher.matchItemWithTitleAndDateIssued(item3, + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item7, "T-800", "2029"), - ItemMatcher.matchItemWithTitleAndDateIssued(item6, - "Zeta Reticuli", "2018-01-01") + ItemMatcher.matchItemWithTitleAndDateIssued(item5, + "Zeta Reticuli", + "2018-01-01") ))); - // ---- BROWSES BY ENTRIES ---- - //** WHEN ** - //An anonymous user browses the entries in the Browse by Author endpoint - //with startsWith set to J - getClient().perform(get("/api/discover/browses/author/entries") - .param("startsWith", "J")) + //An anonymous user browses the items in the Browse by Title endpoint + //with startsWith set to Blade and scope set to Col 1 + getClient().perform(get("/api/discover/browses/title/items") + .param("startsWith", "Blade") + .param("scope", col1.getID().toString())) //** THEN ** //The status has to be 200 OK @@ -634,15 +634,63 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe //We expect the content type to be "application/hal+json;charset=UTF-8" .andExpect(content().contentType(contentType)) - //We expect only the entries "James Cameron" and "James Gosling" to be present + //We expect only the "Blade Runner" and "Python" items to be present .andExpect(jsonPath("$.page.totalElements", is(2))) .andExpect(jsonPath("$.page.number", is(0))) + //Verify that the index jumps to the "Blade Runner" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item2, + "Blade Runner", + "1982-06-25"), + ItemMatcher.matchItemWithTitleAndDateIssued(item3, + "Python", "1990") + ))); + + // ---- BROWSES BY ENTRIES ---- + + //** WHEN ** + //An anonymous user browses the entries in the Browse by Author endpoint + //with startsWith set to U + getClient().perform(get("/api/discover/browses/author/entries") + .param("startsWith", "U")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the "Universe" entry to be present + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$.page.number", is(0))) + + //Verify that the index filters to the "Universe" entries and Counts 2 Items. + .andExpect(jsonPath("$._embedded.browseEntries", + contains(BrowseEntryResourceMatcher.matchBrowseEntry("Universe", 2) + ))); + //** WHEN ** + //An anonymous user browses the entries in the Browse by Author endpoint + //with startsWith set to T and scope set to Col 1 + getClient().perform(get("/api/discover/browses/author/entries") + .param("startsWith", "T") + .param("scope", col1.getID().toString())) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the entry "Turing, Alan Mathison" to be present + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$.page.number", is(0))) + //Verify that the index filters to the "James'" items. .andExpect(jsonPath("$._embedded.browseEntries", - contains(BrowseEntryResourceMatcher.matchBrowseEntry("James Cameron", 1), - BrowseEntryResourceMatcher.matchBrowseEntry("James Gosling", 1) + contains(BrowseEntryResourceMatcher.matchBrowseEntry("Turing, Alan Mathison", 1) ))); + //** WHEN ** //An anonymous user browses the entries in the Browse by Subject endpoint //with startsWith set to C From c0f31e889fd1c8eb180159bef354950ae217ace4 Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Fri, 17 Aug 2018 16:01:49 -0500 Subject: [PATCH 015/193] CheckStyle Fixes --- .../org/dspace/app/rest/BrowsesResourceControllerIT.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java index d024de5f7a..02f9b31bc0 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java @@ -590,7 +590,7 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe ItemMatcher.matchItemWithTitleAndDateIssued(item4, "Java", "1995-05-23"), ItemMatcher.matchItemWithTitleAndDateIssued(item5, - "Zeta Reticuli", + "Zeta Reticuli", "2018-01-01"), ItemMatcher.matchItemWithTitleAndDateIssued(item6, "Moon", "2018-01-02"), @@ -618,7 +618,7 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe contains(ItemMatcher.matchItemWithTitleAndDateIssued(item7, "T-800", "2029"), ItemMatcher.matchItemWithTitleAndDateIssued(item5, - "Zeta Reticuli", + "Zeta Reticuli", "2018-01-01") ))); //** WHEN ** @@ -641,7 +641,7 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe //Verify that the index jumps to the "Blade Runner" item. .andExpect(jsonPath("$._embedded.items", contains(ItemMatcher.matchItemWithTitleAndDateIssued(item2, - "Blade Runner", + "Blade Runner", "1982-06-25"), ItemMatcher.matchItemWithTitleAndDateIssued(item3, "Python", "1990") From e16857ce9e9be03f036cadc889d6c6fb89346322 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Fri, 10 Nov 2017 13:32:41 +0100 Subject: [PATCH 016/193] [DS-3741] fixes after cherry-pick --- dspace-api/pom.xml | 8 + .../dao/impl/RequestItemDAOImpl.java | 30 +- .../dao/impl/ResourcePolicyDAOImpl.java | 219 ++++++++++----- .../dao/impl/ChecksumHistoryDAOImpl.java | 23 +- .../dao/impl/ChecksumResultDAOImpl.java | 30 +- .../dao/impl/MostRecentChecksumDAOImpl.java | 195 +++++++++---- .../content/dao/impl/BitstreamDAOImpl.java | 126 +++++---- .../dao/impl/BitstreamFormatDAOImpl.java | 154 ++++++++--- .../content/dao/impl/CollectionDAOImpl.java | 224 +++++++++------ .../content/dao/impl/CommunityDAOImpl.java | 90 ++++-- .../dspace/content/dao/impl/ItemDAOImpl.java | 232 ++++++++-------- .../dao/impl/MetadataFieldDAOImpl.java | 133 +++++---- .../dao/impl/MetadataSchemaDAOImpl.java | 93 ++++--- .../dao/impl/MetadataValueDAOImpl.java | 64 +++-- .../dspace/content/dao/impl/SiteDAOImpl.java | 29 +- .../dao/impl/WorkspaceItemDAOImpl.java | 165 ++++++++--- .../org/dspace/core/AbstractHibernateDAO.java | 261 ++++++++---------- .../dspace/core/AbstractHibernateDSODAO.java | 56 ++-- .../eperson/dao/impl/EPersonDAOImpl.java | 88 ++++-- .../dao/impl/Group2GroupCacheDAOImpl.java | 100 +++++-- .../dspace/eperson/dao/impl/GroupDAOImpl.java | 98 +++---- .../dao/impl/RegistrationDataDAOImpl.java | 44 ++- .../eperson/dao/impl/SubscriptionDAOImpl.java | 78 ++++-- .../dspace/handle/dao/impl/HandleDAOImpl.java | 107 ++++--- .../dao/impl/HarvestedCollectionDAOImpl.java | 250 +++++++++++------ .../dao/impl/HarvestedItemDAOImpl.java | 64 +++-- .../identifier/dao/impl/DOIDAOImpl.java | 197 +++++++++---- .../versioning/dao/impl/VersionDAOImpl.java | 72 +++-- .../dao/impl/VersionHistoryDAOImpl.java | 51 +++- .../dao/impl/BasicWorkflowItemDAOImpl.java | 92 ++++-- .../dao/impl/TaskListItemDAOImpl.java | 33 ++- .../dao/impl/ClaimedTaskDAOImpl.java | 184 ++++++++---- .../dao/impl/CollectionRoleDAOImpl.java | 65 +++-- .../dao/impl/InProgressUserDAOImpl.java | 136 ++++++--- .../dao/impl/PoolTaskDAOImpl.java | 125 ++++++--- .../dao/impl/WorkflowItemRoleDAOImpl.java | 81 ++++-- .../dao/impl/XmlWorkflowItemDAOImpl.java | 130 ++++++--- .../dao/impl/ChecksumHistoryDAOImplTest.java | 32 +-- dspace/config/hibernate.cfg.xml | 2 +- pom.xml | 6 + 40 files changed, 2709 insertions(+), 1458 deletions(-) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 11cf2a3a5b..fb6a90d965 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -51,6 +51,10 @@ true true + + org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + + @@ -308,6 +312,10 @@ org.hibernate hibernate-ehcache + + org.hibernate + hibernate-jpamodelgen + org.hibernate hibernate-validator-cdi diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java index 5d9cb1f666..cd4aeb2db9 100644 --- a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java @@ -7,15 +7,20 @@ */ package org.dspace.app.requestitem.dao.impl; -import java.sql.SQLException; - import org.dspace.app.requestitem.RequestItem; +import org.dspace.app.requestitem.RequestItem_; import org.dspace.app.requestitem.dao.RequestItemDAO; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.xmlworkflow.storedcomponents.InProgressUser; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; + /** * Hibernate implementation of the Database Access Object interface class for the RequestItem object. * This class is responsible for all database calls for the RequestItem object and is autowired by spring @@ -23,16 +28,25 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class RequestItemDAOImpl extends AbstractHibernateDAO implements RequestItemDAO { - protected RequestItemDAOImpl() { +public class RequestItemDAOImpl extends AbstractHibernateDAO implements RequestItemDAO +{ + protected RequestItemDAOImpl() + { super(); } @Override public RequestItem findByToken(Context context, String token) throws SQLException { - Criteria criteria = createCriteria(context, RequestItem.class); - criteria.add(Restrictions.eq("token", token)); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, RequestItem.class); +// criteria.add(Restrictions.eq("token", token)); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, RequestItem.class); + Root requestItemRoot = criteriaQuery.from(RequestItem.class); + criteriaQuery.select(requestItemRoot); + criteriaQuery.where(criteriaBuilder.equal(requestItemRoot.get(RequestItem_.token), token)); + return uniqueResult(context, criteriaQuery, false, RequestItem.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java index 22095fa0b1..ca873b5119 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java @@ -7,19 +7,23 @@ */ package org.dspace.authorize.dao.impl; -import java.sql.SQLException; -import java.util.List; - import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.ResourcePolicy_; import org.dspace.authorize.dao.ResourcePolicyDAO; +import org.dspace.content.Community; import org.dspace.content.DSpaceObject; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.criterion.Restrictions; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the ResourcePolicy object. @@ -28,91 +32,166 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class ResourcePolicyDAOImpl extends AbstractHibernateDAO implements ResourcePolicyDAO { +public class ResourcePolicyDAOImpl extends AbstractHibernateDAO implements ResourcePolicyDAO +{ - protected ResourcePolicyDAOImpl() { + protected ResourcePolicyDAOImpl() + { super(); } @Override public List findByDso(Context context, DSpaceObject dso) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso) - )); - return list(criteria); +// Criteria criteria = createCriteria(context, ResourcePolicy.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("dSpaceObject", dso) +// )); +// return list(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso)); + return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override - public List findByDsoAndType(Context context, DSpaceObject dso, String type) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - Restrictions.eq("rptype", type) - )); - return list(criteria); + public List findByDsoAndType(Context context, DSpaceObject dso, String type) throws SQLException + { +// Criteria criteria = createCriteria(context, ResourcePolicy.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("dSpaceObject", dso), +// Restrictions.eq("rptype", type) +// )); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.rptype), type) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override public List findByGroup(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.eq("epersonGroup", group)); - return list(criteria); +// Criteria criteria = createCriteria(context, ResourcePolicy.class); +// criteria.add(Restrictions.eq("epersonGroup", group)); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group)); + return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override - public List findByDSoAndAction(Context context, DSpaceObject dso, int actionId) - throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - Restrictions.eq("actionId", actionId) - )); - return list(criteria); + public List findByDSoAndAction(Context context, DSpaceObject dso, int actionId) throws SQLException + { +// Criteria criteria = createCriteria(context, ResourcePolicy.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("dSpaceObject", dso), +// Restrictions.eq("actionId", actionId) +// )); +// return list(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), actionId) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override - public List findByTypeGroupAction(Context context, DSpaceObject dso, Group group, int action) - throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - Restrictions.eq("epersonGroup", group), - Restrictions.eq("actionId", action) - )); - criteria.setMaxResults(1); - return list(criteria); + public List findByTypeGroupAction(Context context, DSpaceObject dso, Group group, int action) throws SQLException { +// Criteria criteria = createCriteria(context, ResourcePolicy.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("dSpaceObject", dso), +// Restrictions.eq("epersonGroup", group), +// Restrictions.eq("actionId", action) +// )); +// criteria.setMaxResults(1); +// return list(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); } + + @Override + public List findByTypeGroupActionExceptId(Context context, DSpaceObject dso, Group group, int action, int notPolicyID) throws SQLException { +// Criteria criteria = createCriteria(context, ResourcePolicy.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("dSpaceObject", dso), +// Restrictions.eq("epersonGroup", group), +// Restrictions.eq("actionId", action) +// )); +// criteria.add(Restrictions.and(Restrictions.not(Restrictions.eq("id", notPolicyID)))); +// return list(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action), + criteriaBuilder.notEqual(resourcePolicyRoot.get(ResourcePolicy_.id), notPolicyID) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); + } + + public List findByEPersonGroupTypeIdAction(Context context, EPerson e, List groups, int action, int type_id) throws SQLException + { +// Criteria criteria = createCriteria(context, ResourcePolicy.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("resourceTypeId", type_id), +// Restrictions.eq("actionId", action), +// (Restrictions.or( +// Restrictions.eq("eperson", e), +// Restrictions.in("epersonGroup", groups) +// )) +// )); +// return list(criteria); +// +// + //TODO Make sure you double check this + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.and( criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.resourceTypeId), type_id), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action), + criteriaBuilder.or( criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.eperson), e), + criteriaBuilder.in(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups))))); + return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); + } @Override - public List findByTypeGroupActionExceptId(Context context, DSpaceObject dso, Group group, - int action, int notPolicyID) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - Restrictions.eq("epersonGroup", group), - Restrictions.eq("actionId", action) - )); - criteria.add(Restrictions.and(Restrictions.not(Restrictions.eq("id", notPolicyID)))); - return list(criteria); - } - - public List findByEPersonGroupTypeIdAction(Context context, EPerson e, List groups, - int action, int type_id) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("resourceTypeId", type_id), - Restrictions.eq("actionId", action), - (Restrictions.or( - Restrictions.eq("eperson", e), - Restrictions.in("epersonGroup", groups) - )) - )); - return list(criteria); - } - - @Override - public void deleteByDso(Context context, DSpaceObject dso) throws SQLException { + public void deleteByDso(Context context, DSpaceObject dso) throws SQLException + { String queryString = "delete from ResourcePolicy where dSpaceObject= :dSpaceObject"; Query query = createQuery(context, queryString); query.setParameter("dSpaceObject", dso); @@ -124,7 +203,7 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO String queryString = "delete from ResourcePolicy where dSpaceObject= :dSpaceObject AND actionId= :actionId"; Query query = createQuery(context, queryString); query.setParameter("dSpaceObject", dso); - query.setInteger("actionId", actionId); + query.setParameter("actionId", actionId); query.executeUpdate(); } @@ -133,7 +212,7 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO String queryString = "delete from ResourcePolicy where dSpaceObject.id = :dsoId AND rptype = :rptype"; Query query = createQuery(context, queryString); query.setParameter("dsoId", dso.getID()); - query.setString("rptype", type); + query.setParameter("rptype", type); query.executeUpdate(); } diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java index 753bb6267d..4c93522ab9 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java @@ -14,9 +14,9 @@ import org.dspace.checker.ChecksumHistory; import org.dspace.checker.ChecksumResultCode; import org.dspace.checker.dao.ChecksumHistoryDAO; import org.dspace.content.Bitstream; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Query; +import org.dspace.core.AbstractHibernateDAO; +import javax.persistence.Query; /** *

@@ -24,25 +24,28 @@ import org.hibernate.Query; * update,insert and delete database operations should go through this class for * checksum history operations. *

- * + * * @author Jim Downing * @author Grace Carpenter * @author Nathan Sarr * @author kevinvandevelde at atmire.com + * + * */ -public class ChecksumHistoryDAOImpl extends AbstractHibernateDAO implements ChecksumHistoryDAO { +public class ChecksumHistoryDAOImpl extends AbstractHibernateDAO implements ChecksumHistoryDAO +{ - protected ChecksumHistoryDAOImpl() { + protected ChecksumHistoryDAOImpl() + { super(); } @Override - public int deleteByDateAndCode(Context context, Date retentionDate, ChecksumResultCode resultCode) - throws SQLException { - String hql = "delete from ChecksumHistory where processEndDate < :processEndDate AND checksumResult" + - ".resultCode=:resultCode"; + public int deleteByDateAndCode(Context context, Date retentionDate, ChecksumResultCode resultCode) throws SQLException { + String hql = "delete from ChecksumHistory where processEndDate < :processEndDate AND checksumResult.resultCode=:resultCode"; Query query = createQuery(context, hql); - query.setTimestamp("processEndDate", retentionDate); + //TODO RAF WRITE +// query.setTimestamp("processEndDate", retentionDate); query.setParameter("resultCode", resultCode); return query.executeUpdate(); } diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java index de4b32e0c4..d406982134 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java @@ -7,16 +7,21 @@ */ package org.dspace.checker.dao.impl; -import java.sql.SQLException; - import org.dspace.checker.ChecksumResult; import org.dspace.checker.ChecksumResultCode; +import org.dspace.checker.ChecksumResult_; import org.dspace.checker.dao.ChecksumResultDAO; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.handle.Handle; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; + /** * Hibernate implementation of the Database Access Object interface class for the ChecksumResult object. * This class is responsible for all database calls for the ChecksumResult object and is autowired by spring @@ -24,16 +29,25 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class ChecksumResultDAOImpl extends AbstractHibernateDAO implements ChecksumResultDAO { +public class ChecksumResultDAOImpl extends AbstractHibernateDAO implements ChecksumResultDAO +{ - protected ChecksumResultDAOImpl() { + protected ChecksumResultDAOImpl() + { super(); } @Override public ChecksumResult findByCode(Context context, ChecksumResultCode code) throws SQLException { - Criteria criteria = createCriteria(context, ChecksumResult.class); - criteria.add(Restrictions.eq("resultCode", code)); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, ChecksumResult.class); +// criteria.add(Restrictions.eq("resultCode", code)); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ChecksumResult.class); + Root checksumResultRoot = criteriaQuery.from(ChecksumResult.class); + criteriaQuery.select(checksumResultRoot); + criteriaQuery.where(criteriaBuilder.equal(checksumResultRoot.get(ChecksumResult_.resultCode), code)); + return uniqueResult(context, criteriaQuery, false, ChecksumResult.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java index 9ed89c40e9..e2ed4c79df 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java @@ -7,24 +7,26 @@ */ package org.dspace.checker.dao.impl; -import java.sql.SQLException; -import java.util.Date; -import java.util.List; - import org.dspace.checker.ChecksumHistory; import org.dspace.checker.ChecksumResultCode; import org.dspace.checker.MostRecentChecksum; +import org.dspace.checker.MostRecentChecksum_; import org.dspace.checker.dao.MostRecentChecksumDAO; import org.dspace.content.Bitstream; -import org.dspace.core.AbstractHibernateDAO; +import org.dspace.content.BitstreamFormat; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.DetachedCriteria; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Projections; -import org.hibernate.criterion.Property; -import org.hibernate.criterion.Restrictions; +import javax.persistence.Query; +import org.hibernate.criterion.*; +import javax.persistence.criteria.Order; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the MostRecentChecksum object. @@ -33,16 +35,16 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO - implements MostRecentChecksumDAO { - protected MostRecentChecksumDAOImpl() { +public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO implements MostRecentChecksumDAO +{ + protected MostRecentChecksumDAOImpl() + { super(); } @Override - public List findByNotProcessedInDateRange(Context context, Date startDate, Date endDate) - throws SQLException { + public List findByNotProcessedInDateRange(Context context, Date startDate, Date endDate) throws SQLException { // + "most_recent_checksum.last_process_start_date, most_recent_checksum.last_process_end_date, " // + "most_recent_checksum.expected_checksum, most_recent_checksum.current_checksum, " // + "result_description " @@ -53,30 +55,51 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), false), + criteriaBuilder.lessThanOrEqualTo(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), endDate) + ) + ); + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get("bitstream.id"))); + criteriaQuery.orderBy(orderList); + return list(context, criteriaQuery, false, MostRecentChecksum.class, -1, -1); } @Override public MostRecentChecksum findByBitstream(Context context, Bitstream bitstream) throws SQLException { - Criteria criteria = createCriteria(context, MostRecentChecksum.class); - criteria.add(Restrictions.eq("bitstream", bitstream)); - return singleResult(criteria); +// Criteria criteria = createCriteria(context, MostRecentChecksum.class); +// criteria.add(Restrictions.eq("bitstream", bitstream)); +// return singleResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream), bitstream)); + return singleResult(context, criteriaQuery); } @Override - public List findByResultTypeInDateRange(Context context, Date startDate, Date endDate, - ChecksumResultCode resultCode) throws SQLException { + public List findByResultTypeInDateRange(Context context, Date startDate, Date endDate, ChecksumResultCode resultCode) throws SQLException { // "select bitstream_id, last_process_start_date, last_process_end_date, " // + "expected_checksum, current_checksum, result_description " // + "from most_recent_checksum, checksum_results " @@ -85,21 +108,37 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO= ? " // + "and most_recent_checksum.last_process_start_date < ? " // + "order by bitstream_id"; - Criteria criteria = createCriteria(context, MostRecentChecksum.class); - criteria.add( - Restrictions.and( - Restrictions.eq("checksumResult.resultCode", resultCode), - Restrictions.le("processStartDate", startDate), - Restrictions.gt("processStartDate", endDate) - ) - ); - criteria.addOrder(Order.asc("bitstream.id")); - return list(criteria); +// Criteria criteria = createCriteria(context, MostRecentChecksum.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("checksumResult.resultCode", resultCode), +// Restrictions.le("processStartDate", startDate), +// Restrictions.gt("processStartDate", endDate) +// ) +// ); +// criteria.addOrder(Order.asc("bitstream.id")); +// return list(criteria); +// + //TODO RAF CHECK + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get("checksumResult.resultCode"), resultCode), + criteriaBuilder.lessThanOrEqualTo(mostRecentChecksumRoot.get("processStartDate"), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get("processStartDate"), endDate) + ) + ); + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get("bitstream.id"))); + criteriaQuery.orderBy(orderList); + return list(context, criteriaQuery, false, MostRecentChecksum.class, -1, -1); } @Override - public void deleteByBitstream(Context context, Bitstream bitstream) throws SQLException { + public void deleteByBitstream(Context context, Bitstream bitstream) throws SQLException + { String hql = "delete from MostRecentChecksum WHERE bitstream=:bitstream"; Query query = createQuery(context, hql); query.setParameter("bitstream", bitstream); @@ -112,11 +151,24 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), true)); + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get("bitstream.id"))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.processEndDate))); + criteriaQuery.orderBy(orderList); + return singleResult(context, criteriaQuery); } @Override @@ -127,23 +179,44 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), true), + criteriaBuilder.lessThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), lessThanDate) + ) + ); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.processEndDate))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get("bitstream.id"))); + criteriaQuery.orderBy(orderList); + + return singleResult(context, criteriaQuery); } @Override public List findNotInHistory(Context context) throws SQLException { - Criteria criteria = createCriteria(context, MostRecentChecksum.class); - DetachedCriteria subCriteria = DetachedCriteria.forClass(ChecksumHistory.class); - subCriteria.setProjection(Projections.property("bitstream.id")); - criteria.add(Property.forName("bitstreamId").notIn(subCriteria)); - return list(criteria); + + //TODO RAF WRITE +// Criteria criteria = createCriteria(context, MostRecentChecksum.class); +// DetachedCriteria subCriteria = DetachedCriteria.forClass(ChecksumHistory.class); +// subCriteria.setProjection(Projections.property("bitstream.id")); +// criteria.add(Property.forName("bitstreamId").notIn(subCriteria)); +// return list(criteria); + return null; } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java index fff7c42206..8868908754 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java @@ -7,21 +7,18 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; -import java.util.Iterator; -import java.util.List; - -import org.dspace.content.Bitstream; +import org.dspace.content.*; import org.dspace.content.Collection; -import org.dspace.content.Community; -import org.dspace.content.Item; import org.dspace.content.dao.BitstreamDAO; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Constants; import org.dspace.core.Context; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.*; /** * Hibernate implementation of the Database Access Object interface class for the Bitstream object. @@ -30,30 +27,45 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class BitstreamDAOImpl extends AbstractHibernateDSODAO implements BitstreamDAO { +public class BitstreamDAOImpl extends AbstractHibernateDSODAO implements BitstreamDAO +{ - protected BitstreamDAOImpl() { + protected BitstreamDAOImpl() + { super(); } @Override public List findDeletedBitstreams(Context context) throws SQLException { - Criteria criteria = createCriteria(context, Bitstream.class); - criteria.add(Restrictions.eq("deleted", true)); - - return list(criteria); +// Criteria criteria = createCriteria(context, Bitstream.class); +// criteria.add(Restrictions.eq("deleted", true)); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Bitstream.class); + Root bitstreamRoot = criteriaQuery.from(Bitstream.class); + criteriaQuery.select(bitstreamRoot); + criteriaQuery.where(criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.deleted), true)); + return list(context, criteriaQuery, false, Bitstream.class, -1, -1); } @Override public List findDuplicateInternalIdentifier(Context context, Bitstream bitstream) throws SQLException { - Criteria criteria = createCriteria(context, Bitstream.class); - criteria.add(Restrictions.and( - Restrictions.eq("internalId", bitstream.getInternalId()), - Restrictions.not(Restrictions.eq("id", bitstream.getID())) - )); - - return list(criteria); +// Criteria criteria = createCriteria(context, Bitstream.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("internalId", bitstream.getInternalId()), +// Restrictions.not(Restrictions.eq("id", bitstream.getID())) +// )); +// +// return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Bitstream.class); + Root bitstreamRoot = criteriaQuery.from(Bitstream.class); + criteriaQuery.select(bitstreamRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.internalId), bitstream.getInternalId()), + criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.id), bitstream.getID()) + ) + ); + return list(context, criteriaQuery, false, Bitstream.class, -1, -1); } @Override @@ -68,20 +80,18 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme // + "where not exists( select 'x' from most_recent_checksum " // + "where most_recent_checksum.bitstream_id = bitstream.bitstream_id )" - Query query = createQuery(context, - "select b from Bitstream b where b not in (select c.bitstream from " + - "MostRecentChecksum c)"); - return query.list(); + Query query = createQuery(context, "select b from Bitstream b where b not in (select c.bitstream from MostRecentChecksum c)"); + return query.getResultList(); } @Override public Iterator findByCommunity(Context context, Community community) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + - "join b.bundles bitBundles " + - "join bitBundles.items item " + - "join item.collections itemColl " + - "join itemColl.communities community " + - "WHERE :community IN community"); + "join b.bundles bitBundles " + + "join bitBundles.items item " + + "join item.collections itemColl " + + "join itemColl.communities community " + + "WHERE :community IN community"); query.setParameter("community", community); @@ -91,10 +101,10 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Iterator findByCollection(Context context, Collection collection) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + - "join b.bundles bitBundles " + - "join bitBundles.items item " + - "join item.collections c " + - "WHERE :collection IN c"); + "join b.bundles bitBundles " + + "join bitBundles.items item " + + "join item.collections c " + + "WHERE :collection IN c"); query.setParameter("collection", collection); @@ -104,9 +114,9 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Iterator findByItem(Context context, Item item) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + - "join b.bundles bitBundles " + - "join bitBundles.items item " + - "WHERE :item IN item"); + "join b.bundles bitBundles " + + "join bitBundles.items item " + + "WHERE :item IN item"); query.setParameter("item", item); @@ -122,9 +132,17 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Long countByStoreNumber(Context context, Integer storeNumber) throws SQLException { - Criteria criteria = createCriteria(context, Bitstream.class); - criteria.add(Restrictions.eq("storeNumber", storeNumber)); - return countLong(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, Bitstream.class); +// criteria.add(Restrictions.eq("storeNumber", storeNumber)); +// return countLong(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root bitstreamRoot = criteriaQuery.from(Bitstream.class); + criteriaQuery.where(criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.storeNumber), storeNumber)); + return countLong(context, criteriaQuery, criteriaBuilder, bitstreamRoot); } @Override @@ -139,28 +157,26 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public int countWithNoPolicy(Context context) throws SQLException { - Query query = createQuery(context, - "SELECT count(bit.id) from Bitstream bit where bit.deleted<>true and bit.id not in" + - " (select res.dSpaceObject from ResourcePolicy res where res.resourceTypeId = " + - ":typeId )"); + Query query = createQuery(context,"SELECT count(bit.id) from Bitstream bit where bit.deleted<>true and bit.id not in" + + " (select res.dSpaceObject from ResourcePolicy res where res.resourceTypeId = :typeId )" ); query.setParameter("typeId", Constants.BITSTREAM); return count(query); } @Override public List getNotReferencedBitstreams(Context context) throws SQLException { - return list(createQuery(context, "select bit from Bitstream bit where bit.deleted != true" + - " and bit.id not in (select bit2.id from Bundle bun join bun.bitstreams bit2)" + - " and bit.id not in (select com.logo.id from Community com)" + - " and bit.id not in (select col.logo.id from Collection col)" + - " and bit.id not in (select bun.primaryBitstream.id from Bundle bun)")); + return list(createQuery(context,"select bit from Bitstream bit where bit.deleted != true" + + " and bit.id not in (select bit2.id from Bundle bun join bun.bitstreams bit2)" + + " and bit.id not in (select com.logo.id from Community com)" + + " and bit.id not in (select col.logo.id from Collection col)" + + " and bit.id not in (select bun.primaryBitstream.id from Bundle bun)")); } @Override public Iterator findAll(Context context, int limit, int offset) throws SQLException { - Query query = createQuery(context, "select b FROM Bitstream b"); - query.setFirstResult(offset); - query.setMaxResults(limit); - return iterate(query); + Map map = new HashMap<>(); +// map.put("sizeBytes", 12); + return findByX(context, Bitstream.class, map, true, limit, offset).iterator(); + } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java index 51b0af51de..e50e012a02 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java @@ -7,18 +7,24 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; -import java.util.List; - import org.dspace.content.BitstreamFormat; +import org.dspace.content.BitstreamFormat_; import org.dspace.content.dao.BitstreamFormatDAO; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.harvest.HarvestedItem; +import javax.persistence.Query; import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the BitstreamFormat object. * This class is responsible for all database calls for the BitstreamFormat object and is autowired by spring @@ -26,9 +32,11 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class BitstreamFormatDAOImpl extends AbstractHibernateDAO implements BitstreamFormatDAO { +public class BitstreamFormatDAOImpl extends AbstractHibernateDAO implements BitstreamFormatDAO +{ - protected BitstreamFormatDAOImpl() { + protected BitstreamFormatDAOImpl() + { super(); } @@ -37,54 +45,76 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAOnull if - * there's no bitstream format with the given MIMEtype. + * there's no bitstream format with the given MIMEtype. * @throws SQLException if database error */ @Override - public BitstreamFormat findByMIMEType(Context context, String mimeType, boolean includeInternal) - throws SQLException { + public BitstreamFormat findByMIMEType(Context context, String mimeType, boolean includeInternal) throws SQLException + { // NOTE: Avoid internal formats since e.g. "License" also has // a MIMEtype of text/plain. - Criteria criteria = createCriteria(context, BitstreamFormat.class); - criteria.add(Restrictions.and( - Restrictions.eq("internal", includeInternal), - Restrictions.like("mimetype", mimeType) - )); - - return singleResult(criteria); +// Criteria criteria = createCriteria(context, BitstreamFormat.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("internal", includeInternal), +// Restrictions.like("mimetype", mimeType) +// )); +// +// return singleResult(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); + Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); + criteriaQuery.select(bitstreamFormatRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.internal), includeInternal), + criteriaBuilder.like(bitstreamFormatRoot.get(BitstreamFormat_.mimetype), mimeType) + ) + ); + return singleResult(context, criteriaQuery); } /** * Find a bitstream format by its (unique) short description * - * @param context DSpace context object - * @param desc the short description + * @param context + * DSpace context object + * @param desc + * the short description + * * @return the corresponding bitstream format, or null if - * there's no bitstream format with the given short description + * there's no bitstream format with the given short description * @throws SQLException if database error */ @Override public BitstreamFormat findByShortDescription(Context context, - String desc) throws SQLException { - Criteria criteria = createCriteria(context, BitstreamFormat.class); - criteria.add(Restrictions.and( - Restrictions.eq("shortDescription", desc) - )); - - return uniqueResult(criteria); + String desc) throws SQLException + { +// Criteria criteria = createCriteria(context, BitstreamFormat.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("shortDescription", desc) +// )); +// +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); + Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); + criteriaQuery.select(bitstreamFormatRoot); + criteriaQuery.where(criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription), desc)); + return uniqueResult(context, criteriaQuery, false, BitstreamFormat.class, -1, -1); } @Override - public int updateRemovedBitstreamFormat(Context context, BitstreamFormat deletedBitstreamFormat, - BitstreamFormat newBitstreamFormat) throws SQLException { + public int updateRemovedBitstreamFormat(Context context, BitstreamFormat deletedBitstreamFormat, BitstreamFormat newBitstreamFormat) throws SQLException { // Set bitstreams with this format to "unknown" - Query query = createQuery(context, - "update Bitstream set bitstreamFormat = :unknown_format where bitstreamFormat = " + - ":deleted_format"); + Query query = createQuery(context, "update Bitstream set bitstreamFormat = :unknown_format where bitstreamFormat = :deleted_format"); query.setParameter("unknown_format", newBitstreamFormat); query.setParameter("deleted_format", deletedBitstreamFormat); @@ -93,14 +123,36 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO findNonInternal(Context context) throws SQLException { - Criteria criteria = createCriteria(context, BitstreamFormat.class); - criteria.add(Restrictions.and( - Restrictions.eq("internal", false), - Restrictions.not(Restrictions.like("shortDescription", "Unknown")) - )); - criteria.addOrder(Order.desc("supportLevel")).addOrder(Order.asc("shortDescription")); - return list(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, BitstreamFormat.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("internal", false), +// Restrictions.not(Restrictions.like("shortDescription", "Unknown")) +// )); +// criteria.addOrder(Order.desc("supportLevel")).addOrder(Order.asc("shortDescription")); +// +// return list(criteria); + + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); + Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); + criteriaQuery.select(bitstreamFormatRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.internal), false), + criteriaBuilder.not( + criteriaBuilder.like(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription), "Unknown")) + ) + ); + + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.desc(bitstreamFormatRoot.get(BitstreamFormat_.supportLevel))); + orderList.add(criteriaBuilder.asc(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, BitstreamFormat.class, -1, -1); } @@ -118,9 +170,23 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO findAll(Context context, Class clazz) throws SQLException { - Criteria criteria = createCriteria(context, BitstreamFormat.class); - criteria.addOrder(Order.asc("id")); - return list(criteria); + + //TODO RAF CHECK + +// Criteria criteria = createCriteria(context, BitstreamFormat.class); +// criteria.addOrder(Order.asc("id")); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); + Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); + criteriaQuery.select(bitstreamFormatRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(bitstreamFormatRoot.get(BitstreamFormat_.id))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, false, BitstreamFormat.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java index 14b1587315..2d6656527c 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java @@ -7,26 +7,32 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - +import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.ResourcePolicy_; +import org.dspace.checker.ChecksumResult; import org.dspace.content.Collection; +import org.dspace.content.Collection_; import org.dspace.content.Item; import org.dspace.content.MetadataField; import org.dspace.content.dao.CollectionDAO; -import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Constants; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.hibernate.Criteria; -import org.hibernate.Query; +import javax.persistence.Query; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.Restrictions; import org.hibernate.transform.BasicTransformerAdapter; +import javax.persistence.criteria.*; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + /** * Hibernate implementation of the Database Access Object interface class for the Collection object. * This class is responsible for all database calls for the Collection object and is autowired by spring @@ -34,8 +40,10 @@ import org.hibernate.transform.BasicTransformerAdapter; * * @author kevinvandevelde at atmire.com */ -public class CollectionDAOImpl extends AbstractHibernateDSODAO implements CollectionDAO { - protected CollectionDAOImpl() { +public class CollectionDAOImpl extends AbstractHibernateDSODAO implements CollectionDAO +{ + protected CollectionDAOImpl() + { super(); } @@ -43,30 +51,31 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple * Get all collections in the system. These are alphabetically sorted by * collection name. * - * @param context DSpace context object - * @param order order by MetadataField + * @param context + * DSpace context object + * @param order order by MetadataField * @return the collections in the system * @throws SQLException if database error */ @Override - public List findAll(Context context, MetadataField order) throws SQLException { + public List findAll(Context context, MetadataField order) throws SQLException + { return findAll(context, order, null, null); } @Override - public List findAll(Context context, MetadataField order, Integer limit, Integer offset) - throws SQLException { + public List findAll(Context context, MetadataField order, Integer limit, Integer offset) throws SQLException { StringBuilder query = new StringBuilder(); - query.append("SELECT ").append(Collection.class.getSimpleName()).append(" FROM Collection as ") - .append(Collection.class.getSimpleName()).append(" "); + query.append("SELECT ").append(Collection.class.getSimpleName()).append(" FROM Collection as ").append(Collection.class.getSimpleName()).append(" "); addMetadataLeftJoin(query, Collection.class.getSimpleName(), Arrays.asList(order)); addMetadataSortQuery(query, Arrays.asList(order), null); Query hibernateQuery = createQuery(context, query.toString()); - if (offset != null) { + if(offset != null) + { hibernateQuery.setFirstResult(offset); } - if (limit != null) { + if(limit != null){ hibernateQuery.setMaxResults(limit); } hibernateQuery.setParameter(order.toString(), order.getID()); @@ -75,29 +84,51 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple @Override public Collection findByTemplateItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, Collection.class); - criteria.add(Restrictions.eq("template_item", item)); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, Collection.class); +// criteria.add(Restrictions.eq("template_item", item)); +// return uniqueResult(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); + Root collectionRoot = criteriaQuery.from(Collection.class); + //TODO Used to be template_item, may be wrong + criteriaQuery.select(collectionRoot); + criteriaQuery.where(criteriaBuilder.equal(collectionRoot.get(Collection_.template), item)); + return uniqueResult(context, criteriaQuery, false, Collection.class, -1, -1); } @Override public Collection findByGroup(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, Collection.class); - criteria.add( - Restrictions.or( - Restrictions.eq("workflowStep1", group), - Restrictions.eq("workflowStep2", group), - Restrictions.eq("workflowStep3", group), - Restrictions.eq("submitters", group), - Restrictions.eq("admins", group) - ) - ); - return singleResult(criteria); +// Criteria criteria = createCriteria(context, Collection.class); +// criteria.add( +// Restrictions.or( +// Restrictions.eq("workflowStep1", group), +// Restrictions.eq("workflowStep2", group), +// Restrictions.eq("workflowStep3", group), +// Restrictions.eq("submitters", group), +// Restrictions.eq("admins", group) +// ) +// ); +// return singleResult(criteria); + + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); + Root collectionRoot = criteriaQuery.from(Collection.class); + criteriaQuery.select(collectionRoot); + criteriaQuery.where(criteriaBuilder.or(criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep1), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep2), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep3), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.submitters), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.admins), group) + ) + ); + return singleResult(context, criteriaQuery); } @Override - public List findAuthorized(Context context, EPerson ePerson, List actions) - throws SQLException { + public List findAuthorized(Context context, EPerson ePerson, List actions) throws SQLException { + //TODO RAF CHECK // TableRowIterator tri = DatabaseManager.query(context, // "SELECT * FROM collection, resourcepolicy, eperson " + // "WHERE resourcepolicy.resource_id = collection.collection_id AND " + @@ -106,64 +137,79 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple // "( resourcepolicy.action_id = 3 OR resourcepolicy.action_id = 11 ) AND "+ // "eperson.eperson_id = ?", context.getCurrentUser().getID()); - Criteria criteria = createCriteria(context, Collection.class); - criteria.createAlias("resourcePolicies", "resourcePolicy"); +// Criteria criteria = createCriteria(context, Collection.class); +// criteria.createAlias("resourcePolicies", "resourcePolicy"); +// +// Disjunction actionQuery = Restrictions.or(); +// for (Integer action : actions) +// { +// actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); +// } +// criteria.add(Restrictions.and( +// Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COLLECTION), +// Restrictions.eq("resourcePolicy.eperson", ePerson), +// actionQuery +// )); +// criteria.setCacheable(true); +// +// return list(criteria); - Disjunction actionQuery = Restrictions.or(); - for (Integer action : actions) { - actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); + Root collectionRoot = criteriaQuery.from(Collection.class); + Join join = collectionRoot.join("resourcePolicies"); + List orPredicates = new LinkedList(); + for(Integer action : actions){ + orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } - criteria.add(Restrictions.and( - Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COLLECTION), - Restrictions.eq("resourcePolicy.eperson", ePerson), - actionQuery - )); - criteria.setCacheable(true); - - return list(criteria); + Predicate orPredicate = criteriaBuilder.and(orPredicates.toArray(new Predicate[]{})); + criteriaQuery.select(collectionRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), + criteriaBuilder.equal(join.get(ResourcePolicy_.eperson), ePerson), + orPredicate)); + return list(context, criteriaQuery, true, Collection.class, -1, -1); } @Override - public List findAuthorizedByGroup(Context context, EPerson ePerson, List actions) - throws SQLException { - // TableRowIterator tri = DatabaseManager.query(context, - // "SELECT \n" + - // " * \n" + - // "FROM \n" + - // " public.eperson, \n" + - // " public.epersongroup2eperson, \n" + - // " public.epersongroup, \n" + - // " public.group2group, \n" + - // " public.resourcepolicy rp_parent, \n" + - // " public.collection\n" + - // "WHERE \n" + - // " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + - // " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + - // " group2group.child_id = epersongroup.eperson_group_id AND\n" + - // " rp_parent.epersongroup_id = group2group.parent_id AND\n" + - // " collection.collection_id = rp_parent.resource_id AND\n" + - // " eperson.eperson_id = ? AND \n" + - // " (rp_parent.action_id = 3 OR \n" + - // " rp_parent.action_id = 11 \n" + - // " ) AND rp_parent.resource_type_id = 3;", context.getCurrentUser().getID()); + public List findAuthorizedByGroup(Context context, EPerson ePerson, List actions) throws SQLException { + // TableRowIterator tri = DatabaseManager.query(context, + // "SELECT \n" + + // " * \n" + + // "FROM \n" + + // " public.eperson, \n" + + // " public.epersongroup2eperson, \n" + + // " public.epersongroup, \n" + + // " public.group2group, \n" + + // " public.resourcepolicy rp_parent, \n" + + // " public.collection\n" + + // "WHERE \n" + + // " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + + // " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + + // " group2group.child_id = epersongroup.eperson_group_id AND\n" + + // " rp_parent.epersongroup_id = group2group.parent_id AND\n" + + // " collection.collection_id = rp_parent.resource_id AND\n" + + // " eperson.eperson_id = ? AND \n" + + // " (rp_parent.action_id = 3 OR \n" + + // " rp_parent.action_id = 11 \n" + + // " ) AND rp_parent.resource_type_id = 3;", context.getCurrentUser().getID()); StringBuilder query = new StringBuilder(); query.append("select c from Collection c join c.resourcePolicies rp join rp.epersonGroup rpGroup WHERE "); for (int i = 0; i < actions.size(); i++) { Integer action = actions.get(i); - if (i != 0) { + if(i != 0) + { query.append(" AND "); } query.append("rp.actionId=").append(action); } query.append(" AND rp.resourceTypeId=").append(Constants.COLLECTION); - query.append( - " AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in " + - "elements(epeople))"); - Query hibernateQuery = createQuery(context, query.toString()); - hibernateQuery.setParameter("eperson_id", ePerson.getID()); - hibernateQuery.setCacheable(true); + query.append(" AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in elements(epeople))"); + Query persistenceQuery = createQuery(context, query.toString()); + persistenceQuery.setParameter("eperson_id", ePerson.getID()); + persistenceQuery.setHint("org.hibernate.cacheable", Boolean.TRUE); - return list(hibernateQuery); + return list(persistenceQuery); } @@ -180,17 +226,17 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple @Override @SuppressWarnings("unchecked") - public List> getCollectionsWithBitstreamSizesTotal(Context context) - throws SQLException { - String q = "select col as collection, sum(bit.sizeBytes) as totalBytes from Item i join i.collections col " + - "join i.bundles bun join bun.bitstreams bit group by col"; + public List> getCollectionsWithBitstreamSizesTotal(Context context) throws SQLException { + String q = "select col as collection, sum(bit.sizeBytes) as totalBytes from Item i join i.collections col join i.bundles bun join bun.bitstreams bit group by col"; Query query = createQuery(context, q); - query.setResultTransformer(new BasicTransformerAdapter() { - @Override - public Object transformTuple(Object[] tuple, String[] aliases) { - return new java.util.AbstractMap.SimpleImmutableEntry<>((Collection) tuple[0], (Long) tuple[1]); - } - }); - return ((List>) query.list()); + + //TODO RAF WRITE WUTNOW +// query.setResultTransformer(new BasicTransformerAdapter() { +// @Override +// public Object transformTuple(Object[] tuple, String[] aliases) { +// return new java.util.AbstractMap.SimpleImmutableEntry<>((Collection)tuple[0], (Long)tuple[1]); +// } +// }); + return ((List>)query.getResultList()); } -} +} \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java index 36d2888e01..30b2694bea 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java @@ -10,9 +10,19 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; import java.util.Arrays; import java.util.Collections; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.ResourcePolicy_; import org.dspace.content.Community; +import org.dspace.content.Community_; import org.dspace.content.MetadataField; import org.dspace.content.dao.CommunityDAO; import org.dspace.core.AbstractHibernateDSODAO; @@ -20,10 +30,6 @@ import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the Community object. @@ -41,8 +47,9 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme * Get a list of all communities in the system. These are alphabetically * sorted by community name. * - * @param context DSpace context object + * @param context DSpace context object * @param sortField sort field + * * @return the communities in the system * @throws SQLException if database error */ @@ -73,9 +80,16 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme @Override public Community findByAdminGroup(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, Community.class); - criteria.add(Restrictions.eq("admins", group)); - return singleResult(criteria); +// Criteria criteria = createCriteria(context, Community.class); +// criteria.add(Restrictions.eq("admins", group)); +// return singleResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Community.class); + Root communityRoot = criteriaQuery.from(Community.class); + criteriaQuery.select(communityRoot); + criteriaQuery.where(criteriaBuilder.equal(communityRoot.get(Community_.admins), group)); + return singleResult(context, criteriaQuery); } @Override @@ -88,7 +102,8 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme Query query = createQuery(context, queryBuilder.toString()); query.setParameter(sortField.toString(), sortField.getID()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); + return findMany(context, query); } @@ -96,6 +111,8 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme @Override public List findAuthorized(Context context, EPerson ePerson, List actions) throws SQLException { + //TODO RAF CHECK + /*TableRowIterator tri = DatabaseManager.query(context, "SELECT \n" + " * \n" + @@ -115,21 +132,41 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme " resourcepolicy.resource_type_id = 4 AND eperson.eperson_id = ?", context.getCurrentUser() .getID()); */ - Criteria criteria = createCriteria(context, Community.class); - criteria.createAlias("resourcePolicies", "resourcePolicy"); - - Disjunction actionQuery = Restrictions.or(); +// Criteria criteria = createCriteria(context, Community.class); +// criteria.createAlias("resourcePolicies", "resourcePolicy"); +// +// Disjunction actionQuery = Restrictions.or(); +// for (Integer action : actions) +// { +// actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); +// } +// criteria.add(Restrictions.and( +// Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COMMUNITY), +// Restrictions.eq("resourcePolicy.eperson", ePerson), +// actionQuery +// )); +// criteria.setCacheable(true); +// +// return list(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Community.class); + Root communityRoot = criteriaQuery.from(Community.class); + Join join = communityRoot.join("resourcePolicies"); + List orPredicates = new LinkedList(); for (Integer action : actions) { - actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); + orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } - criteria.add(Restrictions.and( - Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COMMUNITY), - Restrictions.eq("resourcePolicy.eperson", ePerson), - actionQuery - )); - criteria.setCacheable(true); - - return list(criteria); + Predicate orPredicate = criteriaBuilder.and(orPredicates.toArray(new Predicate[] {})); + criteriaQuery.select(communityRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), + criteriaBuilder.equal(join.get(ResourcePolicy_.eperson), ePerson), + orPredicate + ) + ); + return list(context, criteriaQuery, true, Community.class, -1, -1); } @Override @@ -164,11 +201,12 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme query.append( " AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in " + "elements(epeople))"); - Query hibernateQuery = createQuery(context, query.toString()); - hibernateQuery.setParameter("eperson_id", ePerson.getID()); - hibernateQuery.setCacheable(true); + Query persistenceQuery = createQuery(context, query.toString()); + persistenceQuery.setParameter("eperson_id", ePerson.getID()); - return list(hibernateQuery); + persistenceQuery.setHint("org.hibernate.cacheable", Boolean.TRUE); + + return list(persistenceQuery); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index 4127454b27..dcb6e6151a 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -7,24 +7,17 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; -import java.util.Collections; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - import org.apache.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.MetadataField; import org.dspace.content.MetadataValue; import org.dspace.content.dao.ItemDAO; -import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.eperson.EPerson; import org.hibernate.Criteria; -import org.hibernate.Query; +import javax.persistence.Query; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Property; @@ -32,6 +25,13 @@ import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Subqueries; import org.hibernate.type.StandardBasicTypes; +import java.sql.SQLException; +import java.util.Collections; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; + /** * Hibernate implementation of the Database Access Object interface class for the Item object. * This class is responsible for all database calls for the Item object and is autowired by spring @@ -39,10 +39,12 @@ import org.hibernate.type.StandardBasicTypes; * * @author kevinvandevelde at atmire.com */ -public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDAO { +public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDAO +{ private static final Logger log = Logger.getLogger(ItemDAOImpl.class); - protected ItemDAOImpl() { + protected ItemDAOImpl() + { super(); } @@ -73,14 +75,16 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA @Override public Iterator findAll(Context context, boolean archived, - boolean withdrawn, boolean discoverable, Date lastModified) - throws SQLException { + boolean withdrawn, boolean discoverable, Date lastModified) + throws SQLException + { StringBuilder queryStr = new StringBuilder(); queryStr.append("SELECT i FROM Item i"); queryStr.append(" WHERE (inArchive = :in_archive OR withdrawn = :withdrawn)"); queryStr.append(" AND discoverable = :discoverable"); - if (lastModified != null) { + if(lastModified != null) + { queryStr.append(" AND last_modified > :last_modified"); } @@ -88,9 +92,11 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA query.setParameter("in_archive", archived); query.setParameter("withdrawn", withdrawn); query.setParameter("discoverable", discoverable); - if (lastModified != null) { - query.setTimestamp("last_modified", lastModified); - } + if(lastModified != null) + { + //TODO RAF WRITE +// query.setTimestamp("last_modified", lastModified); + } return iterate(query); } @@ -103,8 +109,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public Iterator findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) - throws SQLException { + public Iterator findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) throws SQLException { StringBuilder query = new StringBuilder(); query.append("SELECT item FROM Item as item "); addMetadataLeftJoin(query, Item.class.getSimpleName().toLowerCase(), Collections.singletonList(metadataField)); @@ -122,100 +127,96 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public Iterator findByMetadataField(Context context, MetadataField metadataField, String value, - boolean inArchive) throws SQLException { - String hqlQueryString = "SELECT item FROM Item as item join item.metadata metadatavalue WHERE item" + - ".inArchive=:in_archive AND metadatavalue.metadataField = :metadata_field"; - if (value != null) { + public Iterator findByMetadataField(Context context, MetadataField metadataField, String value, boolean inArchive) throws SQLException { + String hqlQueryString = "SELECT item FROM Item as item join item.metadata metadatavalue WHERE item.inArchive=:in_archive AND metadatavalue.metadataField = :metadata_field"; + if(value != null) + { hqlQueryString += " AND STR(metadatavalue.value) = :text_value"; } Query query = createQuery(context, hqlQueryString); query.setParameter("in_archive", inArchive); query.setParameter("metadata_field", metadataField); - if (value != null) { + if(value != null) + { query.setParameter("text_value", value); } return iterate(query); } - enum OP { equals, not_equals, like, not_like, contains, doesnt_contain, exists, doesnt_exist, matches, - doesnt_match } + enum OP {equals,not_equals,like,not_like,contains,doesnt_contain,exists,doesnt_exist,matches,doesnt_match;} @Override - public Iterator findByMetadataQuery(Context context, List> listFieldList, - List query_op, List query_val, List collectionUuids, - String regexClause, int offset, int limit) throws SQLException { - Criteria criteria = createCriteria(context, Item.class, "item"); - criteria.setFirstResult(offset); - criteria.setMaxResults(limit); + public Iterator findByMetadataQuery(Context context, List> listFieldList, List query_op, List query_val, List collectionUuids, String regexClause, int offset, int limit) throws SQLException { +// Criteria criteria = createCriteria(context, Item.class, "item"); +// criteria.setFirstResult(offset); +// criteria.setMaxResults(limit); +// +// if (!collectionUuids.isEmpty()){ +// DetachedCriteria dcollCriteria = DetachedCriteria.forClass(Collection.class, "coll"); +// dcollCriteria.setProjection(Projections.property("coll.id")); +// dcollCriteria.add(Restrictions.eqProperty("coll.id", "item.owningCollection")); +// dcollCriteria.add(Restrictions.in("coll.id", collectionUuids)); +// criteria.add(Subqueries.exists(dcollCriteria)); +// } +// +// int index = Math.min(listFieldList.size(), Math.min(query_op.size(), query_val.size())); +// StringBuilder sb = new StringBuilder(); +// +// for(int i=0; i findByAuthorityValue(Context context, MetadataField metadataField, String authority, - boolean inArchive) throws SQLException { - Query query = createQuery(context, - "SELECT item FROM Item as item join item.metadata metadatavalue WHERE item" + - ".inArchive=:in_archive AND metadatavalue.metadataField = :metadata_field AND " + - "metadatavalue.authority = :authority"); + public Iterator findByAuthorityValue(Context context, MetadataField metadataField, String authority, boolean inArchive) throws SQLException { + Query query = createQuery(context, "SELECT item FROM Item as item join item.metadata metadatavalue WHERE item.inArchive=:in_archive AND metadatavalue.metadataField = :metadata_field AND metadatavalue.authority = :authority"); query.setParameter("in_archive", inArchive); query.setParameter("metadata_field", metadataField); query.setParameter("authority", authority); @@ -223,17 +224,16 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public Iterator findArchivedByCollection(Context context, Collection collection, Integer limit, - Integer offset) throws SQLException { - Query query = createQuery(context, - "select i from Item i join i.collections c WHERE :collection IN c AND i" + - ".inArchive=:in_archive"); + public Iterator findArchivedByCollection(Context context, Collection collection, Integer limit, Integer offset) throws SQLException { + Query query = createQuery(context, "select i from Item i join i.collections c WHERE :collection IN c AND i.inArchive=:in_archive"); query.setParameter("collection", collection); query.setParameter("in_archive", true); - if (offset != null) { + if(offset != null) + { query.setFirstResult(offset); } - if (limit != null) { + if(limit != null) + { query.setMaxResults(limit); } return iterate(query); @@ -264,11 +264,8 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn) - throws SQLException { - Query query = createQuery(context, - "select count(i) from Item i join i.collections c WHERE :collection IN c AND i" + - ".inArchive=:in_archive AND i.withdrawn=:withdrawn"); + public int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn) throws SQLException { + Query query = createQuery(context, "select count(i) from Item i join i.collections c WHERE :collection IN c AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); query.setParameter("collection", collection); query.setParameter("in_archive", includeArchived); query.setParameter("withdrawn", includeWithdrawn); @@ -277,15 +274,14 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public int countItems(Context context, List collections, boolean includeArchived, - boolean includeWithdrawn) throws SQLException { + public int countItems(Context context, List collections, boolean includeArchived, boolean includeWithdrawn) throws SQLException { if (collections.size() == 0) { return 0; } Query query = createQuery(context, "select count(distinct i) from Item i " + - "join i.collections collection " + - "WHERE collection IN (:collections) AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); - query.setParameterList("collections", collections); + "join i.collections collection " + + "WHERE collection IN (:collections) AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); + query.setParameter("collections", collections); query.setParameter("in_archive", includeArchived); query.setParameter("withdrawn", includeWithdrawn); @@ -294,9 +290,11 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA @Override public Iterator findByLastModifiedSince(Context context, Date since) - throws SQLException { + throws SQLException + { Query query = createQuery(context, "SELECT i FROM item i WHERE last_modified > :last_modified"); - query.setTimestamp("last_modified", since); + //TODO RAF WRITE +// query.setTimestamp("last_modified", since); return iterate(query); } @@ -307,9 +305,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA @Override public int countItems(Context context, boolean includeArchived, boolean includeWithdrawn) throws SQLException { - Query query = createQuery(context, - "SELECT count(*) FROM Item i WHERE i.inArchive=:in_archive AND i" + - ".withdrawn=:withdrawn"); + Query query = createQuery(context, "SELECT count(*) FROM Item i WHERE i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); query.setParameter("in_archive", includeArchived); query.setParameter("withdrawn", includeWithdrawn); return count(query); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java index c7e22f3427..299ae38c65 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java @@ -7,19 +7,22 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; -import java.util.List; - -import org.apache.commons.lang.StringUtils; -import org.dspace.content.MetadataField; -import org.dspace.content.MetadataSchema; +import org.dspace.content.*; import org.dspace.content.dao.MetadataFieldDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.eperson.RegistrationData; import org.hibernate.Criteria; import org.hibernate.FetchMode; -import org.hibernate.Query; import org.hibernate.criterion.Order; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the MetadataField object. @@ -28,119 +31,137 @@ import org.hibernate.criterion.Order; * * @author kevinvandevelde at atmire.com */ -public class MetadataFieldDAOImpl extends AbstractHibernateDAO implements MetadataFieldDAO { - protected MetadataFieldDAOImpl() { +public class MetadataFieldDAOImpl extends AbstractHibernateDAO implements MetadataFieldDAO +{ + protected MetadataFieldDAOImpl() + { super(); } @Override public MetadataField find(Context context, int metadataFieldId, MetadataSchema metadataSchema, String element, - String qualifier) throws SQLException { + String qualifier) throws SQLException{ Query query; - if (qualifier != null) { + if(qualifier != null) { query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE mf.id != :id " + - "AND ms.name = :name AND mf.element = :element " + - "AND qualifier = :qualifier"); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE mf.id != :id " + + "AND ms.name = :name AND mf.element = :element " + + "AND qualifier = :qualifier"); } else { query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE mf.id != :id " + - "AND ms.name = :name AND mf.element = :element " + - "AND mf.qualifier IS NULL"); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE mf.id != :id " + + "AND ms.name = :name AND mf.element = :element " + + "AND mf.qualifier IS NULL"); } query.setParameter("id", metadataFieldId); query.setParameter("name", metadataSchema.getName()); query.setParameter("element", element); - if (qualifier != null) { + if(qualifier != null) { query.setParameter("qualifier", qualifier); } + query.setHint("org.hibernate.cacheable", Boolean.TRUE); - query.setCacheable(true); return singleResult(query); } @Override - public MetadataField findByElement(Context context, MetadataSchema metadataSchema, String element, String qualifier) - throws SQLException { + public MetadataField findByElement(Context context, MetadataSchema metadataSchema, String element, String qualifier) throws SQLException + { return findByElement(context, metadataSchema.getName(), element, qualifier); } @Override - public MetadataField findByElement(Context context, String metadataSchema, String element, String qualifier) - throws SQLException { + public MetadataField findByElement(Context context, String metadataSchema, String element, String qualifier) throws SQLException + { Query query; - if (StringUtils.isNotBlank(qualifier)) { + if(qualifier != null) { query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE ms.name = :name AND mf.element = :element " + - "AND qualifier = :qualifier"); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE ms.name = :name AND mf.element = :element " + + "AND qualifier = :qualifier"); } else { query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE ms.name = :name AND mf.element = :element " + - "AND mf.qualifier IS NULL"); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE ms.name = :name AND mf.element = :element " + + "AND mf.qualifier IS NULL"); } query.setParameter("name", metadataSchema); query.setParameter("element", element); - if (StringUtils.isNotBlank(qualifier)) { + if(qualifier != null) { query.setParameter("qualifier", qualifier); } + query.setHint("org.hibernate.cacheable", Boolean.TRUE); - query.setCacheable(true); return singleResult(query); } @Override public List findAll(Context context, Class clazz) throws SQLException { - Criteria criteria = createCriteria(context, MetadataField.class); - criteria.createAlias("metadataSchema", "s").addOrder(Order.asc("s.name")).addOrder(Order.asc("element")) - .addOrder(Order.asc("qualifier")); - criteria.setFetchMode("metadataSchema", FetchMode.JOIN); - criteria.setCacheable(true); - return list(criteria); + + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, MetadataField.class); +// criteria.createAlias("metadataSchema", "s").addOrder(Order.asc("s.name")).addOrder(Order.asc("element")).addOrder(Order.asc("qualifier")); +// criteria.setFetchMode("metadataSchema", FetchMode.JOIN); +// criteria.setCacheable(true); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataField.class); + Root metadataFieldRoot = criteriaQuery.from(MetadataField.class); + Join join = metadataFieldRoot.join("metadataSchema"); + criteriaQuery.select(metadataFieldRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(join.get(MetadataSchema_.name))); + orderList.add(criteriaBuilder.asc(metadataFieldRoot.get(MetadataField_.element))); + orderList.add(criteriaBuilder.asc(metadataFieldRoot.get(MetadataField_.qualifier))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, true, MetadataField.class, -1, -1); } @Override - public List findFieldsByElementNameUnqualified(Context context, String metadataSchema, - String element) throws SQLException { + public List findFieldsByElementNameUnqualified(Context context, String metadataSchema, String element) throws SQLException + { Query query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE ms.name = :name AND mf.element = :element "); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE ms.name = :name AND mf.element = :element "); query.setParameter("name", metadataSchema); query.setParameter("element", element); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); - query.setCacheable(true); return list(query); } - + @Override public List findAllInSchema(Context context, MetadataSchema metadataSchema) throws SQLException { Query query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE ms.name = :name " + - "ORDER BY mf.element ASC, mf.qualifier ASC "); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE ms.name = :name " + + "ORDER BY mf.element ASC, mf.qualifier ASC "); query.setParameter("name", metadataSchema.getName()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); + return list(query); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java index 63d37ac195..033f282179 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java @@ -7,16 +7,22 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; -import java.util.List; - import org.dspace.content.MetadataSchema; +import org.dspace.content.MetadataSchema_; import org.dspace.content.dao.MetadataSchemaDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.eperson.Subscription; +import org.dspace.eperson.Subscription_; import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.criterion.Order; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the MetadataSchema object. @@ -25,104 +31,125 @@ import org.hibernate.criterion.Order; * * @author kevinvandevelde at atmire.com */ -public class MetadataSchemaDAOImpl extends AbstractHibernateDAO implements MetadataSchemaDAO { - protected MetadataSchemaDAOImpl() { +public class MetadataSchemaDAOImpl extends AbstractHibernateDAO implements MetadataSchemaDAO +{ + protected MetadataSchemaDAOImpl() + { super(); } /** * Get the schema object corresponding to this namespace URI. * - * @param context DSpace context + * @param context DSpace context * @param namespace namespace URI to match * @return metadata schema object or null if none found. * @throws SQLException if database error */ @Override - public MetadataSchema findByNamespace(Context context, String namespace) throws SQLException { + public MetadataSchema findByNamespace(Context context, String namespace) throws SQLException + { // Grab rows from DB Query query = createQuery(context, - "SELECT ms FROM MetadataSchema ms " + - "WHERE ms.namespace = :namespace "); + "SELECT ms FROM MetadataSchema ms " + + "WHERE ms.namespace = :namespace "); query.setParameter("namespace", namespace); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); - query.setCacheable(true); return singleResult(query); } @Override public List findAll(Context context, Class clazz) throws SQLException { // Get all the metadataschema rows - Criteria criteria = createCriteria(context, MetadataSchema.class); - criteria.addOrder(Order.asc("id")); - criteria.setCacheable(true); - return list(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, MetadataSchema.class); +// criteria.addOrder(Order.asc("id")); +// criteria.setCacheable(true); +// +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataSchema.class); + Root metadataSchemaRoot = criteriaQuery.from(MetadataSchema.class); + criteriaQuery.select(metadataSchemaRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(metadataSchemaRoot.get(MetadataSchema_.id))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, true, MetadataSchema.class, -1, -1); } /** * Return true if and only if the passed name appears within the allowed * number of times in the current schema. * - * @param context DSpace context + * @param context DSpace context * @param metadataSchemaId schema id - * @param namespace namespace URI to match + * @param namespace namespace URI to match * @return true of false * @throws SQLException if database error */ @Override - public boolean uniqueNamespace(Context context, int metadataSchemaId, String namespace) throws SQLException { + public boolean uniqueNamespace(Context context, int metadataSchemaId, String namespace) throws SQLException + { Query query = createQuery(context, - "SELECT ms FROM MetadataSchema ms " + - "WHERE ms.namespace = :namespace and ms.id != :id"); + "SELECT ms FROM MetadataSchema ms " + + "WHERE ms.namespace = :namespace and ms.id != :id"); query.setParameter("namespace", namespace); query.setParameter("id", metadataSchemaId); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query) == null; } /** * Return true if and only if the passed name is unique. * - * @param context DSpace context + * @param context DSpace context * @param metadataSchemaId schema id - * @param name short name of schema + * @param name short name of schema * @return true of false * @throws SQLException if database error */ @Override - public boolean uniqueShortName(Context context, int metadataSchemaId, String name) throws SQLException { + public boolean uniqueShortName(Context context, int metadataSchemaId, String name) throws SQLException + { Query query = createQuery(context, - "SELECT ms FROM MetadataSchema ms " + - "WHERE ms.name = :name and ms.id != :id"); + "SELECT ms FROM MetadataSchema ms " + + "WHERE ms.name = :name and ms.id != :id"); query.setParameter("name", name); query.setParameter("id", metadataSchemaId); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query) == null; } /** * Get the schema corresponding with this short name. * - * @param context context, in case we need to read it in from DB - * @param shortName the short name for the schema + * @param context + * context, in case we need to read it in from DB + * @param shortName + * the short name for the schema * @return the metadata schema object * @throws SQLException if database error */ @Override - public MetadataSchema find(Context context, String shortName) throws SQLException { + public MetadataSchema find(Context context, String shortName) throws SQLException + { Query query = createQuery(context, - "SELECT ms FROM MetadataSchema ms " + - "WHERE ms.name = :name"); + "SELECT ms FROM MetadataSchema ms " + + "WHERE ms.name = :name"); query.setParameter("name", shortName); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java index d800126bdd..0e84b50bd1 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java @@ -7,20 +7,29 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; -import java.util.Iterator; -import java.util.List; - import org.dspace.content.MetadataField; +import org.dspace.content.MetadataField_; import org.dspace.content.MetadataValue; import org.dspace.content.dao.MetadataValueDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.versioning.Version; +import org.dspace.versioning.VersionHistory; +import org.dspace.versioning.Version_; import org.hibernate.Criteria; import org.hibernate.FetchMode; -import org.hibernate.Query; import org.hibernate.criterion.Restrictions; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; +import javax.persistence.criteria.JoinType; +import java.sql.SQLException; +import java.util.Iterator; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the MetadataValue object. * This class is responsible for all database calls for the MetadataValue object and is autowired by spring @@ -28,30 +37,45 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class MetadataValueDAOImpl extends AbstractHibernateDAO implements MetadataValueDAO { - protected MetadataValueDAOImpl() { +public class MetadataValueDAOImpl extends AbstractHibernateDAO implements MetadataValueDAO +{ + protected MetadataValueDAOImpl() + { super(); } @Override - public List findByField(Context context, MetadataField metadataField) throws SQLException { - Criteria criteria = createCriteria(context, MetadataValue.class); - criteria.add( - Restrictions.eq("metadataField.id", metadataField.getID()) - ); - criteria.setFetchMode("metadataField", FetchMode.JOIN); + public List findByField(Context context, MetadataField metadataField) throws SQLException + { + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, MetadataValue.class); +// criteria.add( +// Restrictions.eq("metadataField.id", metadataField.getID()) +// ); +// criteria.setFetchMode("metadataField", FetchMode.JOIN); +// +// return list(criteria); - return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataValue.class); + Root metadataValueRoot = criteriaQuery.from(MetadataValue.class); + Join join = metadataValueRoot.join("metadataField"); + criteriaQuery.select(metadataValueRoot); + criteriaQuery.where(criteriaBuilder.equal(join.get(MetadataField_.id), metadataField.getID())); + + + return null; } @Override public Iterator findByValueLike(Context context, String value) throws SQLException { String queryString = "SELECT m FROM MetadataValue m JOIN m.metadataField f " + - "WHERE m.value like concat('%', concat(:searchString,'%')) ORDER BY m.id ASC"; + "WHERE m.value like concat('%', concat(:searchString,'%')) ORDER BY m.id ASC"; Query query = createQuery(context, queryString); - query.setString("searchString", value); + query.setParameter("searchString", value); return iterate(query); } @@ -66,13 +90,13 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im @Override public MetadataValue getMinimum(Context context, int metadataFieldId) - throws SQLException { - String queryString = "SELECT m FROM MetadataValue m JOIN FETCH m.metadataField WHERE m.metadataField.id = " + - ":metadata_field_id ORDER BY text_value"; + throws SQLException + { + String queryString = "SELECT m FROM MetadataValue m JOIN FETCH m.metadataField WHERE m.metadataField.id = :metadata_field_id ORDER BY text_value"; Query query = createQuery(context, queryString); query.setParameter("metadata_field_id", metadataFieldId); query.setMaxResults(1); - return (MetadataValue) query.uniqueResult(); + return (MetadataValue) query.getSingleResult(); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java index 41f7312e5c..1169f60915 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java @@ -7,14 +7,18 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; - import org.dspace.content.Site; import org.dspace.content.dao.SiteDAO; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.identifier.DOI; import org.hibernate.Criteria; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; + /** * Hibernate implementation of the Database Access Object interface class for the Site object. * This class is responsible for all database calls for the Site object and is autowired by spring @@ -22,15 +26,24 @@ import org.hibernate.Criteria; * * @author kevinvandevelde at atmire.com */ -public class SiteDAOImpl extends AbstractHibernateDAO implements SiteDAO { - protected SiteDAOImpl() { +public class SiteDAOImpl extends AbstractHibernateDAO implements SiteDAO +{ + protected SiteDAOImpl() + { super(); } @Override public Site findSite(Context context) throws SQLException { - Criteria criteria = createCriteria(context, Site.class); - criteria.setCacheable(true); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, Site.class); +// criteria.setCacheable(true); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Site.class); + Root siteRoot = criteriaQuery.from(Site.class); + criteriaQuery.select(siteRoot); +// criteriaQuery.where(criteriaBuilder.equal(root.get("doi"), doi)); + return uniqueResult(context, criteriaQuery, true, Site.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java index 735f0cbf9d..9f3d0f7307 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java @@ -7,23 +7,34 @@ */ package org.dspace.content.dao.impl; -import java.sql.SQLException; -import java.util.List; -import java.util.Map; - import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.WorkspaceItem; +import org.dspace.content.WorkspaceItem_; import org.dspace.content.dao.WorkspaceItemDAO; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; +import org.dspace.eperson.EPerson_; +import org.dspace.eperson.Group; +import org.dspace.harvest.HarvestedCollection_; +import org.dspace.identifier.DOI; +import org.dspace.workflow.WorkflowItem; import org.hibernate.Criteria; -import org.hibernate.Query; +import javax.persistence.Query; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.hibernate.transform.BasicTransformerAdapter; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + /** * Hibernate implementation of the Database Access Object interface class for the WorkspaceItem object. * This class is responsible for all database calls for the WorkspaceItem object and is autowired by spring @@ -31,45 +42,79 @@ import org.hibernate.transform.BasicTransformerAdapter; * * @author kevinvandevelde at atmire.com */ -public class WorkspaceItemDAOImpl extends AbstractHibernateDAO implements WorkspaceItemDAO { - protected WorkspaceItemDAOImpl() { +public class WorkspaceItemDAOImpl extends AbstractHibernateDAO implements WorkspaceItemDAO +{ + protected WorkspaceItemDAOImpl() + { super(); } @Override - public List findByEPerson(Context context, EPerson ep) throws SQLException { - Query query = createQuery(context, - "from WorkspaceItem ws where ws.item.submitter = :submitter order by " + - "workspaceItemId"); + public List findByEPerson(Context context, EPerson ep) throws SQLException + { + Query query = createQuery(context, "from WorkspaceItem ws where ws.item.submitter = :submitter order by workspaceItemId"); query.setParameter("submitter", ep); return list(query); } @Override - public List findByCollection(Context context, Collection c) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.add(Restrictions.eq("collection", c)); - return list(criteria); + public List findByCollection(Context context, Collection c) throws SQLException + { +// Criteria criteria = createCriteria(context, WorkspaceItem.class); +// criteria.add(Restrictions.eq("collection", c)); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.equal(workspaceItemRoot.get(WorkspaceItem_.collection), c)); + return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); + } @Override - public WorkspaceItem findByItem(Context context, Item i) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.add(Restrictions.eq("item", i)); - // Look for the unique workspaceitem entry where 'item_id' references this item - return uniqueResult(criteria); + public WorkspaceItem findByItem(Context context, Item i) throws SQLException + { +// Criteria criteria = createCriteria(context, WorkspaceItem.class); +// criteria.add(Restrictions.eq("item", i)); +// Look for the unique workspaceitem entry where 'item_id' references this item +// return uniqueResult(criteria); +// + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.equal(workspaceItemRoot.get(WorkspaceItem_.item), i)); + return uniqueResult(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); } @Override - public List findAll(Context context) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.addOrder(Order.asc("item")); - return list(criteria); - } + public List findAll(Context context) throws SQLException + { + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, WorkspaceItem.class); +// criteria.addOrder(Order.asc("item")); +// return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.item))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); + } + @Override - public List findAll(Context context, Integer limit, Integer offset) throws SQLException { + public List findAll(Context context, Integer limit, Integer offset) throws SQLException + { Criteria criteria = createCriteria(context, WorkspaceItem.class); criteria.addOrder(Order.asc("item")); criteria.setFirstResult(offset); @@ -79,19 +124,46 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public List findWithSupervisedGroup(Context context) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.add(Restrictions.isNotEmpty("supervisorGroups")); - criteria.addOrder(Order.asc("workspaceItemId")); - return list(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, WorkspaceItem.class); +// criteria.add(Restrictions.isNotEmpty("supervisorGroups")); +// criteria.addOrder(Order.asc("workspaceItemId")); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.isNotEmpty(workspaceItemRoot.get(WorkspaceItem_.supervisorGroups))); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.workspaceItemId))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); + + } @Override public List findBySupervisedGroupMember(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.createAlias("supervisorGroups", "supervisorGroup"); - criteria.createAlias("supervisorGroup.epeople", "person"); - criteria.add(Restrictions.eq("person.id", ePerson.getID())); - return list(criteria); + + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, WorkspaceItem.class); +// criteria.createAlias("supervisorGroups", "supervisorGroup"); +// criteria.createAlias("supervisorGroup.epeople", "person"); +// criteria.add(Restrictions.eq("person.id", ePerson.getID())); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + Join join = workspaceItemRoot.join("supervisorGroups"); + Join secondJoin = join.join("epeople"); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.equal(secondJoin.get(EPerson_.id), ePerson.getID())); + return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); } @Override @@ -102,16 +174,17 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override @SuppressWarnings("unchecked") public List> getStageReachedCounts(Context context) throws SQLException { - Query query = createQuery(context, - "SELECT wi.stageReached as stage_reached, count(*) as cnt from WorkspaceItem wi" + - " group by wi.stageReached order by wi.stageReached"); - query.setResultTransformer(new BasicTransformerAdapter() { - @Override - public Object transformTuple(Object[] tuple, String[] aliases) { - return new java.util.AbstractMap.SimpleImmutableEntry((Integer) tuple[0], (Long) tuple[1]); - } - }); - return (List>) query.list(); + Query query = createQuery(context,"SELECT wi.stageReached as stage_reached, count(*) as cnt from WorkspaceItem wi" + + " group by wi.stageReached order by wi.stageReached"); + + //TODO RAF WRITE +// query.setResultTransformer(new BasicTransformerAdapter() { +// @Override +// public Object transformTuple(Object[] tuple, String[] aliases) { +// return new java.util.AbstractMap.SimpleImmutableEntry((Integer) tuple[0], (Long) tuple[1]); +// } +// }); + return (List>)query.getResultList(); } } diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index 14c2622096..6f0b895f81 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -10,21 +10,26 @@ package org.dspace.core; import java.sql.SQLException; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.UUID; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Root; -import org.apache.commons.collections4.CollectionUtils; -import org.hibernate.Criteria; -import org.hibernate.Query; +import org.apache.commons.collections.CollectionUtils; import org.hibernate.Session; -import org.hibernate.criterion.Projections; + +//import org.hibernate.query.Query; /** * Hibernate implementation for generic DAO interface. Also includes additional * Hibernate calls that are commonly used. * Each DAO should extend this class to prevent code duplication. * - * @param class type * @author kevinvandevelde at atmire.com + * @param class type */ public abstract class AbstractHibernateDAO implements GenericDAO { @@ -43,13 +48,6 @@ public abstract class AbstractHibernateDAO implements GenericDAO { //Isn't required, is just here for other DB implementation. Hibernate auto keeps track of changes. } - /** - * The Session used to manipulate entities of this type. - * - * @param context current DSpace context. - * @return the current Session. - * @throws SQLException - */ protected Session getHibernateSession(Context context) throws SQLException { return ((Session) context.getDBConnection().getSession()); } @@ -61,13 +59,16 @@ public abstract class AbstractHibernateDAO implements GenericDAO { @Override public List findAll(Context context, Class clazz) throws SQLException { - return list(createCriteria(context, clazz)); + CriteriaQuery criteriaQuery = getCriteriaQuery(getCriteriaBuilder(context), clazz); + Root root = criteriaQuery.from(clazz); + criteriaQuery.select(root); + return executeCriteriaQuery(context, criteriaQuery, false, clazz, -1, -1); } @Override public T findUnique(Context context, String query) throws SQLException { @SuppressWarnings("unchecked") - T result = (T) createQuery(context, query).uniqueResult(); + T result = (T) createQuery(context, query).getSingleResult(); return result; } @@ -91,141 +92,92 @@ public abstract class AbstractHibernateDAO implements GenericDAO { @Override public List findMany(Context context, String query) throws SQLException { @SuppressWarnings("unchecked") - List result = (List) createQuery(context, query).list(); + List result = (List) createQuery(context, query).getResultList(); return result; } /** * Execute a JPA Criteria query and return a collection of results. * - * @param context The relevant DSpace Context. - * @param query JPQL query string + * @param context + * The relevant DSpace Context. + * @param query + * JPQL query string * @return list of DAOs specified by the query string * @throws SQLException if database error */ public List findMany(Context context, Query query) throws SQLException { @SuppressWarnings("unchecked") - List result = (List) query.list(); + List result = (List) query.getResultList(); return result; } - /** - * Create criteria matching an entity type or a supertype thereof. - * Use when building a criteria query. - * - * @param context current DSpace context. - * @param persistentClass specifies the type to be matched by the criteria. - * @return criteria concerning the type to be found. - * @throws SQLException passed through. - */ - public Criteria createCriteria(Context context, Class persistentClass) throws SQLException { - return getHibernateSession(context).createCriteria(persistentClass); - } +// public Criteria createCriteria(Context context, Class persistentClass) throws SQLException { +// return getHibernateSession(context).createCriteria(persistentClass); +// } +// +// public Criteria createCriteria(Context context, Class persistentClass, String alias) throws SQLException { +// return getHibernateSession(context).createCriteria(persistentClass, alias); +// } - /** - * Create criteria matching an entity type or a supertype thereof. - * Use when building a criteria query. - * - * @param context current DSpace context. - * @param persistentClass specifies the type to be matched by the criteria. - * @param alias alias for the type. - * @return criteria concerning the type to be found. - * @throws SQLException passed through. - */ - public Criteria createCriteria(Context context, Class persistentClass, String alias) throws SQLException { - return getHibernateSession(context).createCriteria(persistentClass, alias); - } - - /** - * Create a parsed query from a query expression. - * - * @param context current DSpace context. - * @param query textual form of the query. - * @return parsed form of the query. - * @throws SQLException - */ public Query createQuery(Context context, String query) throws SQLException { return getHibernateSession(context).createQuery(query); } - /** - * Get the entities matched by the given Criteria. - * Use this if you need all results together. - * - * @param criteria description of desired entities. - * @return the entities matched. - */ - public List list(Criteria criteria) { + public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, + int offset) throws SQLException { @SuppressWarnings("unchecked") - List result = (List) criteria.list(); + List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, clazz, maxResults, offset); return result; } - /** - * Get the entities matching a given parsed query. - * Use this if you need all results together. - * - * @param query the query to be executed. - * @return entities matching the query. - */ public List list(Query query) { @SuppressWarnings("unchecked") - List result = (List) query.list(); + List result = (List) query.getResultList(); return result; } /** - * Retrieve a unique result selected by criteria. If multiple results CAN be + * Retrieve a unique result from the query. If multiple results CAN be * retrieved an exception will be thrown, * so only use when the criteria state uniqueness in the database. - * - * @param criteria description of the desired entity. + * @param criteriaQuery JPA criteria * @return a DAO specified by the criteria */ - public T uniqueResult(Criteria criteria) { - @SuppressWarnings("unchecked") - T result = (T) criteria.uniqueResult(); - return result; - } - - /** - * Retrieve a unique result selected by a query. If multiple results CAN be - * retrieved then an exception will be thrown, so only use when the query - * states uniqueness in the database. - * - * @param query description of the desired entity. - * @return the found entity. - */ - public T uniqueResult(Query query) { - @SuppressWarnings("unchecked") - T result = (T) query.uniqueResult(); - return result; - } - - /** - * Retrieve a single result selected by criteria. Best used if you expect a - * single result, but this isn't enforced on the database. - * - * @param criteria description of the desired entities. - * @return a DAO specified by the criteria - */ - public T singleResult(Criteria criteria) { - criteria.setMaxResults(1); - List list = list(criteria); + public T uniqueResult(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, + int maxResults, int offset) throws SQLException { + List list = list(context, criteriaQuery, cacheable, clazz, maxResults, offset); if (CollectionUtils.isNotEmpty(list)) { - return list.get(0); + if (list.size() == 1) { + return list.get(0); + } else { + throw new IllegalArgumentException("More than one result found"); + } } else { return null; } } /** - * Retrieve a single result matching a query. Best used if you expect a + * Retrieve a single result from the query. Best used if you expect a * single result, but this isn't enforced on the database. - * - * @param query description of desired entities. - * @return matched entities. + * @param criteriaQuery JPA criteria + * @return a DAO specified by the criteria */ + public T singleResult(Context context, CriteriaQuery criteriaQuery) throws SQLException { +// List list = list(context, criteriaQuery, cacheable, clazz, maxResults, offset); +// if(CollectionUtils.isNotEmpty(list)) +// { +// return list.get(0); +// }else{ +// return null; +// } +// + Query query = this.getHibernateSession(context).createQuery(criteriaQuery); + return (T) query.getSingleResult(); + + } + public T singleResult(final Query query) { query.setMaxResults(1); List list = list(query); @@ -234,49 +186,78 @@ public abstract class AbstractHibernateDAO implements GenericDAO { } else { return null; } + } - /** - * Get an iterator over a stream of query results. - * Use this when consuming results one at a time. - * - * @param query description of desired entities. - * @return iterator over the results of the query. - */ - public Iterator iterate(Query query) { + public T uniqueResult(Query query) { @SuppressWarnings("unchecked") - Iterator result = (Iterator) query.iterate(); + T result = (T) query.getSingleResult(); return result; } - /** - * How many rows match these criteria? - * The same value as {@link countLong(Criteria)}, coerced to {@code int}. - * - * @param criteria description of the rows. - * @return count of matching rows. - */ - public int count(Criteria criteria) { - return ((Long) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); + public Iterator iterate(Query query) { + @SuppressWarnings("unchecked") + Iterator result = (Iterator) query.getResultList().iterator(); + return result; + } + + public int count(Context context, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder, Root root) + throws SQLException { + return Math.toIntExact(countLong(context, criteriaQuery, criteriaBuilder, root)); } - /** - * How many rows match this query? - * - * @param query description of the rows. - * @return count of matching rows. - */ public int count(Query query) { - return ((Long) query.uniqueResult()).intValue(); + return ((Long) query.getSingleResult()).intValue(); } - /** - * How many rows match these criteria? - * - * @param criteria description of the rows. - * @return count of matching rows. - */ - public long countLong(Criteria criteria) { - return (Long) criteria.setProjection(Projections.rowCount()).uniqueResult(); + public long countLong(Context context, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder, Root root) + throws SQLException { + Expression countExpression = criteriaBuilder.countDistinct(root); + criteriaQuery.select(countExpression); + return (Long) this.getHibernateSession(context).createQuery(criteriaQuery).getSingleResult(); } + + public CriteriaQuery getCriteriaQuery(CriteriaBuilder criteriaBuilder, Class c) { + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(c); + return criteriaQuery; + } + + public CriteriaBuilder getCriteriaBuilder(Context context) throws SQLException { + return this.getHibernateSession(context).getCriteriaBuilder(); + } + + public List executeCriteriaQuery(Context context, CriteriaQuery criteriaQuery, boolean cacheable, + Class clazz, int maxResults, int offset) throws SQLException { + //This has to be here, otherwise a 500 gets thrown + Root root = criteriaQuery.from(clazz); + Query query = this.getHibernateSession(context).createQuery(criteriaQuery); + + //TODO Check if this works and is desireable + query.setHint("org.hibernate.cacheable", cacheable); +// query.setCacheable(cacheable); + if (maxResults != -1) { + query.setMaxResults(maxResults); + } + if (maxResults != -1) { + query.setFirstResult(offset); + } + return query.getResultList(); + + } + + public List findByX(Context context, Class clazz, Map equals, boolean cacheable, int maxResults, + int offset) throws SQLException { + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteria = getCriteriaQuery(criteriaBuilder, clazz); + Root root = criteria.from(clazz); + criteria.select(root); + + //TODO Maybe one big where, test this;;;; seems to not be necessary + for (Map.Entry entry : equals.entrySet()) { + criteria.where(criteriaBuilder.equal(root.get(entry.getKey()), entry.getValue())); + } + return executeCriteriaQuery(context, criteria, cacheable, clazz, maxResults, offset); + } + + //TODO find alternative for uniqueResult } diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java index c17d1bdb86..5a5e3ecb26 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java @@ -9,15 +9,16 @@ package org.dspace.core; import java.sql.SQLException; import java.util.Collection; -import java.util.Collections; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ListUtils; import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.content.MetadataField; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation used by DSpaceObject Database Access Objects. @@ -26,8 +27,8 @@ import org.hibernate.criterion.Restrictions; *

* Each DSO Database Access Object should extend this class to prevent code duplication. * - * @param type of DSO represented. * @author kevinvandevelde at atmire.com + * @param type of DSO represented. */ public abstract class AbstractHibernateDSODAO extends AbstractHibernateDAO { /** @@ -36,27 +37,31 @@ public abstract class AbstractHibernateDSODAO extends Ab * All DSOs now have UUID primary keys, and those should be used when available. * Each type derived from DSpaceObject had its own stream of record IDs, so * it is also necessary to know the specific type. - * - * @param context current DSpace context. + * @param context current DSpace context. * @param legacyId the old integer record identifier. - * @param clazz DSO subtype of record identified by {@link legacyId}. + * @param clazz DSO subtype of record identified by {@link legacyId}. * @return * @throws SQLException */ public T findByLegacyId(Context context, int legacyId, Class clazz) throws SQLException { - Criteria criteria = createCriteria(context, clazz); - criteria.add(Restrictions.eq("legacyId", legacyId)); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, clazz); +// criteria.add(Restrictions.eq("legacyId", legacyId)); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, clazz); + Root root = criteriaQuery.from(clazz); + criteriaQuery.where(criteriaBuilder.equal(root.get("legacyId"), legacyId)); + return uniqueResult(context, criteriaQuery, false, clazz, -1, -1); } /** * Add left outer join on all metadata fields which are passed to this function. * The identifier of the join will be the toString() representation of the metadata field. * The joined metadata fields can then be used to query or sort. - * - * @param query the query string being built. + * @param query the query string being built. * @param tableIdentifier name of the table to be joined. - * @param metadataFields names of the desired fields. + * @param metadataFields names of the desired fields. */ protected void addMetadataLeftJoin(StringBuilder query, String tableIdentifier, Collection metadataFields) { @@ -72,9 +77,9 @@ public abstract class AbstractHibernateDSODAO extends Ab * Values can be checked using a like or an "=" query, as determined by the "operator" parameter. * When creating a query, the "queryParam" string can be used set as parameter for the query. * - * @param query the already existing query builder, all changes will be appended - * @param metadataFields the metadata fields whose metadata value should be queried - * @param operator can either be "=" or "like" + * @param query the already existing query builder, all changes will be appended + * @param metadataFields the metadata fields whose metadata value should be queried + * @param operator can either be "=" or "like" * @param additionalWhere additional where query */ protected void addMetadataValueWhereQuery(StringBuilder query, List metadataFields, String operator, @@ -108,23 +113,20 @@ public abstract class AbstractHibernateDSODAO extends Ab /** * Append ORDER BY clause based on metadata fields or column names. * All fields will be in ascending order. - * - * @param query the query being built. + * @param query the query being built. * @param metadataSortFields fields on which to sort -- use this OR columnSortFields. - * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. + * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. */ - protected void addMetadataSortQuery(StringBuilder query, List metadataSortFields, - List columnSortFields) { - addMetadataSortQuery(query, metadataSortFields, columnSortFields, Collections.EMPTY_LIST); + protected void addMetadataSortQuery(StringBuilder query, List metadataSortFields, List columnSortFields) { + addMetadataSortQuery(query, metadataSortFields, columnSortFields, ListUtils.EMPTY_LIST); } /** * Append ORDER BY clause based on metadata fields or column names. - * - * @param query the query being built. + * @param query the query being built. * @param metadataSortFields fields on which to sort -- use this OR columnSortFields. - * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. - * @param direction ASC or DESC for each field. Unspecified fields will be ASC. + * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. + * @param direction ASC or DESC for each field. Unspecified fields will be ASC. */ protected void addMetadataSortQuery(StringBuilder query, List metadataSortFields, List columnSortFields, List direction) { diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java index 6adff0f9cc..6fe5d7af6c 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java @@ -15,18 +15,21 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.UUID; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ListUtils; import org.apache.commons.lang3.StringUtils; import org.dspace.content.MetadataField; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; +import org.dspace.eperson.EPerson_; import org.dspace.eperson.Group; import org.dspace.eperson.dao.EPersonDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the EPerson object. @@ -42,22 +45,36 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements @Override public EPerson findByEmail(Context context, String email) throws SQLException { - // All email addresses are stored as lowercase, so ensure that the email address is lowercased for the lookup - Criteria criteria = createCriteria(context, EPerson.class); - criteria.add(Restrictions.eq("email", email.toLowerCase())); - - criteria.setCacheable(true); - return uniqueResult(criteria); +// All email addresses are stored as lowercase, so ensure that the email address is lowercased for the lookup +// Criteria criteria = createCriteria(context, EPerson.class); +// criteria.add(Restrictions.eq("email", email.toLowerCase())); +// +// criteria.setCacheable(true); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); + Root ePersonRoot = criteriaQuery.from(EPerson.class); + criteriaQuery.select(ePersonRoot); + criteriaQuery.where(criteriaBuilder.equal(ePersonRoot.get(EPerson_.email), email.toLowerCase())); + return uniqueResult(context, criteriaQuery, true, EPerson.class, -1, -1); } @Override public EPerson findByNetid(Context context, String netid) throws SQLException { - Criteria criteria = createCriteria(context, EPerson.class); - criteria.add(Restrictions.eq("netid", netid)); - - criteria.setCacheable(true); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, EPerson.class); +// criteria.add(Restrictions.eq("netid", netid)); +// +// criteria.setCacheable(true); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); + Root ePersonRoot = criteriaQuery.from(EPerson.class); + criteriaQuery.select(ePersonRoot); + criteriaQuery.where((criteriaBuilder.equal(ePersonRoot.get(EPerson_.netid), netid))); + return uniqueResult(context, criteriaQuery, true, EPerson.class, -1, -1); } @Override @@ -101,8 +118,8 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements sortFields = Collections.singletonList(metadataSortField); } - Query query = getSearchQuery(context, queryString, null, Collections.EMPTY_LIST, sortFields, - sortField, pageSize, offset); + Query query = getSearchQuery(context, queryString, null, ListUtils.EMPTY_LIST, sortFields, sortField, pageSize, + offset); return list(query); } @@ -119,26 +136,43 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements idList.add(group.getID()); } - query.setParameterList("idList", idList); + query.setParameter("idList", idList); return list(query); } @Override public List findWithPasswordWithoutDigestAlgorithm(Context context) throws SQLException { - Criteria criteria = createCriteria(context, EPerson.class); - criteria.add(Restrictions.and( - Restrictions.isNotNull("password"), - Restrictions.isNull("digestAlgorithm") - )); - return list(criteria); +// Criteria criteria = createCriteria(context, EPerson.class); +// criteria.add(Restrictions.and( +// Restrictions.isNotNull("password"), +// Restrictions.isNull("digestAlgorithm") +// )); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); + Root ePersonRoot = criteriaQuery.from(EPerson.class); + criteriaQuery.select(ePersonRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.isNotNull(ePersonRoot.get(EPerson_.password)), + criteriaBuilder.isNull(ePersonRoot.get(EPerson_.digestAlgorithm)) + ) + ); + return list(context, criteriaQuery, false, EPerson.class, -1, -1); } @Override public List findNotActiveSince(Context context, Date date) throws SQLException { - Criteria criteria = createCriteria(context, EPerson.class); - criteria.add(Restrictions.le("lastActive", date)); - return list(criteria); +// Criteria criteria = createCriteria(context, EPerson.class); +// criteria.add(Restrictions.le("lastActive", date)); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); + Root ePersonRoot = criteriaQuery.from(EPerson.class); + criteriaQuery.select(ePersonRoot); + criteriaQuery.where(criteriaBuilder.lessThanOrEqualTo(ePersonRoot.get(EPerson_.lastActive), date)); + return list(context, criteriaQuery, false, EPerson.class, -1, -1); } protected Query getSearchQuery(Context context, String queryString, String queryParam, diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java index 03858e2240..06cfd04424 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java @@ -7,19 +7,27 @@ */ package org.dspace.eperson.dao.impl; -import java.sql.SQLException; -import java.util.List; - -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.Group; import org.dspace.eperson.Group2GroupCache; +import org.dspace.eperson.Group2GroupCache_; import org.dspace.eperson.dao.Group2GroupCacheDAO; +import org.dspace.xmlworkflow.storedcomponents.PoolTask; import org.hibernate.Criteria; -import org.hibernate.Query; +import javax.persistence.Query; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + /** * Hibernate implementation of the Database Access Object interface class for the Group2GroupCache object. * This class is responsible for all database calls for the Group2GroupCache object and is autowired by spring @@ -27,55 +35,87 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO implements Group2GroupCacheDAO { - protected Group2GroupCacheDAOImpl() { +public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO implements Group2GroupCacheDAO +{ + protected Group2GroupCacheDAOImpl() + { super(); } @Override public List findByParent(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, Group2GroupCache.class); - criteria.add(Restrictions.eq("parent.id", group.getID())); - criteria.setCacheable(true); - - return list(criteria); +// Criteria criteria = createCriteria(context, Group2GroupCache.class); +// criteria.add(Restrictions.eq("parent.id", group.getID())); +// criteria.setCacheable(true); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Group2GroupCache.class); + Root group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); + criteriaQuery.select(group2GroupCacheRoot); + criteriaQuery.where(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.parent), group)); + return list(context, criteriaQuery, true, Group2GroupCache.class, -1, -1); } @Override public List findByChildren(Context context, Iterable groups) throws SQLException { - Criteria criteria = createCriteria(context, Group2GroupCache.class); - - Disjunction orDisjunction = Restrictions.or(); - for (Group group : groups) { - orDisjunction.add(Restrictions.eq("child.id", group.getID())); +// Criteria criteria = createCriteria(context, Group2GroupCache.class); +// +// Disjunction orDisjunction = Restrictions.or(); +// for(Group group : groups) +// { +// orDisjunction.add(Restrictions.eq("child.id", group.getID())); +// } +// +// criteria.add(orDisjunction); +// criteria.setCacheable(true); +// +// return list(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Group2GroupCache.class); + Root group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); + List eqPredicates = new LinkedList<>(); + for(Group group : groups){ + eqPredicates.add(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.child), group)); } - - criteria.add(orDisjunction); - criteria.setCacheable(true); - - return list(criteria); + Predicate orPredicate = criteriaBuilder.or(eqPredicates.toArray(new Predicate[]{})); + criteriaQuery.select(group2GroupCacheRoot); + criteriaQuery.where(orPredicate); + return list(context, criteriaQuery, true, Group2GroupCache.class, -1, -1); } @Override public Group2GroupCache findByParentAndChild(Context context, Group parent, Group child) throws SQLException { Query query = createQuery(context, - "FROM Group2GroupCache g WHERE g.parent = :parentGroup AND g.child = :childGroup"); + "FROM Group2GroupCache g WHERE g.parent = :parentGroup AND g.child = :childGroup"); query.setParameter("parentGroup", parent); query.setParameter("childGroup", child); - - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query); } @Override public Group2GroupCache find(Context context, Group parent, Group child) throws SQLException { - Criteria criteria = createCriteria(context, Group2GroupCache.class); - criteria.add(Restrictions.eq("parent.id", parent.getID())); - criteria.add(Restrictions.eq("child.id", child.getID())); - criteria.setCacheable(true); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, Group2GroupCache.class); +// criteria.add(Restrictions.eq("parent.id", parent.getID())); +// criteria.add(Restrictions.eq("child.id", child.getID())); +// criteria.setCacheable(true); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Group2GroupCache.class); + Root group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); + criteriaQuery.select(group2GroupCacheRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.parent), parent), + criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.child), child) + ) + ); + return uniqueResult(context, criteriaQuery, true, Group2GroupCache.class, -1, -1); } @Override diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java index e61f28b7f5..71eaeda9e1 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java @@ -7,11 +7,6 @@ */ package org.dspace.eperson.dao.impl; -import java.sql.SQLException; -import java.util.Collections; -import java.util.List; -import java.util.UUID; - import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.dspace.content.MetadataField; @@ -20,7 +15,11 @@ import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.dao.GroupDAO; -import org.hibernate.Query; +import javax.persistence.Query; +import java.sql.SQLException; +import java.util.Collections; +import java.util.List; +import java.util.UUID; /** * Hibernate implementation of the Database Access Object interface class for the Group object. @@ -29,14 +28,16 @@ import org.hibernate.Query; * * @author kevinvandevelde at atmire.com */ -public class GroupDAOImpl extends AbstractHibernateDSODAO implements GroupDAO { - protected GroupDAOImpl() { +public class GroupDAOImpl extends AbstractHibernateDSODAO implements GroupDAO +{ + protected GroupDAOImpl() + { super(); } @Override - public List findByMetadataField(Context context, String searchValue, MetadataField metadataField) - throws SQLException { + public List findByMetadataField(Context context, String searchValue, MetadataField metadataField) throws SQLException + { StringBuilder queryBuilder = new StringBuilder(); String groupTableName = "g"; queryBuilder.append("SELECT ").append(groupTableName).append(" FROM Group as ").append(groupTableName); @@ -52,8 +53,8 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou } @Override - public List findAll(Context context, List sortMetadataFields, int pageSize, int offset) - throws SQLException { + public List findAll(Context context, List sortMetadataFields, int pageSize, int offset) throws SQLException + { StringBuilder queryBuilder = new StringBuilder(); String groupTableName = "g"; queryBuilder.append("SELECT ").append(groupTableName).append(" FROM Group as ").append(groupTableName); @@ -63,10 +64,10 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou Query query = createQuery(context, queryBuilder.toString()); if (pageSize > 0) { - query.setMaxResults(pageSize); + query.setMaxResults(pageSize); } if (offset > 0) { - query.setFirstResult(offset); + query.setFirstResult(offset); } for (MetadataField sortField : sortMetadataFields) { query.setParameter(sortField.toString(), sortField.getID()); @@ -77,24 +78,23 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public List findAll(Context context, int pageSize, int offset) throws SQLException { Query query = createQuery(context, - "SELECT g FROM Group g ORDER BY g.name ASC"); + "SELECT g FROM Group g ORDER BY g.name ASC"); if (pageSize > 0) { - query.setMaxResults(pageSize); + query.setMaxResults(pageSize); } if (offset > 0) { - query.setFirstResult(offset); + query.setFirstResult(offset); } - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return list(query); } @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { - Query query = createQuery(context, - "from Group where (from EPerson e where e.id = :eperson_id) in elements(epeople)"); + Query query = createQuery(context, "from Group where (from EPerson e where e.id = :eperson_id) in elements(epeople)"); query.setParameter("eperson_id", ePerson.getID()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return list(query); } @@ -102,53 +102,54 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public Group findByName(final Context context, final String name) throws SQLException { Query query = createQuery(context, - "SELECT g from Group g " + - "where g.name = :name "); + "SELECT g from Group g " + + "where g.name = :name "); query.setParameter("name", name); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query); } @Override public Group findByIdAndMembership(Context context, UUID id, EPerson ePerson) throws SQLException { - if (id == null || ePerson == null) { + if(id == null || ePerson == null) { return null; } else { Query query = createQuery(context, - "SELECT DISTINCT g FROM Group g " + - "LEFT JOIN g.epeople p " + - "WHERE g.id = :id AND " + - "(p.id = :eperson_id OR " + - "EXISTS ( " + - "SELECT 1 FROM Group2GroupCache gc " + - "JOIN gc.parent parent " + - "JOIN gc.child child " + - "JOIN child.epeople cp " + - "WHERE parent.id = g.id AND cp.id = :eperson_id " + - ") " + - ")"); + "SELECT DISTINCT g FROM Group g " + + "LEFT JOIN g.epeople p " + + "WHERE g.id = :id AND " + + "(p.id = :eperson_id OR " + + "EXISTS ( " + + "SELECT 1 FROM Group2GroupCache gc " + + "JOIN gc.parent parent " + + "JOIN gc.child child " + + "JOIN child.epeople cp " + + "WHERE parent.id = g.id AND cp.id = :eperson_id " + + ") " + + ")"); query.setParameter("id", id); query.setParameter("eperson_id", ePerson.getID()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query); } } @Override - public List findByNameLike(final Context context, final String groupName, final int offset, final int limit) - throws SQLException { + public List findByNameLike(final Context context, final String groupName, final int offset, final int limit) throws SQLException { Query query = createQuery(context, - "SELECT g FROM Group g WHERE lower(g.name) LIKE lower(:name)"); + "SELECT g FROM Group g WHERE lower(g.name) LIKE lower(:name)"); query.setParameter("name", "%" + StringUtils.trimToEmpty(groupName) + "%"); - if (0 <= offset) { + if(0 <= offset) + { query.setFirstResult(offset); } - if (0 <= limit) { + if(0 <= limit) + { query.setMaxResults(limit); } @@ -158,7 +159,7 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public int countByNameLike(final Context context, final String groupName) throws SQLException { Query query = createQuery(context, - "SELECT count(*) FROM Group g WHERE lower(g.name) LIKE lower(:name)"); + "SELECT count(*) FROM Group g WHERE lower(g.name) LIKE lower(:name)"); query.setParameter("name", "%" + groupName + "%"); return count(query); @@ -166,8 +167,7 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public void delete(Context context, Group group) throws SQLException { - Query query = getHibernateSession(context) - .createSQLQuery("DELETE FROM group2group WHERE parent_id=:groupId or child_id=:groupId"); + Query query = getHibernateSession(context).createSQLQuery("DELETE FROM group2group WHERE parent_id=:groupId or child_id=:groupId"); query.setParameter("groupId", group.getID()); query.executeUpdate(); super.delete(context, group); @@ -178,11 +178,11 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou public List> getGroup2GroupResults(Context context, boolean flushQueries) throws SQLException { Query query = createQuery(context, "SELECT new org.apache.commons.lang3.tuple.ImmutablePair(g.id, c.id) " + - "FROM Group g " + - "JOIN g.groups c "); + "FROM Group g " + + "JOIN g.groups c "); @SuppressWarnings("unchecked") - List> results = query.list(); + List> results = query.getResultList(); return results; } diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java index c5aa36b5a4..ece959f66d 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java @@ -7,15 +7,19 @@ */ package org.dspace.eperson.dao.impl; -import java.sql.SQLException; - -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.eperson.Group2GroupCache; import org.dspace.eperson.RegistrationData; +import org.dspace.eperson.RegistrationData_; import org.dspace.eperson.dao.RegistrationDataDAO; import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.criterion.Restrictions; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; /** * Hibernate implementation of the Database Access Object interface class for the RegistrationData object. @@ -24,24 +28,40 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class RegistrationDataDAOImpl extends AbstractHibernateDAO implements RegistrationDataDAO { +public class RegistrationDataDAOImpl extends AbstractHibernateDAO implements RegistrationDataDAO +{ - protected RegistrationDataDAOImpl() { + protected RegistrationDataDAOImpl() + { super(); } @Override public RegistrationData findByEmail(Context context, String email) throws SQLException { - Criteria criteria = createCriteria(context, RegistrationData.class); - criteria.add(Restrictions.eq("email", email)); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, RegistrationData.class); +// criteria.add(Restrictions.eq("email", email)); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, RegistrationData.class); + Root registrationDataRoot = criteriaQuery.from(RegistrationData.class); + criteriaQuery.select(registrationDataRoot); + criteriaQuery.where(criteriaBuilder.equal(registrationDataRoot.get(RegistrationData_.email), email)); + return uniqueResult(context, criteriaQuery, true, RegistrationData.class, -1, -1); } @Override public RegistrationData findByToken(Context context, String token) throws SQLException { - Criteria criteria = createCriteria(context, RegistrationData.class); - criteria.add(Restrictions.eq("token", token)); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, RegistrationData.class); +// criteria.add(Restrictions.eq("token", token)); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, RegistrationData.class); + Root registrationDataRoot = criteriaQuery.from(RegistrationData.class); + criteriaQuery.select(registrationDataRoot); + criteriaQuery.where(criteriaBuilder.equal(registrationDataRoot.get(RegistrationData_.token), token)); + return uniqueResult(context, criteriaQuery, true, RegistrationData.class, -1, -1); } @Override diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java index 88734410e1..37282adf9f 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java @@ -8,18 +8,20 @@ package org.dspace.eperson.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.Collection; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Subscription; +import org.dspace.eperson.Subscription_; import org.dspace.eperson.dao.SubscriptionDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the Subscription object. @@ -35,27 +37,45 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl @Override public List findByEPerson(Context context, EPerson eperson) throws SQLException { - Criteria criteria = createCriteria(context, Subscription.class); - criteria.add( - Restrictions.and( - Restrictions.eq("ePerson", eperson) - ) - ); - return list(criteria); +// Criteria criteria = createCriteria(context, Subscription.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("ePerson", eperson) +// ) +// ); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); + Root subscriptionRoot = criteriaQuery.from(Subscription.class); + criteriaQuery.select(subscriptionRoot); + criteriaQuery.where(criteriaBuilder.equal(subscriptionRoot.get(Subscription_.ePerson), eperson)); + return list(context, criteriaQuery, false, Subscription.class, -1, -1); } @Override public Subscription findByCollectionAndEPerson(Context context, EPerson eperson, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, Subscription.class); - criteria.add( - Restrictions.and( - Restrictions.eq("ePerson", eperson), - Restrictions.eq("collection", collection) - ) - ); - return singleResult(criteria); +// Criteria criteria = createCriteria(context, Subscription.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("ePerson", eperson), +// Restrictions.eq("collection", collection) +// ) +// ); +// return singleResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); + Root subscriptionRoot = criteriaQuery.from(Subscription.class); + criteriaQuery.select(subscriptionRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(subscriptionRoot.get(Subscription_.ePerson), eperson), + criteriaBuilder.equal(subscriptionRoot.get(Subscription_.collection), collection) + ) + ); + return singleResult(context, criteriaQuery); } @@ -87,8 +107,20 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl @Override public List findAllOrderedByEPerson(Context context) throws SQLException { - Criteria criteria = createCriteria(context, Subscription.class); - criteria.addOrder(Order.asc("ePerson")); - return list(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, Subscription.class); +// criteria.addOrder(Order.asc("eperson.id")); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); + Root subscriptionRoot = criteriaQuery.from(Subscription.class); + criteriaQuery.select(subscriptionRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(subscriptionRoot.get(Subscription_.ePerson))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, false, Subscription.class, -1, -1); } -} +} \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java index 1aac41a144..6b3f2f9da8 100644 --- a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java @@ -7,20 +7,15 @@ */ package org.dspace.handle.dao.impl; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Collections; -import java.util.List; - import org.dspace.content.DSpaceObject; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.handle.Handle; +import org.dspace.handle.Handle_; import org.dspace.handle.dao.HandleDAO; +import org.dspace.xmlworkflow.storedcomponents.ClaimedTask; import org.hibernate.Criteria; -import org.hibernate.Query; +import javax.persistence.Query; import org.hibernate.criterion.Restrictions; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver; @@ -28,6 +23,16 @@ import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionIn import org.hibernate.engine.jdbc.dialect.spi.DialectResolver; import org.hibernate.jdbc.ReturningWork; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collections; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the Handle object. * This class is responsible for all database calls for the Handle object and is autowired by spring @@ -35,28 +40,30 @@ import org.hibernate.jdbc.ReturningWork; * * @author kevinvandevelde at atmire.com */ -public class HandleDAOImpl extends AbstractHibernateDAO implements HandleDAO { +public class HandleDAOImpl extends AbstractHibernateDAO implements HandleDAO +{ // The name of the sequence used to determine next available handle private static final String HANDLE_SEQUENCE = "handle_seq"; - protected HandleDAOImpl() { + protected HandleDAOImpl() + { super(); } @Override public List getHandlesByDSpaceObject(Context context, DSpaceObject dso) throws SQLException { - if (dso == null) { + if(dso == null) { return Collections.emptyList(); } else { Query query = createQuery(context, - "SELECT h " + - "FROM Handle h " + - "LEFT JOIN FETCH h.dso " + - "WHERE h.dso.id = :id "); + "SELECT h " + + "FROM Handle h " + + "LEFT JOIN FETCH h.dso " + + "WHERE h.dso.id = :id "); query.setParameter("id", dso.getID()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return list(query); } } @@ -64,39 +71,56 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl @Override public Handle findByHandle(Context context, String handle) throws SQLException { Query query = createQuery(context, - "SELECT h " + - "FROM Handle h " + - "LEFT JOIN FETCH h.dso " + - "WHERE h.handle = :handle "); + "SELECT h " + + "FROM Handle h " + + "LEFT JOIN FETCH h.dso " + + "WHERE h.handle = :handle "); query.setParameter("handle", handle); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return uniqueResult(query); } @Override public List findByPrefix(Context context, String prefix) throws SQLException { - Criteria criteria = createCriteria(context, Handle.class); - criteria.add(Restrictions.like("handle", prefix + "%")); - return list(criteria); +// Criteria criteria = createCriteria(context, Handle.class); +// criteria.add(Restrictions.like("handle", prefix + "%")); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Handle.class); + Root handleRoot = criteriaQuery.from(Handle.class); + criteriaQuery.select(handleRoot); + criteriaQuery.where(criteriaBuilder.like(handleRoot.get(Handle_.handle), prefix+"%")); + return list(context, criteriaQuery, false, Handle.class, -1, -1); } @Override public long countHandlesByPrefix(Context context, String prefix) throws SQLException { - Criteria criteria = createCriteria(context, Handle.class); - criteria.add(Restrictions.like("handle", prefix + "%")); - return countLong(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, Handle.class); +// criteria.add(Restrictions.like("handle", prefix + "%")); +// return countLong(criteria); +// + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root handleRoot = criteriaQuery.from(Handle.class); + criteriaQuery.select(criteriaBuilder.count(criteriaQuery.from(Handle.class))); + criteriaQuery.where(criteriaBuilder.like(handleRoot.get(Handle_.handle), prefix+"%")); + return countLong(context, criteriaQuery, criteriaBuilder, handleRoot); } @Override - public int updateHandlesWithNewPrefix(Context context, String newPrefix, String oldPrefix) throws SQLException { - String hql = "UPDATE Handle set handle = concat(:newPrefix, '/', substring(handle, :oldPrefixLength + 2)) " + - "WHERE handle like concat(:oldPrefix,'%')"; + public int updateHandlesWithNewPrefix(Context context, String newPrefix, String oldPrefix) throws SQLException + { + String hql = "UPDATE Handle set handle = concat(:newPrefix, '/', substring(handle, :oldPrefixLength + 2)) WHERE handle like concat(:oldPrefix,'%')"; Query query = createQuery(context, hql); - query.setString("newPrefix", newPrefix); - query.setInteger("oldPrefixLength", oldPrefix.length()); - query.setString("oldPrefix", oldPrefix); + query.setParameter("newPrefix", newPrefix); + query.setParameter("oldPrefixLength", oldPrefix.length()); + query.setParameter("oldPrefix", oldPrefix); return query.executeUpdate(); } @@ -107,13 +131,13 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl /** * Return next available value of Handle suffix (based on DB sequence). - * * @param context Current DSpace Context * @return next available Handle suffix (as a Long) * @throws SQLException if database error or sequence doesn't exist */ @Override - public Long getNextHandleSuffix(Context context) throws SQLException { + public Long getNextHandleSuffix(Context context) throws SQLException + { // Create a new Hibernate ReturningWork, which will return the // result of the next value in the Handle Sequence. ReturningWork nextValReturningWork = new ReturningWork() { @@ -123,15 +147,16 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl // Determine what dialect we are using for this DB DialectResolver dialectResolver = new StandardDialectResolver(); - Dialect dialect = dialectResolver - .resolveDialect(new DatabaseMetaDataDialectResolutionInfoAdapter(connection.getMetaData())); + Dialect dialect = dialectResolver.resolveDialect(new DatabaseMetaDataDialectResolutionInfoAdapter(connection.getMetaData())); // Find the next value in our sequence (based on DB dialect) - try (PreparedStatement preparedStatement = connection - .prepareStatement(dialect.getSequenceNextValString(HANDLE_SEQUENCE))) { + try (PreparedStatement preparedStatement = connection.prepareStatement(dialect.getSequenceNextValString(HANDLE_SEQUENCE))) + { // Execute query and return results - try (ResultSet resultSet = preparedStatement.executeQuery()) { - if (resultSet.next()) { + try(ResultSet resultSet = preparedStatement.executeQuery()) + { + if(resultSet.next()) + { // Return result of query (from first column) nextVal = resultSet.getLong(1); } diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java index aee60639c3..012c8b1994 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java @@ -7,21 +7,23 @@ */ package org.dspace.harvest.dao.impl; +import org.dspace.content.Bitstream; +import org.dspace.content.Bitstream_; +import org.dspace.content.Collection; +import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.harvest.HarvestedCollection; +import org.dspace.harvest.HarvestedCollection_; +import org.dspace.harvest.dao.HarvestedCollectionDAO; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import java.sql.SQLException; import java.util.Date; +import java.util.LinkedList; import java.util.List; -import org.dspace.content.Collection; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.core.Context; -import org.dspace.harvest.HarvestedCollection; -import org.dspace.harvest.dao.HarvestedCollectionDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.LogicalExpression; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; - /** * Hibernate implementation of the Database Access Object interface class for the HarvestedCollection object. * This class is responsible for all database calls for the HarvestedCollection object and is autowired by spring @@ -29,108 +31,192 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO - implements HarvestedCollectionDAO { - protected HarvestedCollectionDAOImpl() { +public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO implements HarvestedCollectionDAO +{ + protected HarvestedCollectionDAOImpl() + { super(); } @Override - public HarvestedCollection findByStatusAndMinimalTypeOrderByLastHarvestedDesc(Context context, int status, int type, - int limit) throws SQLException { -// Old query: "select collection_id from harvested_collection where harvest_type > ? and harvest_status = ? -// order by last_harvested desc limit 1"; - Criteria criteria = getByStatusAndMinimalTypeCriteria(context, status, type, limit); - criteria.addOrder(Order.desc("lastHarvested")); - return singleResult(criteria); + public HarvestedCollection findByStatusAndMinimalTypeOrderByLastHarvestedDesc(Context context, int status, int type, int limit) throws SQLException { +// Old query: "select collection_id from harvested_collection where harvest_type > ? and harvest_status = ? order by last_harvested desc limit 1"; + //TODO RAF CHECK +// Criteria criteria = getByStatusAndMinimalTypeCriteria(context, status, type, limit); +// criteria.addOrder(Order.desc("lastHarvested")); +// return singleResult(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.desc(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested))); + criteriaQuery.orderBy(orderList); + + return singleResult(context, criteriaQuery); } @Override - public HarvestedCollection findByStatusAndMinimalTypeOrderByLastHarvestedAsc(Context context, int status, int type, - int limit) throws SQLException { -// Old query: "select collection_id from harvested_collection where harvest_type > ? and harvest_status = ? -// order by last_harvested asc limit 1"; - Criteria criteria = getByStatusAndMinimalTypeCriteria(context, status, type, limit); - criteria.addOrder(Order.asc("lastHarvested")); - return singleResult(criteria); + public HarvestedCollection findByStatusAndMinimalTypeOrderByLastHarvestedAsc(Context context, int status, int type, int limit) throws SQLException { +// Old query: "select collection_id from harvested_collection where harvest_type > ? and harvest_status = ? order by last_harvested asc limit 1"; + //TODO RAF CHECK +// Criteria criteria = getByStatusAndMinimalTypeCriteria(context, status, type, limit); +// criteria.addOrder(Order.asc("lastHarvested")); +// return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested))); + criteriaQuery.orderBy(orderList); + + return singleResult(context, criteriaQuery); } @Override public List findByStatus(Context context, int status) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedCollection.class); - criteria.add(Restrictions.eq("harvestStatus", status)); - return list(criteria); +// Criteria criteria = createCriteria(context, HarvestedCollection.class); +// criteria.add(Restrictions.eq("harvestStatus", status)); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + criteriaQuery.where(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); + return list(context, criteriaQuery, false, HarvestedCollection.class, -1, -1); } @Override public HarvestedCollection findByCollection(Context context, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedCollection.class); - criteria.add(Restrictions.eq("collection", collection)); - return singleResult(criteria); +// Criteria criteria = createCriteria(context, HarvestedCollection.class); +// criteria.add(Restrictions.eq("collection", collection)); +// return singleResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + criteriaQuery.where(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.collection), collection)); + return singleResult(context, criteriaQuery); } @Override - public List - findByLastHarvestedAndHarvestTypeAndHarvestStatusesAndHarvestTime(Context context, Date startTime, - int minimalType, int[] statuses, - int expirationStatus, Date expirationTime) - throws SQLException { + public List findByLastHarvestedAndHarvestTypeAndHarvestStatusesAndHarvestTime(Context context, Date startTime, int minimalType, int[] statuses, int expirationStatus, Date expirationTime) throws SQLException { // Old query: "SELECT * FROM harvested_collection WHERE -// (last_harvested < ? or last_harvested is null) and harvest_type > ? and (harvest_status = ? or harvest_status = ? -// or (harvest_status=? and harvest_start_time < ?)) ORDER BY last_harvested", -// new java.sql.Timestamp(startTime.getTime()), 0, HarvestedCollection.STATUS_READY, -// HarvestedCollection.STATUS_OAI_ERROR, HarvestedCollection.STATUS_BUSY, new java.sql.Timestamp(expirationTime -// .getTime())); - Criteria criteria = createCriteria(context, HarvestedCollection.class); - LogicalExpression lastHarvestedRestriction = Restrictions.or( - Restrictions.lt("lastHarvested", startTime), - Restrictions.isNull("lastHarvested") - ); - Disjunction statusRestriction = Restrictions.or(); - for (int status : statuses) { - statusRestriction.add(Restrictions.eq("harvestStatus", status)); +// (last_harvested < ? or last_harvested is null) and harvest_type > ? and (harvest_status = ? or harvest_status = ? or (harvest_status=? and harvest_start_time < ?)) ORDER BY last_harvested", +// new java.sql.Timestamp(startTime.getTime()), 0, HarvestedCollection.STATUS_READY, HarvestedCollection.STATUS_OAI_ERROR, HarvestedCollection.STATUS_BUSY, new java.sql.Timestamp(expirationTime.getTime())); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, HarvestedCollection.class); +// LogicalExpression lastHarvestedRestriction = Restrictions.or( +// Restrictions.lt("lastHarvested", startTime), +// Restrictions.isNull("lastHarvested") +// ); +// Disjunction statusRestriction = Restrictions.or(); +// for (int status : statuses) { +// statusRestriction.add(Restrictions.eq("harvestStatus", status)); +// } +// statusRestriction.add( +// Restrictions.and( +// Restrictions.eq("harvestStatus", expirationStatus), +// Restrictions.gt("harvestStartTime", expirationTime) +// ) +// ); +// +// criteria.add( +// Restrictions.and( +// lastHarvestedRestriction, +// Restrictions.gt("harvestType", minimalType), +// statusRestriction +// +// ) +// ); +// criteria.addOrder(Order.asc("lastHarvested")); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + + Predicate orPredicate = criteriaBuilder.or(criteriaBuilder.lessThan(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested), startTime), + criteriaBuilder.isNull(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested)) + ); + + List orPredicates = new LinkedList<>(); + + for(int status : statuses){ + orPredicates.add(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); } - statusRestriction.add( - Restrictions.and( - Restrictions.eq("harvestStatus", expirationStatus), - Restrictions.gt("harvestStartTime", expirationTime) - ) - ); - criteria.add( - Restrictions.and( - lastHarvestedRestriction, - Restrictions.gt("harvestType", minimalType), - statusRestriction + Predicate andPredicate = criteriaBuilder.and(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), expirationStatus), + criteriaBuilder.greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestStartTime), expirationTime) + ); + + orPredicates.add(andPredicate); + + Predicate secondPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[]{})); + + criteriaQuery.where(criteriaBuilder.and(orPredicate, + criteriaBuilder.greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestType), minimalType), + secondPredicate + ) + ); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, HarvestedCollection.class, -1, -1); + - ) - ); - criteria.addOrder(Order.asc("lastHarvested")); - return list(criteria); } @Override public int count(Context context) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedCollection.class); - return count(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, HarvestedCollection.class); +// return count(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + return count(context, criteriaQuery, criteriaBuilder, harvestedCollectionRoot); } - protected Criteria getByStatusAndMinimalTypeCriteria(Context context, int status, int type, int limit) - throws SQLException { - Criteria criteria = createCriteria(context, HarvestedCollection.class); - criteria.add( - Restrictions.and( - Restrictions.gt("harvestType", type), - Restrictions.eq("harvestStatus", status) - ) - ); - if (limit != -1) { - criteria.setMaxResults(1); - } - return criteria; + protected CriteriaQuery getByStatusAndMinimalTypeCriteria(Context context, int status, int type, int limit) throws SQLException { +// Criteria criteria = createCriteria(context, HarvestedCollection.class); +// criteria.add( +// Restrictions.and( +// Restrictions.gt("harvestType", type), +// Restrictions.eq("harvestStatus", status) +// ) +// ); +// if(limit != -1) +// { +// criteria.setMaxResults(1); +// } +// return criteria; + + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestType), type), + criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status) + ) + ); + return criteriaQuery; } } diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java index 73ed113b70..627c2e1e0e 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java @@ -7,17 +7,24 @@ */ package org.dspace.harvest.dao.impl; -import java.sql.SQLException; - import org.dspace.content.Collection; import org.dspace.content.Item; -import org.dspace.core.AbstractHibernateDAO; +import org.dspace.content.Item_; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.harvest.HarvestedItem; +import org.dspace.harvest.HarvestedItem_; import org.dspace.harvest.dao.HarvestedItemDAO; +import org.dspace.identifier.DOI; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; +import java.sql.SQLException; + /** * Hibernate implementation of the Database Access Object interface class for the HarvestedItem object. * This class is responsible for all database calls for the HarvestedItem object and is autowired by spring @@ -25,28 +32,51 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class HarvestedItemDAOImpl extends AbstractHibernateDAO implements HarvestedItemDAO { - protected HarvestedItemDAOImpl() { +public class HarvestedItemDAOImpl extends AbstractHibernateDAO implements HarvestedItemDAO +{ + protected HarvestedItemDAOImpl() + { super(); } @Override public HarvestedItem findByItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedItem.class); - criteria.add(Restrictions.eq("item", item)); - return singleResult(criteria); +// Criteria criteria = createCriteria(context, HarvestedItem.class); +// criteria.add(Restrictions.eq("item", item)); +// return singleResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedItem.class); + Root harvestedItemRoot = criteriaQuery.from(HarvestedItem.class); + criteriaQuery.select(harvestedItemRoot); + criteriaQuery.where(criteriaBuilder.equal(harvestedItemRoot.get(HarvestedItem_.item), item)); + return singleResult(context, criteriaQuery); } @Override public HarvestedItem findByOAIId(Context context, String itemOaiID, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedItem.class); - criteria.createAlias("item", "i"); - criteria.add( - Restrictions.and( - Restrictions.eq("oaiId", itemOaiID), - Restrictions.eq("i.owningCollection", collection) - ) - ); - return singleResult(criteria); + + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, HarvestedItem.class); +// criteria.createAlias("item", "i"); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("oaiId", itemOaiID), +// Restrictions.eq("i.owningCollection", collection) +// ) +// ); +// return singleResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedItem.class); + Root harvestedItemRoot = criteriaQuery.from(HarvestedItem.class); + Join join = harvestedItemRoot.join("item"); + criteriaQuery.select(harvestedItemRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(harvestedItemRoot.get(HarvestedItem_.oaiId), itemOaiID), + criteriaBuilder.equal(join.get(Item_.owningCollection), collection) + ) + ); + return singleResult(context, criteriaQuery); + } } diff --git a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java index f62cf0e99e..71915cea2b 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java @@ -7,19 +7,26 @@ */ package org.dspace.identifier.dao.impl; -import java.sql.SQLException; -import java.util.List; - import org.dspace.content.DSpaceObject; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.identifier.DOI; +import org.dspace.identifier.DOI_; import org.dspace.identifier.dao.DOIDAO; +import org.dspace.workflowbasic.BasicWorkflowItem; import org.hibernate.Criteria; import org.hibernate.criterion.Conjunction; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the DOI object. * This class is responsible for all database calls for the DOI object and is autowired by spring @@ -27,81 +34,155 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { - protected DOIDAOImpl() { +public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO +{ + protected DOIDAOImpl() + { super(); } @Override public DOI findByDoi(Context context, String doi) throws SQLException { - Criteria criteria = createCriteria(context, DOI.class); - criteria.add(Restrictions.eq("doi", doi)); - return uniqueResult(criteria); +// Criteria criteria = createCriteria(context, DOI.class); +// criteria.add(Restrictions.eq("doi", doi)); +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + criteriaQuery.where(criteriaBuilder.equal(doiRoot.get(DOI_.doi), doi)); + return uniqueResult(context, criteriaQuery, false, DOI.class, -1, -1); } @Override - public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List statusToExclude) - throws SQLException { - //SELECT * FROM Doi WHERE resource_type_id = ? AND resource_id = ? AND resource_id = ? AND ((status != ? AND - // status != ?) OR status IS NULL) - Criteria criteria = createCriteria(context, DOI.class); - Disjunction statusQuery = Restrictions.or(); - Conjunction statusConjunctionAnd = Restrictions.and(); - for (Integer status : statusToExclude) { - statusConjunctionAnd.add(Restrictions.not(Restrictions.eq("status", status))); - } - statusQuery.add(statusConjunctionAnd); - statusQuery.add(Restrictions.isNull("status")); - criteria.add( - Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - statusQuery + public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List statusToExclude) throws SQLException { + //SELECT * FROM Doi WHERE resource_type_id = ? AND resource_id = ? AND resource_id = ? AND ((status != ? AND status != ?) OR status IS NULL) - ) - ); - return singleResult(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, DOI.class); +// Disjunction statusQuery = Restrictions.or(); +// Conjunction statusConjunctionAnd = Restrictions.and(); +// for (Integer status : statusToExclude) { +// statusConjunctionAnd.add(Restrictions.not(Restrictions.eq("status", status))); +// } +// statusQuery.add(statusConjunctionAnd); +// statusQuery.add(Restrictions.isNull("status")); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("dSpaceObject", dso), +// statusQuery +// +// ) +// ); +// return singleResult(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + + List listToIncludeInOrPredicate = new LinkedList<>(); + + for(Integer status : statusToExclude){ + listToIncludeInOrPredicate.add(criteriaBuilder.notEqual(doiRoot.get(DOI_.status), status)); + } + listToIncludeInOrPredicate.add(criteriaBuilder.isNull(doiRoot.get(DOI_.status))); + + Predicate orPredicate = criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[]{})); + + criteriaQuery.where(criteriaBuilder.and(orPredicate, + criteriaBuilder.equal(doiRoot.get(DOI_.dSpaceObject), dso) + ) + ); + + return singleResult(context, criteriaQuery); } @Override public List findByStatus(Context context, List statuses) throws SQLException { - Criteria criteria = createCriteria(context, DOI.class); - Disjunction statusQuery = Restrictions.or(); - for (Integer status : statuses) { - statusQuery.add(Restrictions.eq("status", status)); +// Criteria criteria = createCriteria(context, DOI.class); +// Disjunction statusQuery = Restrictions.or(); +// for (Integer status : statuses) { +// statusQuery.add(Restrictions.eq("status", status)); +// } +// criteria.add(statusQuery); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + List orPredicates = new LinkedList<>(); + for( Integer status : statuses){ + orPredicates.add(criteriaBuilder.equal(doiRoot.get(DOI_.status), status)); } - criteria.add(statusQuery); - return list(criteria); + criteriaQuery.where(criteriaBuilder.or(orPredicates.toArray(new Predicate[]{}))); + return list(context, criteriaQuery, false, DOI.class, -1, -1); } - + @Override - public List findSimilarNotInState(Context context, String doi, List excludedStatuses, - boolean dsoNotNull) - throws SQLException { - // SELECT * FROM Doi WHERE doi LIKE ? AND resource_type_id = ? AND resource_id IS NOT NULL AND status != ? - // AND status != ? - Criteria criteria = createCriteria(context, DOI.class); - Conjunction conjunctionAnd = Restrictions.and(); - Disjunction statusQuery = Restrictions.or(); - for (Integer status : excludedStatuses) { - statusQuery.add(Restrictions.ne("status", status)); + public List findSimilarNotInState(Context context, String doi, List excludedStatuses, boolean dsoNotNull) + throws SQLException + { + // SELECT * FROM Doi WHERE doi LIKE ? AND resource_type_id = ? AND resource_id IS NOT NULL AND status != ? AND status != ? + + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, DOI.class); +// Conjunction conjunctionAnd = Restrictions.and(); +// Disjunction statusQuery = Restrictions.or(); +// for (Integer status : excludedStatuses) { +// statusQuery.add(Restrictions.ne("status", status)); +// } +// conjunctionAnd.add(Restrictions.like("doi", doi)); +// conjunctionAnd.add(statusQuery); +// if (dsoNotNull) +// { +// conjunctionAnd.add(Restrictions.isNotNull("dSpaceObject")); +// } +// criteria.add(conjunctionAnd); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + + List listToIncludeInOrPredicate = new LinkedList<>(); + + for(Integer status: excludedStatuses){ + listToIncludeInOrPredicate.add(criteriaBuilder.notEqual(doiRoot.get(DOI_.status), status)); } - conjunctionAnd.add(Restrictions.like("doi", doi)); - conjunctionAnd.add(statusQuery); - if (dsoNotNull) { - conjunctionAnd.add(Restrictions.isNotNull("dSpaceObject")); + + List listToIncludeInAndPredicate = new LinkedList<>(); + + listToIncludeInAndPredicate.add(criteriaBuilder.like(doiRoot.get(DOI_.doi), doi)); + listToIncludeInAndPredicate.add(criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[]{}))); + if(dsoNotNull){ + listToIncludeInAndPredicate.add(criteriaBuilder.isNotNull(doiRoot.get(DOI_.dSpaceObject))); } - criteria.add(conjunctionAnd); - return list(criteria); + criteriaQuery.where(listToIncludeInAndPredicate.toArray(new Predicate[]{})); + return list(context, criteriaQuery, false, DOI.class, -1, -1); + + + } @Override public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso) throws SQLException { - Criteria criteria = createCriteria(context, DOI.class); - criteria.add( - Restrictions.and( - Restrictions.eq("dSpaceObject", dso) - ) - ); - return singleResult(criteria); +// Criteria criteria = createCriteria(context, DOI.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("dSpaceObject", dso) +// ) +// ); +// return singleResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + criteriaQuery.where(criteriaBuilder.equal(doiRoot.get(DOI_.dSpaceObject), dso)); + return singleResult(context, criteriaQuery); } } diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java index d93026bd44..35417d909c 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java @@ -7,19 +7,25 @@ */ package org.dspace.versioning.dao.impl; -import java.sql.SQLException; -import java.util.List; - import org.dspace.content.Item; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.harvest.HarvestedCollection; +import org.dspace.harvest.HarvestedCollection_; import org.dspace.versioning.Version; import org.dspace.versioning.VersionHistory; +import org.dspace.versioning.Version_; import org.dspace.versioning.dao.VersionDAO; import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the Version object. @@ -32,36 +38,62 @@ import org.hibernate.criterion.Restrictions; * @author kevinvandevelde at atmire.com * @author Pascal-Nicolas Becker (dspace at pascal dash becker dot de) */ -public class VersionDAOImpl extends AbstractHibernateDAO implements VersionDAO { - protected VersionDAOImpl() { +public class VersionDAOImpl extends AbstractHibernateDAO implements VersionDAO +{ + protected VersionDAOImpl() + { super(); } @Override public Version findByItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, Version.class); - criteria.add(Restrictions.eq("item", item)); - return singleResult(criteria); +// Criteria criteria = createCriteria(context, Version.class); +// criteria.add(Restrictions.eq("item", item)); +// return singleResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Version.class); + Root versionRoot = criteriaQuery.from(Version.class); + criteriaQuery.select(versionRoot); + criteriaQuery.where(criteriaBuilder.equal(versionRoot.get(Version_.item), item)); + return singleResult(context, criteriaQuery); } @Override public int getNextVersionNumber(Context c, VersionHistory vh) throws SQLException { - Query q = this.createQuery(c, - "SELECT (COALESCE(MAX(versionNumber), 0) + 1) " - + "FROM Version WHERE versionHistory.id = :historyId"); + Query q = this.createQuery(c, + "SELECT (COALESCE(MAX(versionNumber), 0) + 1) " + + "FROM Version WHERE versionHistory.id = :historyId"); q.setParameter("historyId", vh.getID()); - int next = (Integer) q.uniqueResult(); + int next = (Integer) q.getSingleResult(); return next; } - + @Override public List findVersionsWithItems(Context context, VersionHistory versionHistory) - throws SQLException { - Criteria criteria = createCriteria(context, Version.class); - criteria.add(Restrictions.eq("versionHistory", versionHistory)); - criteria.add(Restrictions.and(Restrictions.isNotNull("item"))); - criteria.addOrder(Order.desc("versionNumber")); - return list(criteria); + throws SQLException + { + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, Version.class); +// criteria.add(Restrictions.eq("versionHistory", versionHistory)); +// criteria.add(Restrictions.and(Restrictions.isNotNull("item"))); +// criteria.addOrder(Order.desc("versionNumber")); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Version.class); + Root versionRoot = criteriaQuery.from(Version.class); + criteriaQuery.select(versionRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(versionRoot.get(Version_.versionHistory), versionHistory), + criteriaBuilder.isNotNull(versionRoot.get(Version_.item)) + ) + ); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.desc(versionRoot.get(Version_.versionNumber))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, false, Version.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java index 49e3331b23..0cae0d85f0 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java @@ -7,17 +7,29 @@ */ package org.dspace.versioning.dao.impl; -import java.sql.SQLException; - +import org.dspace.content.BitstreamFormat_; import org.dspace.content.Item; -import org.dspace.core.AbstractHibernateDAO; +import org.dspace.content.Item_; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.versioning.VersionHistory; +import org.dspace.versioning.Version_; import org.dspace.versioning.dao.VersionHistoryDAO; +import org.dspace.workflowbasic.BasicWorkflowItem; import org.hibernate.Criteria; -import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; +import org.dspace.versioning.Version; +import org.hibernate.criterion.Order; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; + /** * Hibernate implementation of the Database Access Object interface class for the VersionHistory object. * This class is responsible for all database calls for the VersionHistory object and is autowired by spring @@ -28,17 +40,34 @@ import org.hibernate.criterion.Restrictions; * @author Ben Bosman (ben at atmire dot com) * @author kevinvandevelde at atmire.com */ -public class VersionHistoryDAOImpl extends AbstractHibernateDAO implements VersionHistoryDAO { - protected VersionHistoryDAOImpl() { +public class VersionHistoryDAOImpl extends AbstractHibernateDAO implements VersionHistoryDAO +{ + protected VersionHistoryDAOImpl() + { super(); } @Override public VersionHistory findByItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, VersionHistory.class); - criteria.createAlias("versions", "v"); - criteria.add(Restrictions.eq("v.item", item)); - criteria.addOrder(Order.desc("v.versionNumber")); - return singleResult(criteria); + + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, VersionHistory.class); +// criteria.createAlias("versions", "v"); +// criteria.add(Restrictions.eq("v.item", item)); +// criteria.addOrder(Order.desc("v.versionNumber")); +// return singleResult(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, VersionHistory.class); + Root versionHistoryRoot = criteriaQuery.from(VersionHistory.class); + Join join = versionHistoryRoot.join("versions"); + criteriaQuery.select(versionHistoryRoot); + criteriaQuery.where(criteriaBuilder.equal(join.get(Version_.item), item)); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.desc(join.get(Version_.versionNumber))); + criteriaQuery.orderBy(orderList); + + return singleResult(context, criteriaQuery); } } diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java index 358e0923a6..e6a07cf6ff 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java @@ -7,21 +7,27 @@ */ package org.dspace.workflowbasic.dao.impl; -import java.sql.SQLException; -import java.util.List; - import org.dspace.content.Collection; import org.dspace.content.Item; -import org.dspace.core.AbstractHibernateDAO; +import org.dspace.content.Item_; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; import org.dspace.workflowbasic.BasicWorkflowItem; +import org.dspace.workflowbasic.BasicWorkflowItem_; import org.dspace.workflowbasic.dao.BasicWorkflowItemDAO; import org.hibernate.Criteria; -import org.hibernate.Query; +import javax.persistence.Query; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the BasicWorkflowItem object. * This class is responsible for all database calls for the BasicWorkflowItem object and is autowired by spring @@ -29,41 +35,68 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO implements BasicWorkflowItemDAO { - protected BasicWorkflowItemDAOImpl() { +public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO implements BasicWorkflowItemDAO +{ + protected BasicWorkflowItemDAOImpl() + { super(); } @Override public BasicWorkflowItem findByItem(Context context, Item i) throws SQLException { - Criteria criteria = createCriteria(context, BasicWorkflowItem.class); - criteria.add(Restrictions.eq("item", i)); +// Criteria criteria = createCriteria(context, BasicWorkflowItem.class); +// criteria.add(Restrictions.eq("item", i)); // Look for the unique WorkflowItem entry where 'item_id' references this item - return uniqueResult(criteria); +// return uniqueResult(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); + Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); + criteriaQuery.select(basicWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(basicWorkflowItemRoot.get(BasicWorkflowItem_.item), i)); + return uniqueResult(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } @Override - public List findBySubmitter(Context context, EPerson ep) throws SQLException { - Criteria criteria = createCriteria(context, BasicWorkflowItem.class); - criteria.createAlias("item", "i"); - criteria.add(Restrictions.eq("i.submitter", ep)); - criteria.addOrder(Order.asc("workflowitemId")); - return list(criteria); + public List findBySubmitter(Context context, EPerson ep) throws SQLException + { + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, BasicWorkflowItem.class); +// criteria.createAlias("item", "i"); +// criteria.add(Restrictions.eq("i.submitter", ep)); +// criteria.addOrder(Order.asc("workflowitemId")); +// return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); + Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); + Join join = basicWorkflowItemRoot.join("item"); + criteriaQuery.select(basicWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(join.get(Item_.submitter), ep)); + return list(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } @Override - public List findByCollection(Context context, Collection c) throws SQLException { - Criteria criteria = createCriteria(context, BasicWorkflowItem.class); - criteria.add(Restrictions.eq("collection", c)); - return list(criteria); + public List findByCollection(Context context, Collection c) throws SQLException + { +// Criteria criteria = createCriteria(context, BasicWorkflowItem.class); +// criteria.add(Restrictions.eq("collection", c)); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); + Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); + criteriaQuery.select(basicWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(basicWorkflowItemRoot.get(BasicWorkflowItem_.collection), c)); + return list(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } @Override - public List findByPooledTasks(Context context, EPerson ePerson) throws SQLException { - String queryString = "select wf from TaskListItem as tli join tli.workflowItem wf where tli.ePerson = " + - ":eperson ORDER BY wf.workflowitemId"; + public List findByPooledTasks(Context context, EPerson ePerson) throws SQLException + { + String queryString = "select wf from TaskListItem as tli join tli.workflowItem wf where tli.ePerson = :eperson ORDER BY wf.workflowitemId"; Query query = createQuery(context, queryString); query.setParameter("eperson", ePerson); return list(query); @@ -71,9 +104,16 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO findByOwner(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, BasicWorkflowItem.class); - criteria.add(Restrictions.eq("owner", ePerson)); - return list(criteria); +// Criteria criteria = createCriteria(context, BasicWorkflowItem.class); +// criteria.add(Restrictions.eq("owner", ePerson)); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); + Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); + criteriaQuery.select(basicWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(basicWorkflowItemRoot.get(BasicWorkflowItem_.owner), ePerson)); + return list(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } @Override diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java index 173d09dcc0..7bcef0237e 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java @@ -7,18 +7,22 @@ */ package org.dspace.workflowbasic.dao.impl; -import java.sql.SQLException; -import java.util.List; - -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; +import org.dspace.harvest.HarvestedItem; import org.dspace.workflowbasic.BasicWorkflowItem; import org.dspace.workflowbasic.TaskListItem; +import org.dspace.workflowbasic.TaskListItem_; import org.dspace.workflowbasic.dao.TaskListItemDAO; import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.criterion.Restrictions; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the TaskListItem object. @@ -27,8 +31,10 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class TaskListItemDAOImpl extends AbstractHibernateDAO implements TaskListItemDAO { - protected TaskListItemDAOImpl() { +public class TaskListItemDAOImpl extends AbstractHibernateDAO implements TaskListItemDAO +{ + protected TaskListItemDAOImpl() + { super(); } @@ -42,8 +48,15 @@ public class TaskListItemDAOImpl extends AbstractHibernateDAO impl @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, TaskListItem.class); - criteria.add(Restrictions.eq("ePerson", ePerson)); - return list(criteria); +// Criteria criteria = createCriteria(context, TaskListItem.class); +// criteria.add(Restrictions.eq("ePerson", ePerson)); +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, TaskListItem.class); + Root taskListItemRoot = criteriaQuery.from(TaskListItem.class); + criteriaQuery.select(taskListItemRoot); + criteriaQuery.where(criteriaBuilder.equal(taskListItemRoot.get(TaskListItem_.ePerson), ePerson)); + return list(context, criteriaQuery, false, TaskListItem.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java index 9db89d6317..07c3422631 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java @@ -7,18 +7,23 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import java.sql.SQLException; -import java.util.List; - -import org.dspace.core.AbstractHibernateDAO; +import org.dspace.content.WorkspaceItem; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; import org.dspace.xmlworkflow.storedcomponents.ClaimedTask; +import org.dspace.xmlworkflow.storedcomponents.ClaimedTask_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.ClaimedTaskDAO; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the ClaimedTask object. * This class is responsible for all database calls for the ClaimedTask object and is autowired by spring @@ -26,86 +31,149 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implements ClaimedTaskDAO { - protected ClaimedTaskDAOImpl() { +public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implements ClaimedTaskDAO +{ + protected ClaimedTaskDAOImpl() + { super(); } @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.eq("workflowItem", workflowItem)); - - return list(criteria); +// Criteria criteria = createCriteria(context, ClaimedTask.class); +// criteria.add(Restrictions.eq("workflowItem", workflowItem)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem)); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override - public ClaimedTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) - throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("owner", ePerson) - )); + public ClaimedTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { +// Criteria criteria = createCriteria(context, ClaimedTask.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("owner", ePerson) +// )); +// +// return uniqueResult(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson) + ) + ); + return uniqueResult(context, criteriaQuery, false, ClaimedTask.class, -1, -1); + - return uniqueResult(criteria); } @Override public List findByEperson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.eq("owner", ePerson)); - - return list(criteria); +// Criteria criteria = createCriteria(context, ClaimedTask.class); +// criteria.add(Restrictions.eq("owner", ePerson)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson)); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override - public List findByWorkflowItemAndStepId(Context context, XmlWorkflowItem workflowItem, String stepID) - throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("stepId", stepID) - )); - - return list(criteria); + public List findByWorkflowItemAndStepId(Context context, XmlWorkflowItem workflowItem, String stepID) throws SQLException { +// Criteria criteria = createCriteria(context, ClaimedTask.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("stepId", stepID) +// )); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID) + ) + ); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override - public ClaimedTask findByEPersonAndWorkflowItemAndStepIdAndActionId(Context context, EPerson ePerson, - XmlWorkflowItem workflowItem, String stepID, - String actionID) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("owner", ePerson), - Restrictions.eq("stepId", stepID), - Restrictions.eq("actionId", actionID) - )); - - return uniqueResult(criteria); + public ClaimedTask findByEPersonAndWorkflowItemAndStepIdAndActionId(Context context, EPerson ePerson, XmlWorkflowItem workflowItem, String stepID, String actionID) throws SQLException { +// Criteria criteria = createCriteria(context, ClaimedTask.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("owner", ePerson), +// Restrictions.eq("stepId", stepID), +// Restrictions.eq("actionId", actionID) +// )); +// +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.actionId), actionID) + ) + ); + return uniqueResult(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override - public List findByWorkflowItemAndStepIdAndActionId(Context context, XmlWorkflowItem workflowItem, - String stepID, String actionID) - throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("stepId", stepID), - Restrictions.eq("actionId", actionID) - )); - - return list(criteria); + public List findByWorkflowItemAndStepIdAndActionId(Context context, XmlWorkflowItem workflowItem, String stepID, String actionID) throws SQLException { +// Criteria criteria = createCriteria(context, ClaimedTask.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("stepId", stepID), +// Restrictions.eq("actionId", actionID) +// )); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.actionId), actionID) + ) + ); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override public List findByStep(Context context, String stepID) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.eq("stepId", stepID)); - - return list(criteria); +// Criteria criteria = createCriteria(context, ClaimedTask.class); +// criteria.add(Restrictions.eq("stepId", stepID)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID)); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java index db83d472e5..f7a7d7a950 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java @@ -7,17 +7,21 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import java.sql.SQLException; -import java.util.List; - import org.dspace.content.Collection; -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.xmlworkflow.storedcomponents.CollectionRole; +import org.dspace.xmlworkflow.storedcomponents.CollectionRole_; +import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.CollectionRoleDAO; import org.hibernate.Criteria; -import org.hibernate.Query; import org.hibernate.criterion.Restrictions; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the CollectionRole object. @@ -26,30 +30,49 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class CollectionRoleDAOImpl extends AbstractHibernateDAO implements CollectionRoleDAO { - protected CollectionRoleDAOImpl() { +public class CollectionRoleDAOImpl extends AbstractHibernateDAO implements CollectionRoleDAO +{ + protected CollectionRoleDAOImpl() + { super(); } @Override public List findByCollection(Context context, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, CollectionRole.class); - criteria.add(Restrictions.eq("collection", collection)); - - return list(criteria); +// Criteria criteria = createCriteria(context, CollectionRole.class); +// criteria.add(Restrictions.eq("collection", collection)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CollectionRole.class); + Root collectionRoleRoot = criteriaQuery.from(CollectionRole.class); + criteriaQuery.select(collectionRoleRoot); + criteriaQuery.where(criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.collection), collection)); + return list(context, criteriaQuery, false, CollectionRole.class, -1, -1); } @Override - public CollectionRole findByCollectionAndRole(Context context, Collection collection, String role) - throws SQLException { - Criteria criteria = createCriteria(context, CollectionRole.class); - criteria.add(Restrictions.and( - Restrictions.eq("collection", collection), - Restrictions.eq("roleId", role) - ) - ); - - return uniqueResult(criteria); + public CollectionRole findByCollectionAndRole(Context context, Collection collection, String role) throws SQLException { +// Criteria criteria = createCriteria(context, CollectionRole.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("collection", collection), +// Restrictions.eq("roleId", role) +// ) +// ); +// +// return uniqueResult(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CollectionRole.class); + Root collectionRoleRoot = criteriaQuery.from(CollectionRole.class); + criteriaQuery.select(collectionRoleRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.collection), collection), + criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.roleId), role) + ) + ); + return uniqueResult(context, criteriaQuery, false, CollectionRole.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java index 60e9316c6b..1648646154 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java @@ -7,18 +7,23 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import java.sql.SQLException; -import java.util.List; - -import org.dspace.core.AbstractHibernateDAO; +import org.dspace.content.Community; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; import org.dspace.xmlworkflow.storedcomponents.InProgressUser; +import org.dspace.xmlworkflow.storedcomponents.InProgressUser_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.InProgressUserDAO; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the InProgressUser object. * This class is responsible for all database calls for the InProgressUser object and is autowired by spring @@ -26,62 +31,115 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class InProgressUserDAOImpl extends AbstractHibernateDAO implements InProgressUserDAO { - protected InProgressUserDAOImpl() { +public class InProgressUserDAOImpl extends AbstractHibernateDAO implements InProgressUserDAO +{ + protected InProgressUserDAOImpl() + { super(); } @Override - public InProgressUser findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) - throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("ePerson", ePerson) - ) - ); - return uniqueResult(criteria); + public InProgressUser findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { +// Criteria criteria = createCriteria(context, InProgressUser.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("ePerson", ePerson) +// ) +// ); +// return uniqueResult(criteria); +// +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + criteriaQuery.select(inProgressUserRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.ePerson),ePerson) + ) + ); + return uniqueResult(context, criteriaQuery, false, InProgressUser.class, -1, -1); + } @Override public List findByEperson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add(Restrictions.eq("ePerson", ePerson)); - - return list(criteria); +// Criteria criteria = createCriteria(context, InProgressUser.class); +// criteria.add(Restrictions.eq("ePerson", ePerson)); +// +// return list(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + criteriaQuery.select(inProgressUserRoot); + criteriaQuery.where(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.ePerson), ePerson)); + return list(context, criteriaQuery, false, InProgressUser.class, -1, -1); } @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add(Restrictions.eq("workflowItem", workflowItem)); - - return list(criteria); +// Criteria criteria = createCriteria(context, InProgressUser.class); +// criteria.add(Restrictions.eq("workflowItem", workflowItem)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + criteriaQuery.select(inProgressUserRoot); + criteriaQuery.where(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem)); + return list(context, criteriaQuery, false, InProgressUser.class, -1, -1); } @Override public int countInProgressUsers(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("finished", false) - ) - ); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, InProgressUser.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("finished", false) +// ) +// ); +// +// return count(criteria); - return count(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.finished), false) + ) + ); + return count(context, criteriaQuery, criteriaBuilder, inProgressUserRoot); } @Override public int countFinishedUsers(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("finished", true) - ) + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, InProgressUser.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("finished", true) +// ) +// ); +// return count(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.finished), true) + ) ); - return count(criteria); + return count(context, criteriaQuery, criteriaBuilder, inProgressUserRoot); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java index ea20e79db5..14cac15293 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java @@ -7,19 +7,24 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import java.sql.SQLException; -import java.util.List; - -import org.dspace.core.AbstractHibernateDAO; +import org.dspace.content.Bitstream; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.xmlworkflow.storedcomponents.PoolTask; +import org.dspace.xmlworkflow.storedcomponents.PoolTask_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.PoolTaskDAO; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the PoolTask object. * This class is responsible for all database calls for the PoolTask object and is autowired by spring @@ -27,60 +32,102 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class PoolTaskDAOImpl extends AbstractHibernateDAO implements PoolTaskDAO { - protected PoolTaskDAOImpl() { +public class PoolTaskDAOImpl extends AbstractHibernateDAO implements PoolTaskDAO +{ + protected PoolTaskDAOImpl() + { super(); } @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add(Restrictions.eq("ePerson", ePerson)); +// Criteria criteria = createCriteria(context, PoolTask.class); +// criteria.add(Restrictions.eq("ePerson", ePerson)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.ePerson), ePerson)); + return list(context, criteriaQuery, false, PoolTask.class, -1, -1); - return list(criteria); } @Override public List findByGroup(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add(Restrictions.eq("group", group)); - - return list(criteria); +// Criteria criteria = createCriteria(context, PoolTask.class); +// criteria.add(Restrictions.eq("group", group)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.group), group)); + return list(context, criteriaQuery, false, PoolTask.class, -1, -1); } @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add(Restrictions.eq("workflowItem", workflowItem)); - - return list(criteria); +// Criteria criteria = createCriteria(context, PoolTask.class); +// criteria.add(Restrictions.eq("workflowItem", workflowItem)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem)); + return list(context, criteriaQuery, false, PoolTask.class, -1, -1); } @Override - public PoolTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) - throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("ePerson", ePerson) - ) - ); - - return uniqueResult(criteria); + public PoolTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { +// Criteria criteria = createCriteria(context, PoolTask.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("ePerson", ePerson) +// ) +// ); +// +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem), + criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.ePerson), ePerson) + ) + ); + return uniqueResult(context, criteriaQuery, false, PoolTask.class, -1, -1); } @Override - public PoolTask findByWorkflowItemAndGroup(Context context, Group group, XmlWorkflowItem workflowItem) - throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("group", group) - ) - ); - - return uniqueResult(criteria); + public PoolTask findByWorkflowItemAndGroup(Context context, Group group, XmlWorkflowItem workflowItem) throws SQLException { +// Criteria criteria = createCriteria(context, PoolTask.class); +// criteria.add( +// Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("group", group) +// ) +// ); +// +// return uniqueResult(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem), + criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.group), group) + ) + ); + return uniqueResult(context, criteriaQuery, false, PoolTask.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java index dfc75fd069..d1fb694f20 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java @@ -7,18 +7,23 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import java.sql.SQLException; -import java.util.List; - -import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; +import org.dspace.xmlworkflow.storedcomponents.PoolTask; import org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole; +import org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.WorkflowItemRoleDAO; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the WorkflowItemRole object. * This class is responsible for all database calls for the WorkflowItemRole object and is autowired by spring @@ -26,38 +31,62 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class WorkflowItemRoleDAOImpl extends AbstractHibernateDAO implements WorkflowItemRoleDAO { - protected WorkflowItemRoleDAOImpl() { +public class WorkflowItemRoleDAOImpl extends AbstractHibernateDAO implements WorkflowItemRoleDAO +{ + protected WorkflowItemRoleDAOImpl() + { super(); } @Override - public List findByWorkflowItemAndRole(Context context, XmlWorkflowItem workflowItem, String role) - throws SQLException { - Criteria criteria = createCriteria(context, WorkflowItemRole.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("role", role) - ) - ); - - return list(criteria); + public List findByWorkflowItemAndRole(Context context, XmlWorkflowItem workflowItem, String role) throws SQLException { +// Criteria criteria = createCriteria(context, WorkflowItemRole.class); +// criteria.add(Restrictions.and( +// Restrictions.eq("workflowItem", workflowItem), +// Restrictions.eq("role", role) +// ) +// ); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); + Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); + criteriaQuery.select(workflowItemRoleRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.workflowItem), workflowItem), + criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.roleId), role) + ) + ); + return list(context, criteriaQuery, false, WorkflowItemRole.class, -1, -1); } @Override - public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) - throws SQLException { - Criteria criteria = createCriteria(context, WorkflowItemRole.class); - criteria.add(Restrictions.eq("workflowItem", workflowItem)); - - return list(criteria); + public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { +// Criteria criteria = createCriteria(context, WorkflowItemRole.class); +// criteria.add(Restrictions.eq("workflowItem", workflowItem)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); + Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); + criteriaQuery.select(workflowItemRoleRoot); + criteriaQuery.where(criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.workflowItem), workflowItem)); + return list(context, criteriaQuery, false, WorkflowItemRole.class, -1, -1); } @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, WorkflowItemRole.class); - criteria.add(Restrictions.eq("ePerson", ePerson)); - - return list(criteria); +// Criteria criteria = createCriteria(context, WorkflowItemRole.class); +// criteria.add(Restrictions.eq("ePerson", ePerson)); +// +// return list(criteria); +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); + Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); + criteriaQuery.select(workflowItemRoleRoot); + criteriaQuery.where(criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.ePerson), ePerson)); + return list(context, criteriaQuery, false, WorkflowItemRole.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java index f32e3d9db7..51906bf773 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java @@ -7,19 +7,26 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import java.sql.SQLException; -import java.util.List; - import org.dspace.content.Collection; import org.dspace.content.Item; -import org.dspace.core.AbstractHibernateDAO; +import org.dspace.content.Item_; import org.dspace.core.Context; +import org.dspace.core.AbstractHibernateDAO; import org.dspace.eperson.EPerson; +import org.dspace.harvest.HarvestedCollection; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; +import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem_; import org.dspace.xmlworkflow.storedcomponents.dao.XmlWorkflowItemDAO; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; +import java.sql.SQLException; +import java.util.List; + /** * Hibernate implementation of the Database Access Object interface class for the XmlWorkflowItem object. * This class is responsible for all database calls for the XmlWorkflowItem object and is autowired by spring @@ -27,28 +34,49 @@ import org.hibernate.criterion.Restrictions; * * @author kevinvandevelde at atmire.com */ -public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO implements XmlWorkflowItemDAO { +public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO implements XmlWorkflowItemDAO +{ - protected XmlWorkflowItemDAOImpl() { + protected XmlWorkflowItemDAOImpl() + { super(); } @Override - public List findAllInCollection(Context context, Integer offset, Integer limit, - Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, XmlWorkflowItem.class); - if (collection != null) { - criteria.add(Restrictions.eq("collection", collection)); - } + public List findAllInCollection(Context context, Integer offset, Integer limit, Collection collection) throws SQLException { +// Criteria criteria = createCriteria(context, XmlWorkflowItem.class); +// if(collection != null) +// { +// criteria.add(Restrictions.eq("collection", collection)); +// } +// +// if(offset != null) +// { +// criteria.setFirstResult(offset); +// } +// if(limit != null) +// { +// criteria.setMaxResults(limit); +// } +// +// return list(criteria); - if (offset != null) { - criteria.setFirstResult(offset); - } - if (limit != null) { - criteria.setMaxResults(limit); - } - return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + criteriaQuery.select(xmlWorkflowItemRoot); + if(collection!=null){ + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), collection)); + } + if(offset == null){ + offset = -1; + } + if(limit != null){ + limit = -1; + } + return list(context, criteriaQuery, false, XmlWorkflowItem.class, limit, offset); } @Override @@ -58,35 +86,71 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + if(collection != null){ + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), collection)); } - return count(criteria); + return count(context, criteriaQuery, criteriaBuilder, xmlWorkflowItemRoot); } @Override public List findBySubmitter(Context context, EPerson ep) throws SQLException { - Criteria criteria = createCriteria(context, XmlWorkflowItem.class); - criteria.createAlias("item", "i"); - criteria.add(Restrictions.eq("i.submitter", ep)); - return list(criteria); + //TODO RAF CHECK +// Criteria criteria = createCriteria(context, XmlWorkflowItem.class); +// criteria.createAlias("item", "i"); +// criteria.add(Restrictions.eq("i.submitter", ep)); +// +// return list(criteria); +// +// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + Join join = xmlWorkflowItemRoot.join("item"); + criteriaQuery.select(xmlWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(join.get(Item_.submitter), ep)); + return list(context, criteriaQuery, false, XmlWorkflowItem.class, -1, -1); } @Override public List findByCollection(Context context, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, XmlWorkflowItem.class); - criteria.add(Restrictions.eq("collection", collection)); +// Criteria criteria = createCriteria(context, XmlWorkflowItem.class); +// criteria.add(Restrictions.eq("collection", collection)); +// +// return list(criteria); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + criteriaQuery.select(xmlWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), collection)); + return list(context, criteriaQuery, false, XmlWorkflowItem.class, -1, -1); } @Override public XmlWorkflowItem findByItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, XmlWorkflowItem.class); - criteria.add(Restrictions.eq("item", item)); +// Criteria criteria = createCriteria(context, XmlWorkflowItem.class); +// criteria.add(Restrictions.eq("item", item)); +// +// return uniqueResult(criteria); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + criteriaQuery.select(xmlWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.item), item)); + return uniqueResult(context, criteriaQuery, false, XmlWorkflowItem.class, -1, -1); } } diff --git a/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java b/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java index 952e091db8..864414307d 100644 --- a/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java +++ b/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java @@ -23,7 +23,7 @@ import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; import org.dspace.core.CoreHelpers; import org.dspace.core.HibernateDBConnection; -import org.hibernate.Query; +import javax.persistence.Query; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -87,9 +87,9 @@ public class ChecksumHistoryDAOImplTest cal.add(Calendar.DATE, -1); Date matchDate = cal.getTime(); checkId++; - qry.setInteger("id", checkId); - qry.setDate("date", matchDate); - qry.setString("result", ChecksumResultCode.CHECKSUM_MATCH.name()); + qry.setParameter("id", checkId); + qry.setParameter("date", matchDate); + qry.setParameter("result", ChecksumResultCode.CHECKSUM_MATCH.name()); qry.setParameter("bitstream", bs.getID()); // FIXME identifier not being set??? qry.executeUpdate(); @@ -97,9 +97,9 @@ public class ChecksumHistoryDAOImplTest cal.add(Calendar.DATE, -1); Date noMatchDate = cal.getTime(); checkId++; - qry.setInteger("id", checkId); - qry.setDate("date", noMatchDate); - qry.setString("result", ChecksumResultCode.CHECKSUM_NO_MATCH.name()); + qry.setParameter("id", checkId); + qry.setParameter("date", noMatchDate); + qry.setParameter("result", ChecksumResultCode.CHECKSUM_NO_MATCH.name()); qry.setParameter("bitstream", bs.getID()); // FIXME identifier not being set??? qry.executeUpdate(); @@ -107,9 +107,9 @@ public class ChecksumHistoryDAOImplTest cal.add(Calendar.DATE, +3); Date futureDate = cal.getTime(); checkId++; - qry.setInteger("id", checkId); - qry.setDate("date", new java.sql.Date(futureDate.getTime())); - qry.setString("result", ChecksumResultCode.CHECKSUM_MATCH.name()); + qry.setParameter("id", checkId); + qry.setParameter("date", new java.sql.Date(futureDate.getTime())); + qry.setParameter("result", ChecksumResultCode.CHECKSUM_MATCH.name()); qry.setParameter("bitstream", bs.getID()); // FIXME identifier not being set??? qry.executeUpdate(); @@ -125,18 +125,18 @@ public class ChecksumHistoryDAOImplTest "SELECT COUNT(*) FROM ChecksumHistory WHERE process_end_date = :date"); long count; - qry.setDate("date", matchDate); - count = (Long) qry.uniqueResult(); + qry.setParameter("date", matchDate); + count = (Long) qry.getSingleResult(); assertEquals("Should find no row at matchDate", count, 0); // See if nonmatching old row is still present. - qry.setDate("date", noMatchDate); - count = (Long) qry.uniqueResult(); + qry.setParameter("date", noMatchDate); + count = (Long) qry.getSingleResult(); assertEquals("Should find one row at noMatchDate", count, 1); // See if new row is still present. - qry.setDate("date", futureDate); - count = (Long) qry.uniqueResult(); + qry.setParameter("date", futureDate); + count = (Long) qry.getSingleResult(); assertEquals("Should find one row at futureDate", count, 1); } diff --git a/dspace/config/hibernate.cfg.xml b/dspace/config/hibernate.cfg.xml index fe322c6a48..1e10d0e975 100644 --- a/dspace/config/hibernate.cfg.xml +++ b/dspace/config/hibernate.cfg.xml @@ -16,7 +16,7 @@ org.hibernate.context.internal.ThreadLocalSessionContext - false + true true diff --git a/pom.xml b/pom.xml index 47cab720c2..c12f272c03 100644 --- a/pom.xml +++ b/pom.xml @@ -1037,6 +1037,12 @@ ${hibernate.version} + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + + org.hibernate hibernate-ehcache From e69ebcfe825c34cc4dbdead3ecda1ec7631e5558 Mon Sep 17 00:00:00 2001 From: Tom Desair Date: Wed, 24 Jan 2018 16:50:16 +0100 Subject: [PATCH 017/193] DS-3741: Changed setTimestamp to setParameter + added subquery example --- .../dao/impl/ChecksumHistoryDAOImpl.java | 4 +- .../dao/impl/MostRecentChecksumDAOImpl.java | 44 ++++++++++++------- .../dspace/content/dao/impl/ItemDAOImpl.java | 10 ++--- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java index 4c93522ab9..e155447f7b 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java @@ -17,6 +17,7 @@ import org.dspace.content.Bitstream; import org.dspace.core.Context; import org.dspace.core.AbstractHibernateDAO; import javax.persistence.Query; +import javax.persistence.TemporalType; /** *

@@ -44,8 +45,7 @@ public class ChecksumHistoryDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), false), @@ -77,7 +84,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO orderList = new LinkedList<>(); - orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get("bitstream.id"))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); criteriaQuery.orderBy(orderList); return list(context, criteriaQuery, false, MostRecentChecksum.class, -1, -1); } @@ -90,7 +97,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); criteriaQuery.where(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream), bitstream)); @@ -121,7 +128,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get("checksumResult.resultCode"), resultCode), @@ -130,7 +137,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO orderList = new LinkedList<>(); - orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get("bitstream.id"))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); criteriaQuery.orderBy(orderList); return list(context, criteriaQuery, false, MostRecentChecksum.class, -1, -1); @@ -160,12 +167,12 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); criteriaQuery.where(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), true)); List orderList = new LinkedList<>(); - orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get("bitstream.id"))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.processEndDate))); criteriaQuery.orderBy(orderList); return singleResult(context, criteriaQuery); @@ -192,7 +199,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), true), @@ -202,7 +209,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO orderList = new LinkedList<>(); orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.processEndDate))); - orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get("bitstream.id"))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); criteriaQuery.orderBy(orderList); return singleResult(context, criteriaQuery); @@ -211,12 +218,17 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO findNotInHistory(Context context) throws SQLException { - //TODO RAF WRITE -// Criteria criteria = createCriteria(context, MostRecentChecksum.class); -// DetachedCriteria subCriteria = DetachedCriteria.forClass(ChecksumHistory.class); -// subCriteria.setProjection(Projections.property("bitstream.id")); -// criteria.add(Property.forName("bitstreamId").notIn(subCriteria)); -// return list(criteria); - return null; + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root checksumRoot = criteriaQuery.from(MostRecentChecksum.class); + + Subquery subQuery = criteriaQuery.subquery(Bitstream.class); + Root historyRoot = subQuery.from(ChecksumHistory.class); + subQuery.select(historyRoot.get(ChecksumHistory_.bitstream)); + + criteriaQuery.where( + criteriaBuilder.not(checksumRoot.get(MostRecentChecksum_.bitstream).in(subQuery))); + + return list(context, criteriaQuery, false, MostRecentChecksum.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index dcb6e6151a..77f99c4741 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -18,6 +18,8 @@ import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.eperson.EPerson; import org.hibernate.Criteria; import javax.persistence.Query; +import javax.persistence.TemporalType; + import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Property; @@ -94,9 +96,8 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA query.setParameter("discoverable", discoverable); if(lastModified != null) { - //TODO RAF WRITE -// query.setTimestamp("last_modified", lastModified); - } + query.setParameter("last_modified", lastModified, TemporalType.TIMESTAMP); + } return iterate(query); } @@ -293,8 +294,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA throws SQLException { Query query = createQuery(context, "SELECT i FROM item i WHERE last_modified > :last_modified"); - //TODO RAF WRITE -// query.setTimestamp("last_modified", since); + query.setParameter("last_modified", since, TemporalType.TIMESTAMP); return iterate(query); } From 7385ce5b0400d7f1a58614f7243657978c065d8a Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Thu, 25 Jan 2018 15:53:41 +0100 Subject: [PATCH 018/193] [DS-3741] All DSpace test cases succeed, 3 DAO functions left unwritten --- .../dao/impl/MostRecentChecksumDAOImpl.java | 41 +------------------ .../content/dao/impl/BitstreamDAOImpl.java | 5 +-- .../dao/impl/BitstreamFormatDAOImpl.java | 17 -------- .../content/dao/impl/CollectionDAOImpl.java | 19 --------- .../content/dao/impl/CommunityDAOImpl.java | 21 +--------- .../dao/impl/MetadataFieldDAOImpl.java | 9 +--- .../dao/impl/MetadataSchemaDAOImpl.java | 7 ---- .../dao/impl/MetadataValueDAOImpl.java | 12 +----- .../dao/impl/WorkspaceItemDAOImpl.java | 20 ++------- .../org/dspace/core/AbstractHibernateDAO.java | 18 +++++--- .../eperson/dao/impl/SubscriptionDAOImpl.java | 5 +-- .../dspace/handle/dao/impl/HandleDAOImpl.java | 8 +--- .../dao/impl/HarvestedCollectionDAOImpl.java | 41 ++----------------- .../dao/impl/HarvestedItemDAOImpl.java | 11 ----- .../identifier/dao/impl/DOIDAOImpl.java | 34 --------------- .../versioning/dao/impl/VersionDAOImpl.java | 6 --- .../dao/impl/VersionHistoryDAOImpl.java | 8 ---- .../dao/impl/BasicWorkflowItemDAOImpl.java | 7 +--- .../dao/impl/InProgressUserDAOImpl.java | 19 --------- .../dao/impl/XmlWorkflowItemDAOImpl.java | 16 +------- 20 files changed, 30 insertions(+), 294 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java index 3ebd3fd872..5d91642e9e 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java @@ -62,18 +62,6 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); @@ -115,18 +103,6 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO= ? " // + "and most_recent_checksum.last_process_start_date < ? " // + "order by bitstream_id"; -// Criteria criteria = createCriteria(context, MostRecentChecksum.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("checksumResult.resultCode", resultCode), -// Restrictions.le("processStartDate", startDate), -// Restrictions.gt("processStartDate", endDate) -// ) -// ); -// criteria.addOrder(Order.asc("bitstream.id")); -// return list(criteria); -// - //TODO RAF CHECK CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); @@ -159,12 +135,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); @@ -187,16 +158,6 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java index 8868908754..0e09359b07 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java @@ -132,10 +132,7 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Long countByStoreNumber(Context context, Integer storeNumber) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, Bitstream.class); -// criteria.add(Restrictions.eq("storeNumber", storeNumber)); -// return countLong(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java index e50e012a02..59a2621941 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java @@ -124,17 +124,6 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO findNonInternal(Context context) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, BitstreamFormat.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("internal", false), -// Restrictions.not(Restrictions.like("shortDescription", "Unknown")) -// )); -// criteria.addOrder(Order.desc("supportLevel")).addOrder(Order.asc("shortDescription")); -// -// return list(criteria); - - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); @@ -171,12 +160,6 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO findAll(Context context, Class clazz) throws SQLException { - //TODO RAF CHECK - -// Criteria criteria = createCriteria(context, BitstreamFormat.class); -// criteria.addOrder(Order.asc("id")); -// return list(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java index 2d6656527c..f40d2be616 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java @@ -128,7 +128,6 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple @Override public List findAuthorized(Context context, EPerson ePerson, List actions) throws SQLException { - //TODO RAF CHECK // TableRowIterator tri = DatabaseManager.query(context, // "SELECT * FROM collection, resourcepolicy, eperson " + // "WHERE resourcepolicy.resource_id = collection.collection_id AND " + @@ -137,24 +136,6 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple // "( resourcepolicy.action_id = 3 OR resourcepolicy.action_id = 11 ) AND "+ // "eperson.eperson_id = ?", context.getCurrentUser().getID()); -// Criteria criteria = createCriteria(context, Collection.class); -// criteria.createAlias("resourcePolicies", "resourcePolicy"); -// -// Disjunction actionQuery = Restrictions.or(); -// for (Integer action : actions) -// { -// actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); -// } -// criteria.add(Restrictions.and( -// Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COLLECTION), -// Restrictions.eq("resourcePolicy.eperson", ePerson), -// actionQuery -// )); -// criteria.setCacheable(true); -// -// return list(criteria); - - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); Root collectionRoot = criteriaQuery.from(Collection.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java index 30b2694bea..b9c88da00b 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java @@ -111,8 +111,6 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme @Override public List findAuthorized(Context context, EPerson ePerson, List actions) throws SQLException { - //TODO RAF CHECK - /*TableRowIterator tri = DatabaseManager.query(context, "SELECT \n" + " * \n" + @@ -132,24 +130,7 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme " resourcepolicy.resource_type_id = 4 AND eperson.eperson_id = ?", context.getCurrentUser() .getID()); */ -// Criteria criteria = createCriteria(context, Community.class); -// criteria.createAlias("resourcePolicies", "resourcePolicy"); -// -// Disjunction actionQuery = Restrictions.or(); -// for (Integer action : actions) -// { -// actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); -// } -// criteria.add(Restrictions.and( -// Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COMMUNITY), -// Restrictions.eq("resourcePolicy.eperson", ePerson), -// actionQuery -// )); -// criteria.setCacheable(true); -// -// return list(criteria); -// -// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Community.class); Root communityRoot = criteriaQuery.from(Community.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java index 299ae38c65..6d9dfb3507 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java @@ -110,13 +110,6 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im @Override public List findAll(Context context, Class clazz) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, MetadataField.class); -// criteria.createAlias("metadataSchema", "s").addOrder(Order.asc("s.name")).addOrder(Order.asc("element")).addOrder(Order.asc("qualifier")); -// criteria.setFetchMode("metadataSchema", FetchMode.JOIN); -// criteria.setCacheable(true); -// return list(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataField.class); Root metadataFieldRoot = criteriaQuery.from(MetadataField.class); @@ -129,7 +122,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im orderList.add(criteriaBuilder.asc(metadataFieldRoot.get(MetadataField_.qualifier))); criteriaQuery.orderBy(orderList); - return list(context, criteriaQuery, true, MetadataField.class, -1, -1); + return list(context, criteriaQuery, true, MetadataField.class, -1, -1, false); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java index 033f282179..9c8dbdcd72 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java @@ -64,13 +64,6 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO public List findAll(Context context, Class clazz) throws SQLException { // Get all the metadataschema rows - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, MetadataSchema.class); -// criteria.addOrder(Order.asc("id")); -// criteria.setCacheable(true); -// -// return list(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataSchema.class); Root metadataSchemaRoot = criteriaQuery.from(MetadataSchema.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java index 0e84b50bd1..edb1e346c2 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java @@ -48,16 +48,6 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im @Override public List findByField(Context context, MetadataField metadataField) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, MetadataValue.class); -// criteria.add( -// Restrictions.eq("metadataField.id", metadataField.getID()) -// ); -// criteria.setFetchMode("metadataField", FetchMode.JOIN); -// -// return list(criteria); - - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataValue.class); Root metadataValueRoot = criteriaQuery.from(MetadataValue.class); @@ -66,7 +56,7 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im criteriaQuery.where(criteriaBuilder.equal(join.get(MetadataField_.id), metadataField.getID())); - return null; + return list(context, criteriaQuery,true, MetadataValue.class, -1, -1); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java index 9f3d0f7307..7d7cb92936 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java @@ -22,9 +22,12 @@ import org.dspace.identifier.DOI; import org.dspace.workflow.WorkflowItem; import org.hibernate.Criteria; import javax.persistence.Query; + +import org.hibernate.SQLQuery; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.hibernate.transform.BasicTransformerAdapter; +import org.springframework.jdbc.object.SqlQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -94,10 +97,6 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public List findAll(Context context) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, WorkspaceItem.class); -// criteria.addOrder(Order.asc("item")); -// return list(criteria); CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); @@ -124,11 +123,7 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public List findWithSupervisedGroup(Context context) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, WorkspaceItem.class); -// criteria.add(Restrictions.isNotEmpty("supervisorGroups")); -// criteria.addOrder(Order.asc("workspaceItemId")); -// return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); @@ -149,13 +144,6 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public List findBySupervisedGroupMember(Context context, EPerson ePerson) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, WorkspaceItem.class); -// criteria.createAlias("supervisorGroups", "supervisorGroup"); -// criteria.createAlias("supervisorGroup.epeople", "person"); -// criteria.add(Restrictions.eq("person.id", ePerson.getID())); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index 6f0b895f81..60a84ffb80 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -124,14 +124,22 @@ public abstract class AbstractHibernateDAO implements GenericDAO { return getHibernateSession(context).createQuery(query); } - public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, - int offset) throws SQLException { + public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, int offset) throws SQLException + { + criteriaQuery.distinct(true); @SuppressWarnings("unchecked") List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, clazz, maxResults, offset); return result; } - - public List list(Query query) { + public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, int offset, boolean distinct) throws SQLException + { + criteriaQuery.distinct(distinct); + @SuppressWarnings("unchecked") + List result = (List) executeCriteriaQuery(context,criteriaQuery,cacheable, clazz, maxResults, offset); + return result; + } + public List list(Query query) + { @SuppressWarnings("unchecked") List result = (List) query.getResultList(); return result; @@ -174,7 +182,7 @@ public abstract class AbstractHibernateDAO implements GenericDAO { // } // Query query = this.getHibernateSession(context).createQuery(criteriaQuery); - return (T) query.getSingleResult(); + return singleResult(query); } diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java index 37282adf9f..27749f5b09 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java @@ -107,10 +107,7 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl @Override public List findAllOrderedByEPerson(Context context) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, Subscription.class); -// criteria.addOrder(Order.asc("eperson.id")); -// return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); diff --git a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java index 6b3f2f9da8..aa288aa6c8 100644 --- a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java @@ -79,7 +79,7 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl query.setParameter("handle", handle); query.setHint("org.hibernate.cacheable", Boolean.TRUE); - return uniqueResult(query); + return singleResult(query); } @Override @@ -98,11 +98,7 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl @Override public long countHandlesByPrefix(Context context, String prefix) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, Handle.class); -// criteria.add(Restrictions.like("handle", prefix + "%")); -// return countLong(criteria); -// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java index 012c8b1994..8b54b14527 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java @@ -42,10 +42,7 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO ? and harvest_status = ? order by last_harvested desc limit 1"; - //TODO RAF CHECK -// Criteria criteria = getByStatusAndMinimalTypeCriteria(context, status, type, limit); -// criteria.addOrder(Order.desc("lastHarvested")); -// return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); @@ -62,10 +59,7 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO ? and harvest_status = ? order by last_harvested asc limit 1"; - //TODO RAF CHECK -// Criteria criteria = getByStatusAndMinimalTypeCriteria(context, status, type, limit); -// criteria.addOrder(Order.asc("lastHarvested")); -// return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); @@ -112,33 +106,7 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO ? and (harvest_status = ? or harvest_status = ? or (harvest_status=? and harvest_start_time < ?)) ORDER BY last_harvested", // new java.sql.Timestamp(startTime.getTime()), 0, HarvestedCollection.STATUS_READY, HarvestedCollection.STATUS_OAI_ERROR, HarvestedCollection.STATUS_BUSY, new java.sql.Timestamp(expirationTime.getTime())); - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, HarvestedCollection.class); -// LogicalExpression lastHarvestedRestriction = Restrictions.or( -// Restrictions.lt("lastHarvested", startTime), -// Restrictions.isNull("lastHarvested") -// ); -// Disjunction statusRestriction = Restrictions.or(); -// for (int status : statuses) { -// statusRestriction.add(Restrictions.eq("harvestStatus", status)); -// } -// statusRestriction.add( -// Restrictions.and( -// Restrictions.eq("harvestStatus", expirationStatus), -// Restrictions.gt("harvestStartTime", expirationTime) -// ) -// ); -// -// criteria.add( -// Restrictions.and( -// lastHarvestedRestriction, -// Restrictions.gt("harvestType", minimalType), -// statusRestriction -// -// ) -// ); -// criteria.addOrder(Order.asc("lastHarvested")); -// return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); @@ -182,9 +150,6 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO criteriaQuery = criteriaBuilder.createQuery(Long.class); diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java index 627c2e1e0e..6b109a8f10 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java @@ -56,17 +56,6 @@ public class HarvestedItemDAOImpl extends AbstractHibernateDAO im @Override public HarvestedItem findByOAIId(Context context, String itemOaiID, Collection collection) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, HarvestedItem.class); -// criteria.createAlias("item", "i"); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("oaiId", itemOaiID), -// Restrictions.eq("i.owningCollection", collection) -// ) -// ); -// return singleResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedItem.class); Root harvestedItemRoot = criteriaQuery.from(HarvestedItem.class); diff --git a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java index 71915cea2b..adc99337c0 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java @@ -59,24 +59,6 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List statusToExclude) throws SQLException { //SELECT * FROM Doi WHERE resource_type_id = ? AND resource_id = ? AND resource_id = ? AND ((status != ? AND status != ?) OR status IS NULL) - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, DOI.class); -// Disjunction statusQuery = Restrictions.or(); -// Conjunction statusConjunctionAnd = Restrictions.and(); -// for (Integer status : statusToExclude) { -// statusConjunctionAnd.add(Restrictions.not(Restrictions.eq("status", status))); -// } -// statusQuery.add(statusConjunctionAnd); -// statusQuery.add(Restrictions.isNull("status")); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("dSpaceObject", dso), -// statusQuery -// -// ) -// ); -// return singleResult(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); Root doiRoot = criteriaQuery.from(DOI.class); @@ -127,22 +109,6 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { // SELECT * FROM Doi WHERE doi LIKE ? AND resource_type_id = ? AND resource_id IS NOT NULL AND status != ? AND status != ? - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, DOI.class); -// Conjunction conjunctionAnd = Restrictions.and(); -// Disjunction statusQuery = Restrictions.or(); -// for (Integer status : excludedStatuses) { -// statusQuery.add(Restrictions.ne("status", status)); -// } -// conjunctionAnd.add(Restrictions.like("doi", doi)); -// conjunctionAnd.add(statusQuery); -// if (dsoNotNull) -// { -// conjunctionAnd.add(Restrictions.isNotNull("dSpaceObject")); -// } -// criteria.add(conjunctionAnd); -// return list(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); Root doiRoot = criteriaQuery.from(DOI.class); diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java index 35417d909c..2844750630 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java @@ -74,12 +74,6 @@ public class VersionDAOImpl extends AbstractHibernateDAO implements Ver public List findVersionsWithItems(Context context, VersionHistory versionHistory) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, Version.class); -// criteria.add(Restrictions.eq("versionHistory", versionHistory)); -// criteria.add(Restrictions.and(Restrictions.isNotNull("item"))); -// criteria.addOrder(Order.desc("versionNumber")); -// return list(criteria); CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Version.class); diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java index 0cae0d85f0..b95c6e6eba 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java @@ -49,14 +49,6 @@ public class VersionHistoryDAOImpl extends AbstractHibernateDAO @Override public VersionHistory findByItem(Context context, Item item) throws SQLException { - - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, VersionHistory.class); -// criteria.createAlias("versions", "v"); -// criteria.add(Restrictions.eq("v.item", item)); -// criteria.addOrder(Order.desc("v.versionNumber")); -// return singleResult(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, VersionHistory.class); Root versionHistoryRoot = criteriaQuery.from(VersionHistory.class); diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java index e6a07cf6ff..b4babd2ea5 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java @@ -61,12 +61,7 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO findBySubmitter(Context context, EPerson ep) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, BasicWorkflowItem.class); -// criteria.createAlias("item", "i"); -// criteria.add(Restrictions.eq("i.submitter", ep)); -// criteria.addOrder(Order.asc("workflowitemId")); -// return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java index 1648646154..8348efd0ee 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java @@ -96,16 +96,6 @@ public class InProgressUserDAOImpl extends AbstractHibernateDAO @Override public int countInProgressUsers(Context context, XmlWorkflowItem workflowItem) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, InProgressUser.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("finished", false) -// ) -// ); -// -// return count(criteria); CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); @@ -121,15 +111,6 @@ public class InProgressUserDAOImpl extends AbstractHibernateDAO @Override public int countFinishedUsers(Context context, XmlWorkflowItem workflowItem) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, InProgressUser.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("finished", true) -// ) -// ); -// return count(criteria); CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java index 51906bf773..955b9cf2fd 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java @@ -86,13 +86,7 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO criteriaQuery = criteriaBuilder.createQuery(Long.class); @@ -107,14 +101,6 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO findBySubmitter(Context context, EPerson ep) throws SQLException { - //TODO RAF CHECK -// Criteria criteria = createCriteria(context, XmlWorkflowItem.class); -// criteria.createAlias("item", "i"); -// criteria.add(Restrictions.eq("i.submitter", ep)); -// -// return list(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); From 6f5b9cddc64ab161f18f5d2afb5184b4ddd85cdc Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Thu, 25 Jan 2018 16:56:43 +0100 Subject: [PATCH 019/193] [DS-3741] cleaned up code in comments --- .../dao/impl/RequestItemDAOImpl.java | 4 -- .../dao/impl/ResourcePolicyDAOImpl.java | 58 ------------------- .../dao/impl/ChecksumResultDAOImpl.java | 4 -- .../dao/impl/MostRecentChecksumDAOImpl.java | 4 -- .../content/dao/impl/BitstreamDAOImpl.java | 9 --- .../dao/impl/BitstreamFormatDAOImpl.java | 19 ------ .../content/dao/impl/CollectionDAOImpl.java | 17 ------ .../content/dao/impl/CommunityDAOImpl.java | 4 -- .../dspace/content/dao/impl/SiteDAOImpl.java | 5 -- .../dao/impl/WorkspaceItemDAOImpl.java | 10 ---- .../dspace/core/AbstractHibernateDSODAO.java | 7 +-- .../eperson/dao/impl/EPersonDAOImpl.java | 30 ++-------- .../dao/impl/Group2GroupCacheDAOImpl.java | 26 --------- .../dao/impl/RegistrationDataDAOImpl.java | 8 --- .../eperson/dao/impl/SubscriptionDAOImpl.java | 20 +------ .../dspace/handle/dao/impl/HandleDAOImpl.java | 5 +- .../dao/impl/HarvestedCollectionDAOImpl.java | 22 ------- .../dao/impl/HarvestedItemDAOImpl.java | 4 -- .../identifier/dao/impl/DOIDAOImpl.java | 20 ------- .../versioning/dao/impl/VersionDAOImpl.java | 4 -- .../dao/impl/BasicWorkflowItemDAOImpl.java | 13 ----- .../dao/impl/TaskListItemDAOImpl.java | 4 -- .../dao/impl/ClaimedTaskDAOImpl.java | 51 ---------------- .../dao/impl/CollectionRoleDAOImpl.java | 15 ----- .../dao/impl/InProgressUserDAOImpl.java | 24 +------- .../dao/impl/PoolTaskDAOImpl.java | 35 ----------- .../dao/impl/WorkflowItemRoleDAOImpl.java | 19 ------ .../dao/impl/XmlWorkflowItemDAOImpl.java | 29 ---------- 28 files changed, 10 insertions(+), 460 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java index cd4aeb2db9..e6a9563dd7 100644 --- a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java @@ -37,10 +37,6 @@ public class RequestItemDAOImpl extends AbstractHibernateDAO implem @Override public RequestItem findByToken(Context context, String token) throws SQLException { -// Criteria criteria = createCriteria(context, RequestItem.class); -// criteria.add(Restrictions.eq("token", token)); -// return uniqueResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, RequestItem.class); Root requestItemRoot = criteriaQuery.from(RequestItem.class); diff --git a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java index ca873b5119..6022aae449 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java @@ -42,13 +42,6 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO @Override public List findByDso(Context context, DSpaceObject dso) throws SQLException { -// Criteria criteria = createCriteria(context, ResourcePolicy.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("dSpaceObject", dso) -// )); -// return list(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); @@ -60,13 +53,6 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO @Override public List findByDsoAndType(Context context, DSpaceObject dso, String type) throws SQLException { -// Criteria criteria = createCriteria(context, ResourcePolicy.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("dSpaceObject", dso), -// Restrictions.eq("rptype", type) -// )); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); @@ -80,10 +66,6 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO @Override public List findByGroup(Context context, Group group) throws SQLException { -// Criteria criteria = createCriteria(context, ResourcePolicy.class); -// criteria.add(Restrictions.eq("epersonGroup", group)); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); @@ -95,14 +77,6 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO @Override public List findByDSoAndAction(Context context, DSpaceObject dso, int actionId) throws SQLException { -// Criteria criteria = createCriteria(context, ResourcePolicy.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("dSpaceObject", dso), -// Restrictions.eq("actionId", actionId) -// )); -// return list(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); @@ -116,16 +90,6 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO @Override public List findByTypeGroupAction(Context context, DSpaceObject dso, Group group, int action) throws SQLException { -// Criteria criteria = createCriteria(context, ResourcePolicy.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("dSpaceObject", dso), -// Restrictions.eq("epersonGroup", group), -// Restrictions.eq("actionId", action) -// )); -// criteria.setMaxResults(1); -// return list(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); @@ -140,16 +104,6 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO @Override public List findByTypeGroupActionExceptId(Context context, DSpaceObject dso, Group group, int action, int notPolicyID) throws SQLException { -// Criteria criteria = createCriteria(context, ResourcePolicy.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("dSpaceObject", dso), -// Restrictions.eq("epersonGroup", group), -// Restrictions.eq("actionId", action) -// )); -// criteria.add(Restrictions.and(Restrictions.not(Restrictions.eq("id", notPolicyID)))); -// return list(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); @@ -165,18 +119,6 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO public List findByEPersonGroupTypeIdAction(Context context, EPerson e, List groups, int action, int type_id) throws SQLException { -// Criteria criteria = createCriteria(context, ResourcePolicy.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("resourceTypeId", type_id), -// Restrictions.eq("actionId", action), -// (Restrictions.or( -// Restrictions.eq("eperson", e), -// Restrictions.in("epersonGroup", groups) -// )) -// )); -// return list(criteria); -// -// //TODO Make sure you double check this CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java index d406982134..abde4a6e35 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java @@ -39,10 +39,6 @@ public class ChecksumResultDAOImpl extends AbstractHibernateDAO @Override public ChecksumResult findByCode(Context context, ChecksumResultCode code) throws SQLException { -// Criteria criteria = createCriteria(context, ChecksumResult.class); -// criteria.add(Restrictions.eq("resultCode", code)); -// return uniqueResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ChecksumResult.class); Root checksumResultRoot = criteriaQuery.from(ChecksumResult.class); diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java index 5d91642e9e..3a50538a0a 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java @@ -80,10 +80,6 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java index 0e09359b07..1fa30a1630 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java @@ -37,8 +37,6 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public List findDeletedBitstreams(Context context) throws SQLException { -// Criteria criteria = createCriteria(context, Bitstream.class); -// criteria.add(Restrictions.eq("deleted", true)); CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Bitstream.class); Root bitstreamRoot = criteriaQuery.from(Bitstream.class); @@ -50,13 +48,6 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public List findDuplicateInternalIdentifier(Context context, Bitstream bitstream) throws SQLException { -// Criteria criteria = createCriteria(context, Bitstream.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("internalId", bitstream.getInternalId()), -// Restrictions.not(Restrictions.eq("id", bitstream.getID())) -// )); -// -// return list(criteria); CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Bitstream.class); Root bitstreamRoot = criteriaQuery.from(Bitstream.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java index 59a2621941..c22eae513f 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java @@ -60,15 +60,6 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); @@ -96,13 +87,6 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); @@ -151,9 +135,6 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO imple @Override public Collection findByTemplateItem(Context context, Item item) throws SQLException { -// Criteria criteria = createCriteria(context, Collection.class); -// criteria.add(Restrictions.eq("template_item", item)); -// return uniqueResult(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); Root collectionRoot = criteriaQuery.from(Collection.class); @@ -99,19 +95,6 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple @Override public Collection findByGroup(Context context, Group group) throws SQLException { -// Criteria criteria = createCriteria(context, Collection.class); -// criteria.add( -// Restrictions.or( -// Restrictions.eq("workflowStep1", group), -// Restrictions.eq("workflowStep2", group), -// Restrictions.eq("workflowStep3", group), -// Restrictions.eq("submitters", group), -// Restrictions.eq("admins", group) -// ) -// ); -// return singleResult(criteria); - - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); Root collectionRoot = criteriaQuery.from(Collection.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java index b9c88da00b..e67d84a064 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java @@ -80,10 +80,6 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme @Override public Community findByAdminGroup(Context context, Group group) throws SQLException { -// Criteria criteria = createCriteria(context, Community.class); -// criteria.add(Restrictions.eq("admins", group)); -// return singleResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Community.class); Root communityRoot = criteriaQuery.from(Community.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java index 1169f60915..8b7009ac41 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java @@ -35,15 +35,10 @@ public class SiteDAOImpl extends AbstractHibernateDAO implements SiteDAO @Override public Site findSite(Context context) throws SQLException { -// Criteria criteria = createCriteria(context, Site.class); -// criteria.setCacheable(true); -// return uniqueResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Site.class); Root siteRoot = criteriaQuery.from(Site.class); criteriaQuery.select(siteRoot); -// criteriaQuery.where(criteriaBuilder.equal(root.get("doi"), doi)); return uniqueResult(context, criteriaQuery, true, Site.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java index 7d7cb92936..8c2ee952ee 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java @@ -64,10 +64,6 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public List findByCollection(Context context, Collection c) throws SQLException { -// Criteria criteria = createCriteria(context, WorkspaceItem.class); -// criteria.add(Restrictions.eq("collection", c)); -// return list(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); @@ -80,12 +76,6 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public WorkspaceItem findByItem(Context context, Item i) throws SQLException { -// Criteria criteria = createCriteria(context, WorkspaceItem.class); -// criteria.add(Restrictions.eq("item", i)); -// Look for the unique workspaceitem entry where 'item_id' references this item -// return uniqueResult(criteria); -// - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java index 5a5e3ecb26..26414bccbc 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java @@ -43,11 +43,8 @@ public abstract class AbstractHibernateDSODAO extends Ab * @return * @throws SQLException */ - public T findByLegacyId(Context context, int legacyId, Class clazz) throws SQLException { -// Criteria criteria = createCriteria(context, clazz); -// criteria.add(Restrictions.eq("legacyId", legacyId)); -// return uniqueResult(criteria); -// + public T findByLegacyId(Context context, int legacyId, Class clazz) throws SQLException + { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, clazz); Root root = criteriaQuery.from(clazz); diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java index 6fe5d7af6c..9235117a7b 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java @@ -44,14 +44,8 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements } @Override - public EPerson findByEmail(Context context, String email) throws SQLException { -// All email addresses are stored as lowercase, so ensure that the email address is lowercased for the lookup -// Criteria criteria = createCriteria(context, EPerson.class); -// criteria.add(Restrictions.eq("email", email.toLowerCase())); -// -// criteria.setCacheable(true); -// return uniqueResult(criteria); -// + public EPerson findByEmail(Context context, String email) throws SQLException + { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); Root ePersonRoot = criteriaQuery.from(EPerson.class); @@ -62,13 +56,8 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements @Override - public EPerson findByNetid(Context context, String netid) throws SQLException { -// Criteria criteria = createCriteria(context, EPerson.class); -// criteria.add(Restrictions.eq("netid", netid)); -// -// criteria.setCacheable(true); -// return uniqueResult(criteria); -// + public EPerson findByNetid(Context context, String netid) throws SQLException + { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); Root ePersonRoot = criteriaQuery.from(EPerson.class); @@ -143,13 +132,6 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements @Override public List findWithPasswordWithoutDigestAlgorithm(Context context) throws SQLException { -// Criteria criteria = createCriteria(context, EPerson.class); -// criteria.add(Restrictions.and( -// Restrictions.isNotNull("password"), -// Restrictions.isNull("digestAlgorithm") -// )); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); Root ePersonRoot = criteriaQuery.from(EPerson.class); @@ -163,10 +145,6 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements @Override public List findNotActiveSince(Context context, Date date) throws SQLException { -// Criteria criteria = createCriteria(context, EPerson.class); -// criteria.add(Restrictions.le("lastActive", date)); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); Root ePersonRoot = criteriaQuery.from(EPerson.class); diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java index 06cfd04424..bfcf58f414 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java @@ -44,12 +44,6 @@ public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO findByParent(Context context, Group group) throws SQLException { -// Criteria criteria = createCriteria(context, Group2GroupCache.class); -// criteria.add(Restrictions.eq("parent.id", group.getID())); -// criteria.setCacheable(true); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Group2GroupCache.class); Root group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); @@ -60,20 +54,6 @@ public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO findByChildren(Context context, Iterable groups) throws SQLException { -// Criteria criteria = createCriteria(context, Group2GroupCache.class); -// -// Disjunction orDisjunction = Restrictions.or(); -// for(Group group : groups) -// { -// orDisjunction.add(Restrictions.eq("child.id", group.getID())); -// } -// -// criteria.add(orDisjunction); -// criteria.setCacheable(true); -// -// return list(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Group2GroupCache.class); Root group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); @@ -101,12 +81,6 @@ public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java index ece959f66d..ffbac0f893 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java @@ -38,10 +38,6 @@ public class RegistrationDataDAOImpl extends AbstractHibernateDAO registrationDataRoot = criteriaQuery.from(RegistrationData.class); @@ -52,10 +48,6 @@ public class RegistrationDataDAOImpl extends AbstractHibernateDAO registrationDataRoot = criteriaQuery.from(RegistrationData.class); diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java index 27749f5b09..f9fd9ca30a 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java @@ -37,14 +37,6 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl @Override public List findByEPerson(Context context, EPerson eperson) throws SQLException { -// Criteria criteria = createCriteria(context, Subscription.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("ePerson", eperson) -// ) -// ); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); Root subscriptionRoot = criteriaQuery.from(Subscription.class); @@ -55,17 +47,7 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl } @Override - public Subscription findByCollectionAndEPerson(Context context, EPerson eperson, Collection collection) - throws SQLException { -// Criteria criteria = createCriteria(context, Subscription.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("ePerson", eperson), -// Restrictions.eq("collection", collection) -// ) -// ); -// return singleResult(criteria); -// + public Subscription findByCollectionAndEPerson(Context context, EPerson eperson, Collection collection) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); Root subscriptionRoot = criteriaQuery.from(Subscription.class); diff --git a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java index aa288aa6c8..4b5a39b549 100644 --- a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java @@ -84,10 +84,7 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl @Override public List findByPrefix(Context context, String prefix) throws SQLException { -// Criteria criteria = createCriteria(context, Handle.class); -// criteria.add(Restrictions.like("handle", prefix + "%")); -// return list(criteria); -// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Handle.class); Root handleRoot = criteriaQuery.from(Handle.class); diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java index 8b54b14527..2fd22c1b29 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java @@ -74,10 +74,6 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO findByStatus(Context context, int status) throws SQLException { -// Criteria criteria = createCriteria(context, HarvestedCollection.class); -// criteria.add(Restrictions.eq("harvestStatus", status)); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); @@ -88,10 +84,6 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); @@ -159,20 +151,6 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java index 6b109a8f10..5cb58e74dd 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java @@ -41,10 +41,6 @@ public class HarvestedItemDAOImpl extends AbstractHibernateDAO im @Override public HarvestedItem findByItem(Context context, Item item) throws SQLException { -// Criteria criteria = createCriteria(context, HarvestedItem.class); -// criteria.add(Restrictions.eq("item", item)); -// return singleResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedItem.class); Root harvestedItemRoot = criteriaQuery.from(HarvestedItem.class); diff --git a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java index adc99337c0..5f7eb7d819 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java @@ -43,10 +43,6 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO @Override public DOI findByDoi(Context context, String doi) throws SQLException { -// Criteria criteria = createCriteria(context, DOI.class); -// criteria.add(Restrictions.eq("doi", doi)); -// return uniqueResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); Root doiRoot = criteriaQuery.from(DOI.class); @@ -83,14 +79,6 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO @Override public List findByStatus(Context context, List statuses) throws SQLException { -// Criteria criteria = createCriteria(context, DOI.class); -// Disjunction statusQuery = Restrictions.or(); -// for (Integer status : statuses) { -// statusQuery.add(Restrictions.eq("status", status)); -// } -// criteria.add(statusQuery); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); Root doiRoot = criteriaQuery.from(DOI.class); @@ -136,14 +124,6 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO @Override public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso) throws SQLException { -// Criteria criteria = createCriteria(context, DOI.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("dSpaceObject", dso) -// ) -// ); -// return singleResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); Root doiRoot = criteriaQuery.from(DOI.class); diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java index 2844750630..dd4d71df0a 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java @@ -47,10 +47,6 @@ public class VersionDAOImpl extends AbstractHibernateDAO implements Ver @Override public Version findByItem(Context context, Item item) throws SQLException { -// Criteria criteria = createCriteria(context, Version.class); -// criteria.add(Restrictions.eq("item", item)); -// return singleResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Version.class); Root versionRoot = criteriaQuery.from(Version.class); diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java index b4babd2ea5..5660c532cd 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java @@ -45,11 +45,6 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); @@ -76,10 +71,6 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO findByCollection(Context context, Collection c) throws SQLException { -// Criteria criteria = createCriteria(context, BasicWorkflowItem.class); -// criteria.add(Restrictions.eq("collection", c)); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); @@ -99,10 +90,6 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO findByOwner(Context context, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, BasicWorkflowItem.class); -// criteria.add(Restrictions.eq("owner", ePerson)); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java index 7bcef0237e..43f58bc16f 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java @@ -48,10 +48,6 @@ public class TaskListItemDAOImpl extends AbstractHibernateDAO impl @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, TaskListItem.class); -// criteria.add(Restrictions.eq("ePerson", ePerson)); -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, TaskListItem.class); Root taskListItemRoot = criteriaQuery.from(TaskListItem.class); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java index 07c3422631..e9fb23425d 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java @@ -40,11 +40,6 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { -// Criteria criteria = createCriteria(context, ClaimedTask.class); -// criteria.add(Restrictions.eq("workflowItem", workflowItem)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); @@ -56,15 +51,6 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem @Override public ClaimedTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, ClaimedTask.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("owner", ePerson) -// )); -// -// return uniqueResult(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); @@ -80,11 +66,6 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem @Override public List findByEperson(Context context, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, ClaimedTask.class); -// criteria.add(Restrictions.eq("owner", ePerson)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); @@ -95,14 +76,6 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem @Override public List findByWorkflowItemAndStepId(Context context, XmlWorkflowItem workflowItem, String stepID) throws SQLException { -// Criteria criteria = createCriteria(context, ClaimedTask.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("stepId", stepID) -// )); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); @@ -116,16 +89,6 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem @Override public ClaimedTask findByEPersonAndWorkflowItemAndStepIdAndActionId(Context context, EPerson ePerson, XmlWorkflowItem workflowItem, String stepID, String actionID) throws SQLException { -// Criteria criteria = createCriteria(context, ClaimedTask.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("owner", ePerson), -// Restrictions.eq("stepId", stepID), -// Restrictions.eq("actionId", actionID) -// )); -// -// return uniqueResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); @@ -141,15 +104,6 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem @Override public List findByWorkflowItemAndStepIdAndActionId(Context context, XmlWorkflowItem workflowItem, String stepID, String actionID) throws SQLException { -// Criteria criteria = createCriteria(context, ClaimedTask.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("stepId", stepID), -// Restrictions.eq("actionId", actionID) -// )); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); @@ -164,11 +118,6 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem @Override public List findByStep(Context context, String stepID) throws SQLException { -// Criteria criteria = createCriteria(context, ClaimedTask.class); -// criteria.add(Restrictions.eq("stepId", stepID)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java index f7a7d7a950..b5f54b8a39 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java @@ -39,11 +39,6 @@ public class CollectionRoleDAOImpl extends AbstractHibernateDAO @Override public List findByCollection(Context context, Collection collection) throws SQLException { -// Criteria criteria = createCriteria(context, CollectionRole.class); -// criteria.add(Restrictions.eq("collection", collection)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CollectionRole.class); Root collectionRoleRoot = criteriaQuery.from(CollectionRole.class); @@ -54,16 +49,6 @@ public class CollectionRoleDAOImpl extends AbstractHibernateDAO @Override public CollectionRole findByCollectionAndRole(Context context, Collection collection, String role) throws SQLException { -// Criteria criteria = createCriteria(context, CollectionRole.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("collection", collection), -// Restrictions.eq("roleId", role) -// ) -// ); -// -// return uniqueResult(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CollectionRole.class); Root collectionRoleRoot = criteriaQuery.from(CollectionRole.class); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java index 8348efd0ee..77052e36ff 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java @@ -40,17 +40,7 @@ public class InProgressUserDAOImpl extends AbstractHibernateDAO @Override public InProgressUser findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, InProgressUser.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("ePerson", ePerson) -// ) -// ); -// return uniqueResult(criteria); -// -// -// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); @@ -65,12 +55,6 @@ public class InProgressUserDAOImpl extends AbstractHibernateDAO @Override public List findByEperson(Context context, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, InProgressUser.class); -// criteria.add(Restrictions.eq("ePerson", ePerson)); -// -// return list(criteria); -// -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); @@ -81,11 +65,7 @@ public class InProgressUserDAOImpl extends AbstractHibernateDAO @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { -// Criteria criteria = createCriteria(context, InProgressUser.class); -// criteria.add(Restrictions.eq("workflowItem", workflowItem)); -// -// return list(criteria); -// + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java index 14cac15293..0dc3720c54 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java @@ -41,11 +41,6 @@ public class PoolTaskDAOImpl extends AbstractHibernateDAO implements P @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, PoolTask.class); -// criteria.add(Restrictions.eq("ePerson", ePerson)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); Root poolTaskRoot = criteriaQuery.from(PoolTask.class); @@ -57,11 +52,6 @@ public class PoolTaskDAOImpl extends AbstractHibernateDAO implements P @Override public List findByGroup(Context context, Group group) throws SQLException { -// Criteria criteria = createCriteria(context, PoolTask.class); -// criteria.add(Restrictions.eq("group", group)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); Root poolTaskRoot = criteriaQuery.from(PoolTask.class); @@ -72,11 +62,6 @@ public class PoolTaskDAOImpl extends AbstractHibernateDAO implements P @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { -// Criteria criteria = createCriteria(context, PoolTask.class); -// criteria.add(Restrictions.eq("workflowItem", workflowItem)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); Root poolTaskRoot = criteriaQuery.from(PoolTask.class); @@ -87,16 +72,6 @@ public class PoolTaskDAOImpl extends AbstractHibernateDAO implements P @Override public PoolTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, PoolTask.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("ePerson", ePerson) -// ) -// ); -// -// return uniqueResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); Root poolTaskRoot = criteriaQuery.from(PoolTask.class); @@ -110,16 +85,6 @@ public class PoolTaskDAOImpl extends AbstractHibernateDAO implements P @Override public PoolTask findByWorkflowItemAndGroup(Context context, Group group, XmlWorkflowItem workflowItem) throws SQLException { -// Criteria criteria = createCriteria(context, PoolTask.class); -// criteria.add( -// Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("group", group) -// ) -// ); -// -// return uniqueResult(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); Root poolTaskRoot = criteriaQuery.from(PoolTask.class); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java index d1fb694f20..9dc6cdd052 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java @@ -40,15 +40,6 @@ public class WorkflowItemRoleDAOImpl extends AbstractHibernateDAO findByWorkflowItemAndRole(Context context, XmlWorkflowItem workflowItem, String role) throws SQLException { -// Criteria criteria = createCriteria(context, WorkflowItemRole.class); -// criteria.add(Restrictions.and( -// Restrictions.eq("workflowItem", workflowItem), -// Restrictions.eq("role", role) -// ) -// ); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); @@ -62,11 +53,6 @@ public class WorkflowItemRoleDAOImpl extends AbstractHibernateDAO findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { -// Criteria criteria = createCriteria(context, WorkflowItemRole.class); -// criteria.add(Restrictions.eq("workflowItem", workflowItem)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); @@ -77,11 +63,6 @@ public class WorkflowItemRoleDAOImpl extends AbstractHibernateDAO findByEPerson(Context context, EPerson ePerson) throws SQLException { -// Criteria criteria = createCriteria(context, WorkflowItemRole.class); -// criteria.add(Restrictions.eq("ePerson", ePerson)); -// -// return list(criteria); -// CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java index 955b9cf2fd..2854e1f1aa 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java @@ -44,25 +44,6 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO findAllInCollection(Context context, Integer offset, Integer limit, Collection collection) throws SQLException { -// Criteria criteria = createCriteria(context, XmlWorkflowItem.class); -// if(collection != null) -// { -// criteria.add(Restrictions.eq("collection", collection)); -// } -// -// if(offset != null) -// { -// criteria.setFirstResult(offset); -// } -// if(limit != null) -// { -// criteria.setMaxResults(limit); -// } -// -// return list(criteria); - - - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); @@ -112,11 +93,6 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO findByCollection(Context context, Collection collection) throws SQLException { -// Criteria criteria = createCriteria(context, XmlWorkflowItem.class); -// criteria.add(Restrictions.eq("collection", collection)); -// -// return list(criteria); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); @@ -127,11 +103,6 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); From 877b84fda62c21045153d5a5da507b85093e84c0 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Tue, 20 Feb 2018 16:34:33 +0100 Subject: [PATCH 020/193] [DS-3741] fixed the two resultTransformer queries --- .../content/dao/impl/CollectionDAOImpl.java | 15 +++++++-------- .../content/dao/impl/WorkspaceItemDAOImpl.java | 15 +++++++-------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java index a328599f24..63ce77e60e 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java @@ -28,6 +28,7 @@ import org.hibernate.transform.BasicTransformerAdapter; import javax.persistence.criteria.*; import java.sql.SQLException; +import java.util.AbstractMap; import java.util.Arrays; import java.util.LinkedList; import java.util.List; @@ -194,13 +195,11 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple String q = "select col as collection, sum(bit.sizeBytes) as totalBytes from Item i join i.collections col join i.bundles bun join bun.bitstreams bit group by col"; Query query = createQuery(context, q); - //TODO RAF WRITE WUTNOW -// query.setResultTransformer(new BasicTransformerAdapter() { -// @Override -// public Object transformTuple(Object[] tuple, String[] aliases) { -// return new java.util.AbstractMap.SimpleImmutableEntry<>((Collection)tuple[0], (Long)tuple[1]); -// } -// }); - return ((List>)query.getResultList()); + List list = query.getResultList(); + List> returnList = new LinkedList<>(); + for(Object[] o : list) { + returnList.add(new AbstractMap.SimpleEntry<>((Collection) o[0], (Long) o[1])); + } + return returnList; } } \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java index 8c2ee952ee..eedb0ff4d5 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java @@ -34,6 +34,7 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; import java.sql.SQLException; +import java.util.AbstractMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -155,14 +156,12 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im Query query = createQuery(context,"SELECT wi.stageReached as stage_reached, count(*) as cnt from WorkspaceItem wi" + " group by wi.stageReached order by wi.stageReached"); - //TODO RAF WRITE -// query.setResultTransformer(new BasicTransformerAdapter() { -// @Override -// public Object transformTuple(Object[] tuple, String[] aliases) { -// return new java.util.AbstractMap.SimpleImmutableEntry((Integer) tuple[0], (Long) tuple[1]); -// } -// }); - return (List>)query.getResultList(); + List list = query.getResultList(); + List> returnList = new LinkedList<>(); + for(Object[] o : list) { + returnList.add(new AbstractMap.SimpleEntry<>((Integer) o[0], (Long) o[1])); + } + return returnList; } } From 1745640bbc2498ee265bacab126be08bad08f490 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Wed, 21 Feb 2018 12:39:17 +0100 Subject: [PATCH 021/193] [DS-3741] fixed wrong and/or usage and wrote the last query" --- .../content/dao/impl/CollectionDAOImpl.java | 2 +- .../content/dao/impl/CommunityDAOImpl.java | 2 +- .../dspace/content/dao/impl/ItemDAOImpl.java | 75 ++++++++++++++++--- 3 files changed, 68 insertions(+), 11 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java index 63ce77e60e..828f11e80b 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java @@ -128,7 +128,7 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple for(Integer action : actions){ orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } - Predicate orPredicate = criteriaBuilder.and(orPredicates.toArray(new Predicate[]{})); + Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[]{})); criteriaQuery.select(collectionRoot); criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), criteriaBuilder.equal(join.get(ResourcePolicy_.eperson), ePerson), diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java index e67d84a064..845cc003f4 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java @@ -135,7 +135,7 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme for (Integer action : actions) { orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } - Predicate orPredicate = criteriaBuilder.and(orPredicates.toArray(new Predicate[] {})); + Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[]{})); criteriaQuery.select(communityRoot); criteriaQuery.where( criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index 77f99c4741..1151c05789 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -9,28 +9,29 @@ package org.dspace.content.dao.impl; import org.apache.log4j.Logger; import org.dspace.content.Collection; +import org.dspace.content.DSpaceObject; import org.dspace.content.Item; +import org.dspace.content.Item_; import org.dspace.content.MetadataField; import org.dspace.content.MetadataValue; +import org.dspace.content.MetadataValue_; import org.dspace.content.dao.ItemDAO; import org.dspace.core.Context; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.eperson.EPerson; -import org.hibernate.Criteria; import javax.persistence.Query; import javax.persistence.TemporalType; - -import org.hibernate.criterion.DetachedCriteria; -import org.hibernate.criterion.Projections; -import org.hibernate.criterion.Property; -import org.hibernate.criterion.Restrictions; -import org.hibernate.criterion.Subqueries; -import org.hibernate.type.StandardBasicTypes; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import javax.persistence.criteria.Subquery; import java.sql.SQLException; import java.util.Collections; import java.util.Date; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.UUID; @@ -212,7 +213,63 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA // return list(criteria).iterator(); //TODO RAF WRITE - return null; + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Item.class); + Root itemRoot = criteriaQuery.from(Item.class); + criteriaQuery.select(itemRoot); + + + List predicateList = new LinkedList<>(); + + if(!collectionUuids.isEmpty()){ + predicateList.add(criteriaBuilder.isTrue(itemRoot.get(Item_.owningCollection).in(collectionUuids))); + } + + int index = Math.min(listFieldList.size(), Math.min(query_op.size(), query_val.size())); + + for(int i = 0; i < index; i++){ + OP op = OP.valueOf(query_op.get(i)); + if (op == null) { + log.warn("Skipping Invalid Operator: " + query_op.get(i)); + continue; + } + + if (op == OP.matches || op == OP.doesnt_match) { + if (regexClause.isEmpty()) { + log.warn("Skipping Unsupported Regex Operator: " + query_op.get(i)); + continue; + } + } + + Subquery subquery = criteriaQuery.subquery(DSpaceObject.class); + Root subqueryRoot = subquery.from(MetadataValue.class); + subquery.select(subqueryRoot.get(MetadataValue_.dSpaceObject)); + List predicateListSubQuery = new LinkedList<>(); + + predicateListSubQuery.add(criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.dSpaceObject), itemRoot.get(Item_.id))); + + if (!listFieldList.get(i).isEmpty()) { + predicateListSubQuery.add(criteriaBuilder.isTrue(subqueryRoot.get(MetadataValue_.metadataField).in(listFieldList.get(i)))); + } + if (op == OP.equals){ + predicateListSubQuery.add(criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); + } else if (op == OP.like){ + predicateListSubQuery.add(criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); + } else if (op == OP.contains){ + predicateListSubQuery.add(criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), "%"+query_val.get(i)+"%")); + } else if (op == OP.not_equals){ + predicateListSubQuery.add(criteriaBuilder.notEqual(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); + } else if (op == OP.not_like){ + predicateListSubQuery.add(criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); + } else if (op == OP.doesnt_contain){ + predicateListSubQuery.add(criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), "%"+query_val.get(i)+"%")); + } + subquery.where(predicateListSubQuery.toArray(new Predicate[]{})); + predicateList.add(criteriaBuilder.isTrue(itemRoot.get(Item_.id).in(subquery))); + } + criteriaQuery.where(predicateList.toArray(new Predicate[]{})); + + return list(context, criteriaQuery, false, Item.class, offset, limit).iterator(); } @Override From 0491247c6d73bbafdd3a3483d4a73d92776f2d4f Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Wed, 21 Feb 2018 14:01:27 +0100 Subject: [PATCH 022/193] [DS-3741] fixes after cherry-picking --- .../content/dao/impl/WorkspaceItemDAOImpl.java | 16 +++++++++++----- .../org/dspace/core/AbstractHibernateDAO.java | 3 +-- .../rest/converter/DiscoverResultConverter.java | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java index eedb0ff4d5..1c2ebc5bff 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java @@ -105,11 +105,17 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public List findAll(Context context, Integer limit, Integer offset) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.addOrder(Order.asc("item")); - criteria.setFirstResult(offset); - criteria.setMaxResults(limit); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.item))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, WorkspaceItem.class, limit, offset); } @Override diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index 60a84ffb80..416edf573b 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -237,7 +237,6 @@ public abstract class AbstractHibernateDAO implements GenericDAO { public List executeCriteriaQuery(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, int offset) throws SQLException { //This has to be here, otherwise a 500 gets thrown - Root root = criteriaQuery.from(clazz); Query query = this.getHibernateSession(context).createQuery(criteriaQuery); //TODO Check if this works and is desireable @@ -246,7 +245,7 @@ public abstract class AbstractHibernateDAO implements GenericDAO { if (maxResults != -1) { query.setMaxResults(maxResults); } - if (maxResults != -1) { + if(offset != -1){ query.setFirstResult(offset); } return query.getResultList(); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java index f148d4cc64..45470c3e8e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java @@ -12,7 +12,7 @@ import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.rest.converter.query.SearchQueryConverter; import org.dspace.app.rest.model.DSpaceObjectRest; From db0a898c42202509e5bec43173ee0c7b4ab915fc Mon Sep 17 00:00:00 2001 From: Tom Desair Date: Thu, 22 Feb 2018 13:07:14 +0100 Subject: [PATCH 023/193] DS-3741: Added dspace-api/target/generated-sources/annotations to Coveralls source directories --- dspace/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/dspace/pom.xml b/dspace/pom.xml index bf33e91a4c..3780d02fa0 100644 --- a/dspace/pom.xml +++ b/dspace/pom.xml @@ -213,6 +213,7 @@ ${project.parent.basedir}/dspace-api/src/main/java + ${project.parent.basedir}/dspace-api/target/generated-sources/annotations ${project.parent.basedir}/dspace-oai/src/main/java ${project.parent.basedir}/dspace-rdf/src/main/java ${project.parent.basedir}/dspace-rest/src/main/java From a33f5de0df988a8317989d74287e3e58ef99103e Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Fri, 25 May 2018 14:59:11 +0200 Subject: [PATCH 024/193] [DS 3741] fixed checkstyle in DAOImpl classes --- .../dao/impl/RequestItemDAOImpl.java | 23 +- .../dao/impl/ResourcePolicyDAOImpl.java | 137 +++++----- .../dao/impl/ChecksumHistoryDAOImpl.java | 24 +- .../dao/impl/ChecksumResultDAOImpl.java | 21 +- .../dao/impl/MostRecentChecksumDAOImpl.java | 85 +++--- .../content/dao/impl/BitstreamDAOImpl.java | 82 +++--- .../dao/impl/BitstreamFormatDAOImpl.java | 66 ++--- .../content/dao/impl/CollectionDAOImpl.java | 146 ++++++----- .../content/dao/impl/CommunityDAOImpl.java | 2 +- .../dspace/content/dao/impl/ItemDAOImpl.java | 247 +++++++----------- .../dao/impl/MetadataFieldDAOImpl.java | 102 ++++---- .../dao/impl/MetadataSchemaDAOImpl.java | 53 ++-- .../dao/impl/MetadataValueDAOImpl.java | 44 ++-- .../dspace/content/dao/impl/SiteDAOImpl.java | 20 +- .../dao/impl/WorkspaceItemDAOImpl.java | 76 +++--- .../org/dspace/core/AbstractHibernateDAO.java | 17 +- .../dspace/core/AbstractHibernateDSODAO.java | 6 +- .../eperson/dao/impl/EPersonDAOImpl.java | 6 +- .../dao/impl/Group2GroupCacheDAOImpl.java | 46 ++-- .../dspace/eperson/dao/impl/GroupDAOImpl.java | 88 +++---- .../dao/impl/RegistrationDataDAOImpl.java | 22 +- .../eperson/dao/impl/SubscriptionDAOImpl.java | 5 +- .../dspace/handle/dao/impl/HandleDAOImpl.java | 85 +++--- .../dao/impl/HarvestedCollectionDAOImpl.java | 107 +++++--- .../dao/impl/HarvestedItemDAOImpl.java | 38 ++- .../identifier/dao/impl/DOIDAOImpl.java | 69 +++-- .../versioning/dao/impl/VersionDAOImpl.java | 52 ++-- .../dao/impl/VersionHistoryDAOImpl.java | 29 +- .../dao/impl/BasicWorkflowItemDAOImpl.java | 45 ++-- .../dao/impl/TaskListItemDAOImpl.java | 28 +- .../dao/impl/ClaimedTaskDAOImpl.java | 79 +++--- .../dao/impl/CollectionRoleDAOImpl.java | 38 ++- .../dao/impl/InProgressUserDAOImpl.java | 51 ++-- .../dao/impl/PoolTaskDAOImpl.java | 47 ++-- .../dao/impl/WorkflowItemRoleDAOImpl.java | 46 ++-- .../dao/impl/XmlWorkflowItemDAOImpl.java | 50 ++-- 36 files changed, 989 insertions(+), 1093 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java index e6a9563dd7..351f40ae13 100644 --- a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java @@ -7,19 +7,16 @@ */ package org.dspace.app.requestitem.dao.impl; -import org.dspace.app.requestitem.RequestItem; -import org.dspace.app.requestitem.RequestItem_; -import org.dspace.app.requestitem.dao.RequestItemDAO; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.xmlworkflow.storedcomponents.InProgressUser; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - +import java.sql.SQLException; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import java.sql.SQLException; + +import org.dspace.app.requestitem.RequestItem; +import org.dspace.app.requestitem.RequestItem_; +import org.dspace.app.requestitem.dao.RequestItemDAO; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; /** * Hibernate implementation of the Database Access Object interface class for the RequestItem object. @@ -28,10 +25,8 @@ import java.sql.SQLException; * * @author kevinvandevelde at atmire.com */ -public class RequestItemDAOImpl extends AbstractHibernateDAO implements RequestItemDAO -{ - protected RequestItemDAOImpl() - { +public class RequestItemDAOImpl extends AbstractHibernateDAO implements RequestItemDAO { + protected RequestItemDAOImpl() { super(); } diff --git a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java index 6022aae449..34be343abe 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java @@ -7,23 +7,21 @@ */ package org.dspace.authorize.dao.impl; -import org.dspace.authorize.ResourcePolicy; -import org.dspace.authorize.ResourcePolicy_; -import org.dspace.authorize.dao.ResourcePolicyDAO; -import org.dspace.content.Community; -import org.dspace.content.DSpaceObject; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.eperson.EPerson; -import org.dspace.eperson.Group; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; +import java.sql.SQLException; +import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; + +import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.ResourcePolicy_; +import org.dspace.authorize.dao.ResourcePolicyDAO; +import org.dspace.content.DSpaceObject; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.eperson.Group; /** * Hibernate implementation of the Database Access Object interface class for the ResourcePolicy object. @@ -32,11 +30,9 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class ResourcePolicyDAOImpl extends AbstractHibernateDAO implements ResourcePolicyDAO -{ +public class ResourcePolicyDAOImpl extends AbstractHibernateDAO implements ResourcePolicyDAO { - protected ResourcePolicyDAOImpl() - { + protected ResourcePolicyDAOImpl() { super(); } @@ -51,16 +47,16 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO } @Override - public List findByDsoAndType(Context context, DSpaceObject dso, String type) throws SQLException - { + public List findByDsoAndType(Context context, DSpaceObject dso, String type) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); criteriaQuery.select(resourcePolicyRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), - criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.rptype), type) - ) - ); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.rptype), type) + ) + ); return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @@ -75,65 +71,74 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO } @Override - public List findByDSoAndAction(Context context, DSpaceObject dso, int actionId) throws SQLException - { + public List findByDSoAndAction(Context context, DSpaceObject dso, int actionId) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); criteriaQuery.select(resourcePolicyRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), - criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), actionId) - ) - ); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), actionId) + ) + ); return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override - public List findByTypeGroupAction(Context context, DSpaceObject dso, Group group, int action) throws SQLException { + public List findByTypeGroupAction(Context context, DSpaceObject dso, Group group, int action) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); criteriaQuery.select(resourcePolicyRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), - criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group), - criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action) - ) - ); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder + .equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action) + ) + ); return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); } - - @Override - public List findByTypeGroupActionExceptId(Context context, DSpaceObject dso, Group group, int action, int notPolicyID) throws SQLException { - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); - CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); - Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); - criteriaQuery.select(resourcePolicyRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), - criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group), - criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action), - criteriaBuilder.notEqual(resourcePolicyRoot.get(ResourcePolicy_.id), notPolicyID) - ) - ); - return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); - } - - public List findByEPersonGroupTypeIdAction(Context context, EPerson e, List groups, int action, int type_id) throws SQLException - { - //TODO Make sure you double check this - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); - CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); - Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); - criteriaQuery.select(resourcePolicyRoot); - criteriaQuery.where(criteriaBuilder.and( criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.resourceTypeId), type_id), - criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action), - criteriaBuilder.or( criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.eperson), e), - criteriaBuilder.in(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups))))); - return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); - } @Override - public void deleteByDso(Context context, DSpaceObject dso) throws SQLException - { + public List findByTypeGroupActionExceptId(Context context, DSpaceObject dso, Group group, + int action, int notPolicyID) throws SQLException { + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder + .equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action), + criteriaBuilder.notEqual(resourcePolicyRoot.get(ResourcePolicy_.id), notPolicyID) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); + } + + public List findByEPersonGroupTypeIdAction(Context context, EPerson e, List groups, + int action, int type_id) throws SQLException { + //TODO Make sure you double check this + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.resourceTypeId), type_id), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action), + criteriaBuilder + .or(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.eperson), e), + criteriaBuilder + .in(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups))))); + return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); + } + + @Override + public void deleteByDso(Context context, DSpaceObject dso) throws SQLException { String queryString = "delete from ResourcePolicy where dSpaceObject= :dSpaceObject"; Query query = createQuery(context, queryString); query.setParameter("dSpaceObject", dso); diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java index e155447f7b..328d4a717e 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java @@ -9,15 +9,15 @@ package org.dspace.checker.dao.impl; import java.sql.SQLException; import java.util.Date; +import javax.persistence.Query; +import javax.persistence.TemporalType; import org.dspace.checker.ChecksumHistory; import org.dspace.checker.ChecksumResultCode; import org.dspace.checker.dao.ChecksumHistoryDAO; import org.dspace.content.Bitstream; -import org.dspace.core.Context; import org.dspace.core.AbstractHibernateDAO; -import javax.persistence.Query; -import javax.persistence.TemporalType; +import org.dspace.core.Context; /** *

@@ -25,25 +25,25 @@ import javax.persistence.TemporalType; * update,insert and delete database operations should go through this class for * checksum history operations. *

- * + * * @author Jim Downing * @author Grace Carpenter * @author Nathan Sarr * @author kevinvandevelde at atmire.com - * - * + * + * */ -public class ChecksumHistoryDAOImpl extends AbstractHibernateDAO implements ChecksumHistoryDAO -{ +public class ChecksumHistoryDAOImpl extends AbstractHibernateDAO implements ChecksumHistoryDAO { - protected ChecksumHistoryDAOImpl() - { + protected ChecksumHistoryDAOImpl() { super(); } @Override - public int deleteByDateAndCode(Context context, Date retentionDate, ChecksumResultCode resultCode) throws SQLException { - String hql = "delete from ChecksumHistory where processEndDate < :processEndDate AND checksumResult.resultCode=:resultCode"; + public int deleteByDateAndCode(Context context, Date retentionDate, ChecksumResultCode resultCode) + throws SQLException { + String hql = "delete from ChecksumHistory where processEndDate < :processEndDate AND checksumResult" + + ".resultCode=:resultCode"; Query query = createQuery(context, hql); query.setParameter("processEndDate", retentionDate, TemporalType.TIMESTAMP); query.setParameter("resultCode", resultCode); diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java index abde4a6e35..a82b904b28 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumResultDAOImpl.java @@ -7,20 +7,17 @@ */ package org.dspace.checker.dao.impl; +import java.sql.SQLException; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + import org.dspace.checker.ChecksumResult; import org.dspace.checker.ChecksumResultCode; import org.dspace.checker.ChecksumResult_; import org.dspace.checker.dao.ChecksumResultDAO; -import org.dspace.core.Context; import org.dspace.core.AbstractHibernateDAO; -import org.dspace.handle.Handle; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; -import java.sql.SQLException; +import org.dspace.core.Context; /** * Hibernate implementation of the Database Access Object interface class for the ChecksumResult object. @@ -29,11 +26,9 @@ import java.sql.SQLException; * * @author kevinvandevelde at atmire.com */ -public class ChecksumResultDAOImpl extends AbstractHibernateDAO implements ChecksumResultDAO -{ +public class ChecksumResultDAOImpl extends AbstractHibernateDAO implements ChecksumResultDAO { - protected ChecksumResultDAOImpl() - { + protected ChecksumResultDAOImpl() { super(); } diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java index 3a50538a0a..80f66fffdf 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java @@ -7,6 +7,17 @@ */ package org.dspace.checker.dao.impl; +import java.sql.SQLException; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Root; +import javax.persistence.criteria.Subquery; + import org.dspace.checker.ChecksumHistory; import org.dspace.checker.ChecksumHistory_; import org.dspace.checker.ChecksumResultCode; @@ -14,26 +25,8 @@ import org.dspace.checker.MostRecentChecksum; import org.dspace.checker.MostRecentChecksum_; import org.dspace.checker.dao.MostRecentChecksumDAO; import org.dspace.content.Bitstream; -import org.dspace.content.BitstreamFormat; -import org.dspace.core.Context; import org.dspace.core.AbstractHibernateDAO; -import org.dspace.eperson.Subscription; -import org.hibernate.Criteria; -import javax.persistence.Query; -import org.hibernate.criterion.*; - -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Order; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.Root; -import javax.persistence.criteria.Subquery; - -import java.sql.SQLException; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; +import org.dspace.core.Context; /** * Hibernate implementation of the Database Access Object interface class for the MostRecentChecksum object. @@ -42,16 +35,16 @@ import java.util.UUID; * * @author kevinvandevelde at atmire.com */ -public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO implements MostRecentChecksumDAO -{ - protected MostRecentChecksumDAOImpl() - { +public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO + implements MostRecentChecksumDAO { + protected MostRecentChecksumDAOImpl() { super(); } @Override - public List findByNotProcessedInDateRange(Context context, Date startDate, Date endDate) throws SQLException { + public List findByNotProcessedInDateRange(Context context, Date startDate, Date endDate) + throws SQLException { // + "most_recent_checksum.last_process_start_date, most_recent_checksum.last_process_end_date, " // + "most_recent_checksum.expected_checksum, most_recent_checksum.current_checksum, " // + "result_description " @@ -66,11 +59,13 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), false), - criteriaBuilder.lessThanOrEqualTo(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), startDate), - criteriaBuilder.greaterThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), endDate) - ) - ); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), false), + criteriaBuilder + .lessThanOrEqualTo(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), endDate) + ) + ); List orderList = new LinkedList<>(); orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); criteriaQuery.orderBy(orderList); @@ -84,13 +79,15 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); - criteriaQuery.where(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream), bitstream)); + criteriaQuery + .where(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream), bitstream)); return singleResult(context, criteriaQuery); } @Override - public List findByResultTypeInDateRange(Context context, Date startDate, Date endDate, ChecksumResultCode resultCode) throws SQLException { + public List findByResultTypeInDateRange(Context context, Date startDate, Date endDate, + ChecksumResultCode resultCode) throws SQLException { // "select bitstream_id, last_process_start_date, last_process_end_date, " // + "expected_checksum, current_checksum, result_description " // + "from most_recent_checksum, checksum_results " @@ -103,11 +100,12 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get("checksumResult.resultCode"), resultCode), - criteriaBuilder.lessThanOrEqualTo(mostRecentChecksumRoot.get("processStartDate"), startDate), - criteriaBuilder.greaterThan(mostRecentChecksumRoot.get("processStartDate"), endDate) - ) - ); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(mostRecentChecksumRoot.get("checksumResult.resultCode"), resultCode), + criteriaBuilder.lessThanOrEqualTo(mostRecentChecksumRoot.get("processStartDate"), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get("processStartDate"), endDate) + ) + ); List orderList = new LinkedList<>(); orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); criteriaQuery.orderBy(orderList); @@ -116,8 +114,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); @@ -159,10 +155,11 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); criteriaQuery.select(mostRecentChecksumRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), true), - criteriaBuilder.lessThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), lessThanDate) - ) - ); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), true), + criteriaBuilder.lessThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), lessThanDate) + ) + ); List orderList = new LinkedList<>(); orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.processEndDate))); @@ -184,7 +181,7 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO implements BitstreamDAO -{ +public class BitstreamDAOImpl extends AbstractHibernateDSODAO implements BitstreamDAO { - protected BitstreamDAOImpl() - { + protected BitstreamDAOImpl() { super(); } @@ -52,10 +57,11 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Bitstream.class); Root bitstreamRoot = criteriaQuery.from(Bitstream.class); criteriaQuery.select(bitstreamRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.internalId), bitstream.getInternalId()), - criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.id), bitstream.getID()) - ) - ); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.internalId), bitstream.getInternalId()), + criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.id), bitstream.getID()) + ) + ); return list(context, criteriaQuery, false, Bitstream.class, -1, -1); } @@ -71,18 +77,20 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme // + "where not exists( select 'x' from most_recent_checksum " // + "where most_recent_checksum.bitstream_id = bitstream.bitstream_id )" - Query query = createQuery(context, "select b from Bitstream b where b not in (select c.bitstream from MostRecentChecksum c)"); + Query query = createQuery(context, + "select b from Bitstream b where b not in (select c.bitstream from " + + "MostRecentChecksum c)"); return query.getResultList(); } @Override public Iterator findByCommunity(Context context, Community community) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + - "join b.bundles bitBundles " + - "join bitBundles.items item " + - "join item.collections itemColl " + - "join itemColl.communities community " + - "WHERE :community IN community"); + "join b.bundles bitBundles " + + "join bitBundles.items item " + + "join item.collections itemColl " + + "join itemColl.communities community " + + "WHERE :community IN community"); query.setParameter("community", community); @@ -92,10 +100,10 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Iterator findByCollection(Context context, Collection collection) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + - "join b.bundles bitBundles " + - "join bitBundles.items item " + - "join item.collections c " + - "WHERE :collection IN c"); + "join b.bundles bitBundles " + + "join bitBundles.items item " + + "join item.collections c " + + "WHERE :collection IN c"); query.setParameter("collection", collection); @@ -105,9 +113,9 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Iterator findByItem(Context context, Item item) throws SQLException { Query query = createQuery(context, "select b from Bitstream b " + - "join b.bundles bitBundles " + - "join bitBundles.items item " + - "WHERE :item IN item"); + "join b.bundles bitBundles " + + "join bitBundles.items item " + + "WHERE :item IN item"); query.setParameter("item", item); @@ -145,19 +153,21 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public int countWithNoPolicy(Context context) throws SQLException { - Query query = createQuery(context,"SELECT count(bit.id) from Bitstream bit where bit.deleted<>true and bit.id not in" + - " (select res.dSpaceObject from ResourcePolicy res where res.resourceTypeId = :typeId )" ); + Query query = createQuery(context, + "SELECT count(bit.id) from Bitstream bit where bit.deleted<>true and bit.id not in" + + " (select res.dSpaceObject from ResourcePolicy res where res.resourceTypeId = " + + ":typeId )"); query.setParameter("typeId", Constants.BITSTREAM); return count(query); } @Override public List getNotReferencedBitstreams(Context context) throws SQLException { - return list(createQuery(context,"select bit from Bitstream bit where bit.deleted != true" + - " and bit.id not in (select bit2.id from Bundle bun join bun.bitstreams bit2)" + - " and bit.id not in (select com.logo.id from Community com)" + - " and bit.id not in (select col.logo.id from Collection col)" + - " and bit.id not in (select bun.primaryBitstream.id from Bundle bun)")); + return list(createQuery(context, "select bit from Bitstream bit where bit.deleted != true" + + " and bit.id not in (select bit2.id from Bundle bun join bun.bitstreams bit2)" + + " and bit.id not in (select com.logo.id from Community com)" + + " and bit.id not in (select col.logo.id from Collection col)" + + " and bit.id not in (select bun.primaryBitstream.id from Bundle bun)")); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java index c22eae513f..0824c5c343 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java @@ -7,23 +7,19 @@ */ package org.dspace.content.dao.impl; -import org.dspace.content.BitstreamFormat; -import org.dspace.content.BitstreamFormat_; -import org.dspace.content.dao.BitstreamFormatDAO; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.harvest.HarvestedItem; -import javax.persistence.Query; -import org.hibernate.Criteria; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; import java.sql.SQLException; import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.dspace.content.BitstreamFormat; +import org.dspace.content.BitstreamFormat_; +import org.dspace.content.dao.BitstreamFormatDAO; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; /** * Hibernate implementation of the Database Access Object interface class for the BitstreamFormat object. @@ -32,11 +28,9 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class BitstreamFormatDAOImpl extends AbstractHibernateDAO implements BitstreamFormatDAO -{ +public class BitstreamFormatDAOImpl extends AbstractHibernateDAO implements BitstreamFormatDAO { - protected BitstreamFormatDAOImpl() - { + protected BitstreamFormatDAOImpl() { super(); } @@ -56,18 +50,19 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); criteriaQuery.select(bitstreamFormatRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.internal), includeInternal), - criteriaBuilder.like(bitstreamFormatRoot.get(BitstreamFormat_.mimetype), mimeType) - ) - ); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.internal), includeInternal), + criteriaBuilder.like(bitstreamFormatRoot.get(BitstreamFormat_.mimetype), mimeType) + ) + ); return singleResult(context, criteriaQuery); } @@ -85,8 +80,7 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); @@ -96,9 +90,12 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); criteriaQuery.select(bitstreamFormatRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.internal), false), - criteriaBuilder.not( - criteriaBuilder.like(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription), "Unknown")) - ) - ); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.internal), false), + criteriaBuilder.not( + criteriaBuilder + .like(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription), + "Unknown")) + ) + ); List orderList = new LinkedList<>(); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java index 828f11e80b..d19c6389f9 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java @@ -7,32 +7,31 @@ */ package org.dspace.content.dao.impl; -import org.dspace.authorize.ResourcePolicy; -import org.dspace.authorize.ResourcePolicy_; -import org.dspace.checker.ChecksumResult; -import org.dspace.content.Collection; -import org.dspace.content.Collection_; -import org.dspace.content.Item; -import org.dspace.content.MetadataField; -import org.dspace.content.dao.CollectionDAO; -import org.dspace.core.Constants; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDSODAO; -import org.dspace.eperson.EPerson; -import org.dspace.eperson.Group; -import org.hibernate.Criteria; -import javax.persistence.Query; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Restrictions; -import org.hibernate.transform.BasicTransformerAdapter; - -import javax.persistence.criteria.*; import java.sql.SQLException; import java.util.AbstractMap; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.ResourcePolicy_; +import org.dspace.content.Collection; +import org.dspace.content.Collection_; +import org.dspace.content.Item; +import org.dspace.content.MetadataField; +import org.dspace.content.dao.CollectionDAO; +import org.dspace.core.AbstractHibernateDSODAO; +import org.dspace.core.Constants; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.eperson.Group; /** * Hibernate implementation of the Database Access Object interface class for the Collection object. @@ -41,10 +40,8 @@ import java.util.Map; * * @author kevinvandevelde at atmire.com */ -public class CollectionDAOImpl extends AbstractHibernateDSODAO implements CollectionDAO -{ - protected CollectionDAOImpl() - { +public class CollectionDAOImpl extends AbstractHibernateDSODAO implements CollectionDAO { + protected CollectionDAOImpl() { super(); } @@ -59,24 +56,24 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple * @throws SQLException if database error */ @Override - public List findAll(Context context, MetadataField order) throws SQLException - { + public List findAll(Context context, MetadataField order) throws SQLException { return findAll(context, order, null, null); } @Override - public List findAll(Context context, MetadataField order, Integer limit, Integer offset) throws SQLException { + public List findAll(Context context, MetadataField order, Integer limit, Integer offset) + throws SQLException { StringBuilder query = new StringBuilder(); - query.append("SELECT ").append(Collection.class.getSimpleName()).append(" FROM Collection as ").append(Collection.class.getSimpleName()).append(" "); + query.append("SELECT ").append(Collection.class.getSimpleName()).append(" FROM Collection as ") + .append(Collection.class.getSimpleName()).append(" "); addMetadataLeftJoin(query, Collection.class.getSimpleName(), Arrays.asList(order)); addMetadataSortQuery(query, Arrays.asList(order), null); Query hibernateQuery = createQuery(context, query.toString()); - if(offset != null) - { + if (offset != null) { hibernateQuery.setFirstResult(offset); } - if(limit != null){ + if (limit != null) { hibernateQuery.setMaxResults(limit); } hibernateQuery.setParameter(order.toString(), order.getID()); @@ -100,18 +97,20 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); Root collectionRoot = criteriaQuery.from(Collection.class); criteriaQuery.select(collectionRoot); - criteriaQuery.where(criteriaBuilder.or(criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep1), group), - criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep2), group), - criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep3), group), - criteriaBuilder.equal(collectionRoot.get(Collection_.submitters), group), - criteriaBuilder.equal(collectionRoot.get(Collection_.admins), group) - ) - ); + criteriaQuery + .where(criteriaBuilder.or(criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep1), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep2), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep3), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.submitters), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.admins), group) + ) + ); return singleResult(context, criteriaQuery); } @Override - public List findAuthorized(Context context, EPerson ePerson, List actions) throws SQLException { + public List findAuthorized(Context context, EPerson ePerson, List actions) + throws SQLException { // TableRowIterator tri = DatabaseManager.query(context, // "SELECT * FROM collection, resourcepolicy, eperson " + // "WHERE resourcepolicy.resource_id = collection.collection_id AND " + @@ -125,51 +124,54 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple Root collectionRoot = criteriaQuery.from(Collection.class); Join join = collectionRoot.join("resourcePolicies"); List orPredicates = new LinkedList(); - for(Integer action : actions){ + for (Integer action : actions) { orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } - Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[]{})); + Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[] {})); criteriaQuery.select(collectionRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), - criteriaBuilder.equal(join.get(ResourcePolicy_.eperson), ePerson), - orPredicate)); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), + criteriaBuilder.equal(join.get(ResourcePolicy_.eperson), ePerson), + orPredicate)); return list(context, criteriaQuery, true, Collection.class, -1, -1); } @Override - public List findAuthorizedByGroup(Context context, EPerson ePerson, List actions) throws SQLException { - // TableRowIterator tri = DatabaseManager.query(context, - // "SELECT \n" + - // " * \n" + - // "FROM \n" + - // " public.eperson, \n" + - // " public.epersongroup2eperson, \n" + - // " public.epersongroup, \n" + - // " public.group2group, \n" + - // " public.resourcepolicy rp_parent, \n" + - // " public.collection\n" + - // "WHERE \n" + - // " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + - // " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + - // " group2group.child_id = epersongroup.eperson_group_id AND\n" + - // " rp_parent.epersongroup_id = group2group.parent_id AND\n" + - // " collection.collection_id = rp_parent.resource_id AND\n" + - // " eperson.eperson_id = ? AND \n" + - // " (rp_parent.action_id = 3 OR \n" + - // " rp_parent.action_id = 11 \n" + - // " ) AND rp_parent.resource_type_id = 3;", context.getCurrentUser().getID()); + public List findAuthorizedByGroup(Context context, EPerson ePerson, List actions) + throws SQLException { + // TableRowIterator tri = DatabaseManager.query(context, + // "SELECT \n" + + // " * \n" + + // "FROM \n" + + // " public.eperson, \n" + + // " public.epersongroup2eperson, \n" + + // " public.epersongroup, \n" + + // " public.group2group, \n" + + // " public.resourcepolicy rp_parent, \n" + + // " public.collection\n" + + // "WHERE \n" + + // " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + + // " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + + // " group2group.child_id = epersongroup.eperson_group_id AND\n" + + // " rp_parent.epersongroup_id = group2group.parent_id AND\n" + + // " collection.collection_id = rp_parent.resource_id AND\n" + + // " eperson.eperson_id = ? AND \n" + + // " (rp_parent.action_id = 3 OR \n" + + // " rp_parent.action_id = 11 \n" + + // " ) AND rp_parent.resource_type_id = 3;", context.getCurrentUser().getID()); StringBuilder query = new StringBuilder(); query.append("select c from Collection c join c.resourcePolicies rp join rp.epersonGroup rpGroup WHERE "); for (int i = 0; i < actions.size(); i++) { Integer action = actions.get(i); - if(i != 0) - { + if (i != 0) { query.append(" AND "); } query.append("rp.actionId=").append(action); } query.append(" AND rp.resourceTypeId=").append(Constants.COLLECTION); - query.append(" AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in elements(epeople))"); + query.append( + " AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in " + + "elements(epeople))"); Query persistenceQuery = createQuery(context, query.toString()); persistenceQuery.setParameter("eperson_id", ePerson.getID()); persistenceQuery.setHint("org.hibernate.cacheable", Boolean.TRUE); @@ -191,13 +193,15 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple @Override @SuppressWarnings("unchecked") - public List> getCollectionsWithBitstreamSizesTotal(Context context) throws SQLException { - String q = "select col as collection, sum(bit.sizeBytes) as totalBytes from Item i join i.collections col join i.bundles bun join bun.bitstreams bit group by col"; + public List> getCollectionsWithBitstreamSizesTotal(Context context) + throws SQLException { + String q = "select col as collection, sum(bit.sizeBytes) as totalBytes from Item i join i.collections col " + + "join i.bundles bun join bun.bitstreams bit group by col"; Query query = createQuery(context, q); List list = query.getResultList(); List> returnList = new LinkedList<>(); - for(Object[] o : list) { + for (Object[] o : list) { returnList.add(new AbstractMap.SimpleEntry<>((Collection) o[0], (Long) o[1])); } return returnList; diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java index 845cc003f4..a0cd514ef5 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java @@ -135,7 +135,7 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme for (Integer action : actions) { orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } - Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[]{})); + Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[] {})); criteriaQuery.select(communityRoot); criteriaQuery.where( criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index 1151c05789..c83b384f2d 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -7,6 +7,21 @@ */ package org.dspace.content.dao.impl; +import java.sql.SQLException; +import java.util.Collections; +import java.util.Date; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; +import javax.persistence.Query; +import javax.persistence.TemporalType; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import javax.persistence.criteria.Subquery; + import org.apache.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; @@ -16,24 +31,9 @@ import org.dspace.content.MetadataField; import org.dspace.content.MetadataValue; import org.dspace.content.MetadataValue_; import org.dspace.content.dao.ItemDAO; -import org.dspace.core.Context; import org.dspace.core.AbstractHibernateDSODAO; +import org.dspace.core.Context; import org.dspace.eperson.EPerson; -import javax.persistence.Query; -import javax.persistence.TemporalType; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; -import javax.persistence.criteria.Subquery; - -import java.sql.SQLException; -import java.util.Collections; -import java.util.Date; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; /** * Hibernate implementation of the Database Access Object interface class for the Item object. @@ -42,12 +42,10 @@ import java.util.UUID; * * @author kevinvandevelde at atmire.com */ -public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDAO -{ +public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDAO { private static final Logger log = Logger.getLogger(ItemDAOImpl.class); - protected ItemDAOImpl() - { + protected ItemDAOImpl() { super(); } @@ -78,16 +76,14 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA @Override public Iterator findAll(Context context, boolean archived, - boolean withdrawn, boolean discoverable, Date lastModified) - throws SQLException - { + boolean withdrawn, boolean discoverable, Date lastModified) + throws SQLException { StringBuilder queryStr = new StringBuilder(); queryStr.append("SELECT i FROM Item i"); queryStr.append(" WHERE (inArchive = :in_archive OR withdrawn = :withdrawn)"); queryStr.append(" AND discoverable = :discoverable"); - if(lastModified != null) - { + if (lastModified != null) { queryStr.append(" AND last_modified > :last_modified"); } @@ -95,10 +91,9 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA query.setParameter("in_archive", archived); query.setParameter("withdrawn", withdrawn); query.setParameter("discoverable", discoverable); - if(lastModified != null) - { + if (lastModified != null) { query.setParameter("last_modified", lastModified, TemporalType.TIMESTAMP); - } + } return iterate(query); } @@ -111,7 +106,8 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public Iterator findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) throws SQLException { + public Iterator findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) + throws SQLException { StringBuilder query = new StringBuilder(); query.append("SELECT item FROM Item as item "); addMetadataLeftJoin(query, Item.class.getSimpleName().toLowerCase(), Collections.singletonList(metadataField)); @@ -129,89 +125,30 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public Iterator findByMetadataField(Context context, MetadataField metadataField, String value, boolean inArchive) throws SQLException { - String hqlQueryString = "SELECT item FROM Item as item join item.metadata metadatavalue WHERE item.inArchive=:in_archive AND metadatavalue.metadataField = :metadata_field"; - if(value != null) - { + public Iterator findByMetadataField(Context context, MetadataField metadataField, String value, + boolean inArchive) throws SQLException { + String hqlQueryString = "SELECT item FROM Item as item join item.metadata metadatavalue WHERE item" + + ".inArchive=:in_archive AND metadatavalue.metadataField = :metadata_field"; + if (value != null) { hqlQueryString += " AND STR(metadatavalue.value) = :text_value"; } Query query = createQuery(context, hqlQueryString); query.setParameter("in_archive", inArchive); query.setParameter("metadata_field", metadataField); - if(value != null) - { + if (value != null) { query.setParameter("text_value", value); } return iterate(query); } - enum OP {equals,not_equals,like,not_like,contains,doesnt_contain,exists,doesnt_exist,matches,doesnt_match;} + enum OP { equals, not_equals, like, not_like, contains, + doesnt_contain, exists, doesnt_exist, matches, doesnt_match; } @Override - public Iterator findByMetadataQuery(Context context, List> listFieldList, List query_op, List query_val, List collectionUuids, String regexClause, int offset, int limit) throws SQLException { -// Criteria criteria = createCriteria(context, Item.class, "item"); -// criteria.setFirstResult(offset); -// criteria.setMaxResults(limit); -// -// if (!collectionUuids.isEmpty()){ -// DetachedCriteria dcollCriteria = DetachedCriteria.forClass(Collection.class, "coll"); -// dcollCriteria.setProjection(Projections.property("coll.id")); -// dcollCriteria.add(Restrictions.eqProperty("coll.id", "item.owningCollection")); -// dcollCriteria.add(Restrictions.in("coll.id", collectionUuids)); -// criteria.add(Subqueries.exists(dcollCriteria)); -// } -// -// int index = Math.min(listFieldList.size(), Math.min(query_op.size(), query_val.size())); -// StringBuilder sb = new StringBuilder(); -// -// for(int i=0; i findByMetadataQuery(Context context, List> listFieldList, + List query_op, List query_val, List collectionUuids, + String regexClause, int offset, int limit) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Item.class); @@ -221,60 +158,72 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA List predicateList = new LinkedList<>(); - if(!collectionUuids.isEmpty()){ + if (!collectionUuids.isEmpty()) { predicateList.add(criteriaBuilder.isTrue(itemRoot.get(Item_.owningCollection).in(collectionUuids))); } int index = Math.min(listFieldList.size(), Math.min(query_op.size(), query_val.size())); - for(int i = 0; i < index; i++){ + for (int i = 0; i < index; i++) { OP op = OP.valueOf(query_op.get(i)); - if (op == null) { - log.warn("Skipping Invalid Operator: " + query_op.get(i)); - continue; - } + if (op == null) { + log.warn("Skipping Invalid Operator: " + query_op.get(i)); + continue; + } - if (op == OP.matches || op == OP.doesnt_match) { - if (regexClause.isEmpty()) { - log.warn("Skipping Unsupported Regex Operator: " + query_op.get(i)); - continue; - } - } + if (op == OP.matches || op == OP.doesnt_match) { + if (regexClause.isEmpty()) { + log.warn("Skipping Unsupported Regex Operator: " + query_op.get(i)); + continue; + } + } Subquery subquery = criteriaQuery.subquery(DSpaceObject.class); - Root subqueryRoot = subquery.from(MetadataValue.class); - subquery.select(subqueryRoot.get(MetadataValue_.dSpaceObject)); + Root subqueryRoot = subquery.from(MetadataValue.class); + subquery.select(subqueryRoot.get(MetadataValue_.dSpaceObject)); List predicateListSubQuery = new LinkedList<>(); - predicateListSubQuery.add(criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.dSpaceObject), itemRoot.get(Item_.id))); + predicateListSubQuery + .add(criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.dSpaceObject), itemRoot.get(Item_.id))); if (!listFieldList.get(i).isEmpty()) { - predicateListSubQuery.add(criteriaBuilder.isTrue(subqueryRoot.get(MetadataValue_.metadataField).in(listFieldList.get(i)))); - } - if (op == OP.equals){ - predicateListSubQuery.add(criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); - } else if (op == OP.like){ - predicateListSubQuery.add(criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); - } else if (op == OP.contains){ - predicateListSubQuery.add(criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), "%"+query_val.get(i)+"%")); - } else if (op == OP.not_equals){ - predicateListSubQuery.add(criteriaBuilder.notEqual(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); - } else if (op == OP.not_like){ - predicateListSubQuery.add(criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); - } else if (op == OP.doesnt_contain){ - predicateListSubQuery.add(criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), "%"+query_val.get(i)+"%")); + predicateListSubQuery.add( + criteriaBuilder.isTrue(subqueryRoot.get(MetadataValue_.metadataField).in(listFieldList.get(i)))); } - subquery.where(predicateListSubQuery.toArray(new Predicate[]{})); + if (op == OP.equals) { + predicateListSubQuery + .add(criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); + } else if (op == OP.like) { + predicateListSubQuery + .add(criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); + } else if (op == OP.contains) { + predicateListSubQuery + .add(criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), "%" + query_val.get(i) + "%")); + } else if (op == OP.not_equals) { + predicateListSubQuery + .add(criteriaBuilder.notEqual(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); + } else if (op == OP.not_like) { + predicateListSubQuery + .add(criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); + } else if (op == OP.doesnt_contain) { + predicateListSubQuery + .add(criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), "%" + query_val.get(i) + "%")); + } + subquery.where(predicateListSubQuery.toArray(new Predicate[] {})); predicateList.add(criteriaBuilder.isTrue(itemRoot.get(Item_.id).in(subquery))); } - criteriaQuery.where(predicateList.toArray(new Predicate[]{})); + criteriaQuery.where(predicateList.toArray(new Predicate[] {})); return list(context, criteriaQuery, false, Item.class, offset, limit).iterator(); } @Override - public Iterator findByAuthorityValue(Context context, MetadataField metadataField, String authority, boolean inArchive) throws SQLException { - Query query = createQuery(context, "SELECT item FROM Item as item join item.metadata metadatavalue WHERE item.inArchive=:in_archive AND metadatavalue.metadataField = :metadata_field AND metadatavalue.authority = :authority"); + public Iterator findByAuthorityValue(Context context, MetadataField metadataField, String authority, + boolean inArchive) throws SQLException { + Query query = createQuery(context, + "SELECT item FROM Item as item join item.metadata metadatavalue WHERE item" + + ".inArchive=:in_archive AND metadatavalue.metadataField = :metadata_field AND " + + "metadatavalue.authority = :authority"); query.setParameter("in_archive", inArchive); query.setParameter("metadata_field", metadataField); query.setParameter("authority", authority); @@ -282,16 +231,17 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public Iterator findArchivedByCollection(Context context, Collection collection, Integer limit, Integer offset) throws SQLException { - Query query = createQuery(context, "select i from Item i join i.collections c WHERE :collection IN c AND i.inArchive=:in_archive"); + public Iterator findArchivedByCollection(Context context, Collection collection, Integer limit, + Integer offset) throws SQLException { + Query query = createQuery(context, + "select i from Item i join i.collections c WHERE :collection IN c AND i" + + ".inArchive=:in_archive"); query.setParameter("collection", collection); query.setParameter("in_archive", true); - if(offset != null) - { + if (offset != null) { query.setFirstResult(offset); } - if(limit != null) - { + if (limit != null) { query.setMaxResults(limit); } return iterate(query); @@ -322,8 +272,11 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn) throws SQLException { - Query query = createQuery(context, "select count(i) from Item i join i.collections c WHERE :collection IN c AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); + public int countItems(Context context, Collection collection, boolean includeArchived, boolean includeWithdrawn) + throws SQLException { + Query query = createQuery(context, + "select count(i) from Item i join i.collections c WHERE :collection IN c AND i" + + ".inArchive=:in_archive AND i.withdrawn=:withdrawn"); query.setParameter("collection", collection); query.setParameter("in_archive", includeArchived); query.setParameter("withdrawn", includeWithdrawn); @@ -332,13 +285,14 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } @Override - public int countItems(Context context, List collections, boolean includeArchived, boolean includeWithdrawn) throws SQLException { + public int countItems(Context context, List collections, boolean includeArchived, + boolean includeWithdrawn) throws SQLException { if (collections.size() == 0) { return 0; } Query query = createQuery(context, "select count(distinct i) from Item i " + - "join i.collections collection " + - "WHERE collection IN (:collections) AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); + "join i.collections collection " + + "WHERE collection IN (:collections) AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); query.setParameter("collections", collections); query.setParameter("in_archive", includeArchived); query.setParameter("withdrawn", includeWithdrawn); @@ -348,8 +302,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA @Override public Iterator findByLastModifiedSince(Context context, Date since) - throws SQLException - { + throws SQLException { Query query = createQuery(context, "SELECT i FROM item i WHERE last_modified > :last_modified"); query.setParameter("last_modified", since, TemporalType.TIMESTAMP); return iterate(query); @@ -362,7 +315,9 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA @Override public int countItems(Context context, boolean includeArchived, boolean includeWithdrawn) throws SQLException { - Query query = createQuery(context, "SELECT count(*) FROM Item i WHERE i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); + Query query = createQuery(context, + "SELECT count(*) FROM Item i WHERE i.inArchive=:in_archive AND i" + + ".withdrawn=:withdrawn"); query.setParameter("in_archive", includeArchived); query.setParameter("withdrawn", includeWithdrawn); return count(query); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java index 6d9dfb3507..e74527eabc 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java @@ -7,22 +7,22 @@ */ package org.dspace.content.dao.impl; -import org.dspace.content.*; -import org.dspace.content.dao.MetadataFieldDAO; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.core.Context; -import org.dspace.eperson.RegistrationData; -import org.hibernate.Criteria; -import org.hibernate.FetchMode; -import org.hibernate.criterion.Order; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.LinkedList; -import java.util.List; + +import org.dspace.content.MetadataField; +import org.dspace.content.MetadataField_; +import org.dspace.content.MetadataSchema; +import org.dspace.content.MetadataSchema_; +import org.dspace.content.dao.MetadataFieldDAO; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; /** * Hibernate implementation of the Database Access Object interface class for the MetadataField object. @@ -31,39 +31,37 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class MetadataFieldDAOImpl extends AbstractHibernateDAO implements MetadataFieldDAO -{ - protected MetadataFieldDAOImpl() - { +public class MetadataFieldDAOImpl extends AbstractHibernateDAO implements MetadataFieldDAO { + protected MetadataFieldDAOImpl() { super(); } @Override public MetadataField find(Context context, int metadataFieldId, MetadataSchema metadataSchema, String element, - String qualifier) throws SQLException{ + String qualifier) throws SQLException { Query query; - if(qualifier != null) { + if (qualifier != null) { query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE mf.id != :id " + - "AND ms.name = :name AND mf.element = :element " + - "AND qualifier = :qualifier"); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE mf.id != :id " + + "AND ms.name = :name AND mf.element = :element " + + "AND qualifier = :qualifier"); } else { query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE mf.id != :id " + - "AND ms.name = :name AND mf.element = :element " + - "AND mf.qualifier IS NULL"); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE mf.id != :id " + + "AND ms.name = :name AND mf.element = :element " + + "AND mf.qualifier IS NULL"); } query.setParameter("id", metadataFieldId); query.setParameter("name", metadataSchema.getName()); query.setParameter("element", element); - if(qualifier != null) { + if (qualifier != null) { query.setParameter("qualifier", qualifier); } query.setHint("org.hibernate.cacheable", Boolean.TRUE); @@ -72,34 +70,34 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im } @Override - public MetadataField findByElement(Context context, MetadataSchema metadataSchema, String element, String qualifier) throws SQLException - { + public MetadataField findByElement(Context context, MetadataSchema metadataSchema, String element, String qualifier) + throws SQLException { return findByElement(context, metadataSchema.getName(), element, qualifier); } @Override - public MetadataField findByElement(Context context, String metadataSchema, String element, String qualifier) throws SQLException - { + public MetadataField findByElement(Context context, String metadataSchema, String element, String qualifier) + throws SQLException { Query query; - if(qualifier != null) { + if (qualifier != null) { query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE ms.name = :name AND mf.element = :element " + - "AND qualifier = :qualifier"); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE ms.name = :name AND mf.element = :element " + + "AND qualifier = :qualifier"); } else { query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE ms.name = :name AND mf.element = :element " + - "AND mf.qualifier IS NULL"); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE ms.name = :name AND mf.element = :element " + + "AND mf.qualifier IS NULL"); } query.setParameter("name", metadataSchema); query.setParameter("element", element); - if(qualifier != null) { + if (qualifier != null) { query.setParameter("qualifier", qualifier); } query.setHint("org.hibernate.cacheable", Boolean.TRUE); @@ -126,12 +124,12 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im } @Override - public List findFieldsByElementNameUnqualified(Context context, String metadataSchema, String element) throws SQLException - { + public List findFieldsByElementNameUnqualified(Context context, String metadataSchema, + String element) throws SQLException { Query query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE ms.name = :name AND mf.element = :element "); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE ms.name = :name AND mf.element = :element "); query.setParameter("name", metadataSchema); @@ -141,15 +139,15 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im return list(query); } - + @Override public List findAllInSchema(Context context, MetadataSchema metadataSchema) throws SQLException { Query query = createQuery(context, "SELECT mf " + - "FROM MetadataField mf " + - "JOIN FETCH mf.metadataSchema ms " + - "WHERE ms.name = :name " + - "ORDER BY mf.element ASC, mf.qualifier ASC "); + "FROM MetadataField mf " + + "JOIN FETCH mf.metadataSchema ms " + + "WHERE ms.name = :name " + + "ORDER BY mf.element ASC, mf.qualifier ASC "); query.setParameter("name", metadataSchema.getName()); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java index 9c8dbdcd72..80198a1e89 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java @@ -7,22 +7,19 @@ */ package org.dspace.content.dao.impl; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + import org.dspace.content.MetadataSchema; import org.dspace.content.MetadataSchema_; import org.dspace.content.dao.MetadataSchemaDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.dspace.eperson.Subscription; -import org.dspace.eperson.Subscription_; -import org.hibernate.Criteria; -import org.hibernate.criterion.Order; -import javax.persistence.Query; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.LinkedList; -import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the MetadataSchema object. @@ -31,10 +28,8 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class MetadataSchemaDAOImpl extends AbstractHibernateDAO implements MetadataSchemaDAO -{ - protected MetadataSchemaDAOImpl() - { +public class MetadataSchemaDAOImpl extends AbstractHibernateDAO implements MetadataSchemaDAO { + protected MetadataSchemaDAOImpl() { super(); } @@ -47,12 +42,11 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO * @throws SQLException if database error */ @Override - public MetadataSchema findByNamespace(Context context, String namespace) throws SQLException - { + public MetadataSchema findByNamespace(Context context, String namespace) throws SQLException { // Grab rows from DB Query query = createQuery(context, - "SELECT ms FROM MetadataSchema ms " + - "WHERE ms.namespace = :namespace "); + "SELECT ms FROM MetadataSchema ms " + + "WHERE ms.namespace = :namespace "); query.setParameter("namespace", namespace); query.setHint("org.hibernate.cacheable", Boolean.TRUE); @@ -87,11 +81,10 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO * @throws SQLException if database error */ @Override - public boolean uniqueNamespace(Context context, int metadataSchemaId, String namespace) throws SQLException - { + public boolean uniqueNamespace(Context context, int metadataSchemaId, String namespace) throws SQLException { Query query = createQuery(context, - "SELECT ms FROM MetadataSchema ms " + - "WHERE ms.namespace = :namespace and ms.id != :id"); + "SELECT ms FROM MetadataSchema ms " + + "WHERE ms.namespace = :namespace and ms.id != :id"); query.setParameter("namespace", namespace); query.setParameter("id", metadataSchemaId); @@ -110,11 +103,10 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO * @throws SQLException if database error */ @Override - public boolean uniqueShortName(Context context, int metadataSchemaId, String name) throws SQLException - { + public boolean uniqueShortName(Context context, int metadataSchemaId, String name) throws SQLException { Query query = createQuery(context, - "SELECT ms FROM MetadataSchema ms " + - "WHERE ms.name = :name and ms.id != :id"); + "SELECT ms FROM MetadataSchema ms " + + "WHERE ms.name = :name and ms.id != :id"); query.setParameter("name", name); query.setParameter("id", metadataSchemaId); @@ -134,11 +126,10 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO * @throws SQLException if database error */ @Override - public MetadataSchema find(Context context, String shortName) throws SQLException - { + public MetadataSchema find(Context context, String shortName) throws SQLException { Query query = createQuery(context, - "SELECT ms FROM MetadataSchema ms " + - "WHERE ms.name = :name"); + "SELECT ms FROM MetadataSchema ms " + + "WHERE ms.name = :name"); query.setParameter("name", shortName); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java index edb1e346c2..518b6150a2 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java @@ -7,28 +7,21 @@ */ package org.dspace.content.dao.impl; +import java.sql.SQLException; +import java.util.Iterator; +import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; + import org.dspace.content.MetadataField; import org.dspace.content.MetadataField_; import org.dspace.content.MetadataValue; import org.dspace.content.dao.MetadataValueDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.dspace.versioning.Version; -import org.dspace.versioning.VersionHistory; -import org.dspace.versioning.Version_; -import org.hibernate.Criteria; -import org.hibernate.FetchMode; -import org.hibernate.criterion.Restrictions; - -import javax.persistence.Query; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Join; -import javax.persistence.criteria.Root; -import javax.persistence.criteria.JoinType; -import java.sql.SQLException; -import java.util.Iterator; -import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the MetadataValue object. @@ -37,17 +30,14 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class MetadataValueDAOImpl extends AbstractHibernateDAO implements MetadataValueDAO -{ - protected MetadataValueDAOImpl() - { +public class MetadataValueDAOImpl extends AbstractHibernateDAO implements MetadataValueDAO { + protected MetadataValueDAOImpl() { super(); } @Override - public List findByField(Context context, MetadataField metadataField) throws SQLException - { + public List findByField(Context context, MetadataField metadataField) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataValue.class); Root metadataValueRoot = criteriaQuery.from(MetadataValue.class); @@ -56,13 +46,13 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im criteriaQuery.where(criteriaBuilder.equal(join.get(MetadataField_.id), metadataField.getID())); - return list(context, criteriaQuery,true, MetadataValue.class, -1, -1); + return list(context, criteriaQuery, true, MetadataValue.class, -1, -1); } @Override public Iterator findByValueLike(Context context, String value) throws SQLException { String queryString = "SELECT m FROM MetadataValue m JOIN m.metadataField f " + - "WHERE m.value like concat('%', concat(:searchString,'%')) ORDER BY m.id ASC"; + "WHERE m.value like concat('%', concat(:searchString,'%')) ORDER BY m.id ASC"; Query query = createQuery(context, queryString); query.setParameter("searchString", value); @@ -80,9 +70,9 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im @Override public MetadataValue getMinimum(Context context, int metadataFieldId) - throws SQLException - { - String queryString = "SELECT m FROM MetadataValue m JOIN FETCH m.metadataField WHERE m.metadataField.id = :metadata_field_id ORDER BY text_value"; + throws SQLException { + String queryString = "SELECT m FROM MetadataValue m JOIN FETCH m.metadataField WHERE m.metadataField.id = " + + ":metadata_field_id ORDER BY text_value"; Query query = createQuery(context, queryString); query.setParameter("metadata_field_id", metadataFieldId); query.setMaxResults(1); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java index 8b7009ac41..4533eab76a 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java @@ -7,17 +7,15 @@ */ package org.dspace.content.dao.impl; -import org.dspace.content.Site; -import org.dspace.content.dao.SiteDAO; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.identifier.DOI; -import org.hibernate.Criteria; - +import java.sql.SQLException; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import java.sql.SQLException; + +import org.dspace.content.Site; +import org.dspace.content.dao.SiteDAO; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; /** * Hibernate implementation of the Database Access Object interface class for the Site object. @@ -26,10 +24,8 @@ import java.sql.SQLException; * * @author kevinvandevelde at atmire.com */ -public class SiteDAOImpl extends AbstractHibernateDAO implements SiteDAO -{ - protected SiteDAOImpl() - { +public class SiteDAOImpl extends AbstractHibernateDAO implements SiteDAO { + protected SiteDAOImpl() { super(); } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java index 1c2ebc5bff..41ffdd931f 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java @@ -7,37 +7,27 @@ */ package org.dspace.content.dao.impl; -import org.dspace.content.Collection; -import org.dspace.content.Item; -import org.dspace.content.WorkspaceItem; -import org.dspace.content.WorkspaceItem_; -import org.dspace.content.dao.WorkspaceItemDAO; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.eperson.EPerson; -import org.dspace.eperson.EPerson_; -import org.dspace.eperson.Group; -import org.dspace.harvest.HarvestedCollection_; -import org.dspace.identifier.DOI; -import org.dspace.workflow.WorkflowItem; -import org.hibernate.Criteria; -import javax.persistence.Query; - -import org.hibernate.SQLQuery; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; -import org.hibernate.transform.BasicTransformerAdapter; -import org.springframework.jdbc.object.SqlQuery; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Join; -import javax.persistence.criteria.Root; import java.sql.SQLException; import java.util.AbstractMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; + +import org.dspace.content.Collection; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.content.WorkspaceItem_; +import org.dspace.content.dao.WorkspaceItemDAO; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.eperson.EPerson_; +import org.dspace.eperson.Group; /** * Hibernate implementation of the Database Access Object interface class for the WorkspaceItem object. @@ -46,25 +36,23 @@ import java.util.Map; * * @author kevinvandevelde at atmire.com */ -public class WorkspaceItemDAOImpl extends AbstractHibernateDAO implements WorkspaceItemDAO -{ - protected WorkspaceItemDAOImpl() - { +public class WorkspaceItemDAOImpl extends AbstractHibernateDAO implements WorkspaceItemDAO { + protected WorkspaceItemDAOImpl() { super(); } @Override - public List findByEPerson(Context context, EPerson ep) throws SQLException - { - Query query = createQuery(context, "from WorkspaceItem ws where ws.item.submitter = :submitter order by workspaceItemId"); + public List findByEPerson(Context context, EPerson ep) throws SQLException { + Query query = createQuery(context, + "from WorkspaceItem ws where ws.item.submitter = :submitter order by " + + "workspaceItemId"); query.setParameter("submitter", ep); return list(query); } @Override - public List findByCollection(Context context, Collection c) throws SQLException - { + public List findByCollection(Context context, Collection c) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); @@ -75,8 +63,7 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im } @Override - public WorkspaceItem findByItem(Context context, Item i) throws SQLException - { + public WorkspaceItem findByItem(Context context, Item i) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); @@ -86,8 +73,7 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im } @Override - public List findAll(Context context) throws SQLException - { + public List findAll(Context context) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); @@ -101,10 +87,9 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); } - + @Override - public List findAll(Context context, Integer limit, Integer offset) throws SQLException - { + public List findAll(Context context, Integer limit, Integer offset) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); @@ -159,12 +144,13 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override @SuppressWarnings("unchecked") public List> getStageReachedCounts(Context context) throws SQLException { - Query query = createQuery(context,"SELECT wi.stageReached as stage_reached, count(*) as cnt from WorkspaceItem wi" + - " group by wi.stageReached order by wi.stageReached"); + Query query = createQuery(context, + "SELECT wi.stageReached as stage_reached, count(*) as cnt from WorkspaceItem wi" + + " group by wi.stageReached order by wi.stageReached"); List list = query.getResultList(); List> returnList = new LinkedList<>(); - for(Object[] o : list) { + for (Object[] o : list) { returnList.add(new AbstractMap.SimpleEntry<>((Integer) o[0], (Long) o[1])); } return returnList; diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index 416edf573b..d7a428391a 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -124,22 +124,23 @@ public abstract class AbstractHibernateDAO implements GenericDAO { return getHibernateSession(context).createQuery(query); } - public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, int offset) throws SQLException - { + public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, + int offset) throws SQLException { criteriaQuery.distinct(true); @SuppressWarnings("unchecked") List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, clazz, maxResults, offset); return result; } - public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, int offset, boolean distinct) throws SQLException - { + + public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, + int offset, boolean distinct) throws SQLException { criteriaQuery.distinct(distinct); @SuppressWarnings("unchecked") - List result = (List) executeCriteriaQuery(context,criteriaQuery,cacheable, clazz, maxResults, offset); + List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, clazz, maxResults, offset); return result; } - public List list(Query query) - { + + public List list(Query query) { @SuppressWarnings("unchecked") List result = (List) query.getResultList(); return result; @@ -245,7 +246,7 @@ public abstract class AbstractHibernateDAO implements GenericDAO { if (maxResults != -1) { query.setMaxResults(maxResults); } - if(offset != -1){ + if (offset != -1) { query.setFirstResult(offset); } return query.getResultList(); diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java index 26414bccbc..232431cac7 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java @@ -43,8 +43,7 @@ public abstract class AbstractHibernateDSODAO extends Ab * @return * @throws SQLException */ - public T findByLegacyId(Context context, int legacyId, Class clazz) throws SQLException - { + public T findByLegacyId(Context context, int legacyId, Class clazz) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, clazz); Root root = criteriaQuery.from(clazz); @@ -114,7 +113,8 @@ public abstract class AbstractHibernateDSODAO extends Ab * @param metadataSortFields fields on which to sort -- use this OR columnSortFields. * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. */ - protected void addMetadataSortQuery(StringBuilder query, List metadataSortFields, List columnSortFields) { + protected void addMetadataSortQuery(StringBuilder query, List metadataSortFields, + List columnSortFields) { addMetadataSortQuery(query, metadataSortFields, columnSortFields, ListUtils.EMPTY_LIST); } diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java index 9235117a7b..840e590186 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java @@ -44,8 +44,7 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements } @Override - public EPerson findByEmail(Context context, String email) throws SQLException - { + public EPerson findByEmail(Context context, String email) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); Root ePersonRoot = criteriaQuery.from(EPerson.class); @@ -56,8 +55,7 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements @Override - public EPerson findByNetid(Context context, String netid) throws SQLException - { + public EPerson findByNetid(Context context, String netid) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); Root ePersonRoot = criteriaQuery.from(EPerson.class); diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java index bfcf58f414..717b41e8b9 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java @@ -7,26 +7,21 @@ */ package org.dspace.eperson.dao.impl; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.eperson.Group; -import org.dspace.eperson.Group2GroupCache; -import org.dspace.eperson.Group2GroupCache_; -import org.dspace.eperson.dao.Group2GroupCacheDAO; -import org.dspace.xmlworkflow.storedcomponents.PoolTask; -import org.hibernate.Criteria; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; import javax.persistence.Query; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Restrictions; - import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; + +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.eperson.Group; +import org.dspace.eperson.Group2GroupCache; +import org.dspace.eperson.Group2GroupCache_; +import org.dspace.eperson.dao.Group2GroupCacheDAO; /** * Hibernate implementation of the Database Access Object interface class for the Group2GroupCache object. @@ -35,10 +30,8 @@ import java.util.Set; * * @author kevinvandevelde at atmire.com */ -public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO implements Group2GroupCacheDAO -{ - protected Group2GroupCacheDAOImpl() - { +public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO implements Group2GroupCacheDAO { + protected Group2GroupCacheDAOImpl() { super(); } @@ -58,10 +51,10 @@ public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); List eqPredicates = new LinkedList<>(); - for(Group group : groups){ + for (Group group : groups) { eqPredicates.add(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.child), group)); } - Predicate orPredicate = criteriaBuilder.or(eqPredicates.toArray(new Predicate[]{})); + Predicate orPredicate = criteriaBuilder.or(eqPredicates.toArray(new Predicate[] {})); criteriaQuery.select(group2GroupCacheRoot); criteriaQuery.where(orPredicate); return list(context, criteriaQuery, true, Group2GroupCache.class, -1, -1); @@ -70,7 +63,7 @@ public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); criteriaQuery.select(group2GroupCacheRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.parent), parent), - criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.child), child) - ) - ); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.parent), parent), + criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.child), child) + ) + ); return uniqueResult(context, criteriaQuery, true, Group2GroupCache.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java index 71eaeda9e1..8050bd9755 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java @@ -7,6 +7,12 @@ */ package org.dspace.eperson.dao.impl; +import java.sql.SQLException; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import javax.persistence.Query; + import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.dspace.content.MetadataField; @@ -15,11 +21,6 @@ import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.dao.GroupDAO; -import javax.persistence.Query; -import java.sql.SQLException; -import java.util.Collections; -import java.util.List; -import java.util.UUID; /** * Hibernate implementation of the Database Access Object interface class for the Group object. @@ -28,16 +29,14 @@ import java.util.UUID; * * @author kevinvandevelde at atmire.com */ -public class GroupDAOImpl extends AbstractHibernateDSODAO implements GroupDAO -{ - protected GroupDAOImpl() - { +public class GroupDAOImpl extends AbstractHibernateDSODAO implements GroupDAO { + protected GroupDAOImpl() { super(); } @Override - public List findByMetadataField(Context context, String searchValue, MetadataField metadataField) throws SQLException - { + public List findByMetadataField(Context context, String searchValue, MetadataField metadataField) + throws SQLException { StringBuilder queryBuilder = new StringBuilder(); String groupTableName = "g"; queryBuilder.append("SELECT ").append(groupTableName).append(" FROM Group as ").append(groupTableName); @@ -53,8 +52,8 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou } @Override - public List findAll(Context context, List sortMetadataFields, int pageSize, int offset) throws SQLException - { + public List findAll(Context context, List sortMetadataFields, int pageSize, int offset) + throws SQLException { StringBuilder queryBuilder = new StringBuilder(); String groupTableName = "g"; queryBuilder.append("SELECT ").append(groupTableName).append(" FROM Group as ").append(groupTableName); @@ -64,10 +63,10 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou Query query = createQuery(context, queryBuilder.toString()); if (pageSize > 0) { - query.setMaxResults(pageSize); + query.setMaxResults(pageSize); } if (offset > 0) { - query.setFirstResult(offset); + query.setFirstResult(offset); } for (MetadataField sortField : sortMetadataFields) { query.setParameter(sortField.toString(), sortField.getID()); @@ -78,12 +77,12 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public List findAll(Context context, int pageSize, int offset) throws SQLException { Query query = createQuery(context, - "SELECT g FROM Group g ORDER BY g.name ASC"); + "SELECT g FROM Group g ORDER BY g.name ASC"); if (pageSize > 0) { - query.setMaxResults(pageSize); + query.setMaxResults(pageSize); } if (offset > 0) { - query.setFirstResult(offset); + query.setFirstResult(offset); } query.setHint("org.hibernate.cacheable", Boolean.TRUE); @@ -92,7 +91,8 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { - Query query = createQuery(context, "from Group where (from EPerson e where e.id = :eperson_id) in elements(epeople)"); + Query query = createQuery(context, + "from Group where (from EPerson e where e.id = :eperson_id) in elements(epeople)"); query.setParameter("eperson_id", ePerson.getID()); query.setHint("org.hibernate.cacheable", Boolean.TRUE); @@ -102,8 +102,8 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public Group findByName(final Context context, final String name) throws SQLException { Query query = createQuery(context, - "SELECT g from Group g " + - "where g.name = :name "); + "SELECT g from Group g " + + "where g.name = :name "); query.setParameter("name", name); query.setHint("org.hibernate.cacheable", Boolean.TRUE); @@ -113,22 +113,22 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public Group findByIdAndMembership(Context context, UUID id, EPerson ePerson) throws SQLException { - if(id == null || ePerson == null) { + if (id == null || ePerson == null) { return null; } else { Query query = createQuery(context, - "SELECT DISTINCT g FROM Group g " + - "LEFT JOIN g.epeople p " + - "WHERE g.id = :id AND " + - "(p.id = :eperson_id OR " + - "EXISTS ( " + - "SELECT 1 FROM Group2GroupCache gc " + - "JOIN gc.parent parent " + - "JOIN gc.child child " + - "JOIN child.epeople cp " + - "WHERE parent.id = g.id AND cp.id = :eperson_id " + - ") " + - ")"); + "SELECT DISTINCT g FROM Group g " + + "LEFT JOIN g.epeople p " + + "WHERE g.id = :id AND " + + "(p.id = :eperson_id OR " + + "EXISTS ( " + + "SELECT 1 FROM Group2GroupCache gc " + + "JOIN gc.parent parent " + + "JOIN gc.child child " + + "JOIN child.epeople cp " + + "WHERE parent.id = g.id AND cp.id = :eperson_id " + + ") " + + ")"); query.setParameter("id", id); query.setParameter("eperson_id", ePerson.getID()); @@ -139,17 +139,16 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou } @Override - public List findByNameLike(final Context context, final String groupName, final int offset, final int limit) throws SQLException { + public List findByNameLike(final Context context, final String groupName, final int offset, final int limit) + throws SQLException { Query query = createQuery(context, - "SELECT g FROM Group g WHERE lower(g.name) LIKE lower(:name)"); + "SELECT g FROM Group g WHERE lower(g.name) LIKE lower(:name)"); query.setParameter("name", "%" + StringUtils.trimToEmpty(groupName) + "%"); - if(0 <= offset) - { + if (0 <= offset) { query.setFirstResult(offset); } - if(0 <= limit) - { + if (0 <= limit) { query.setMaxResults(limit); } @@ -159,7 +158,7 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public int countByNameLike(final Context context, final String groupName) throws SQLException { Query query = createQuery(context, - "SELECT count(*) FROM Group g WHERE lower(g.name) LIKE lower(:name)"); + "SELECT count(*) FROM Group g WHERE lower(g.name) LIKE lower(:name)"); query.setParameter("name", "%" + groupName + "%"); return count(query); @@ -167,7 +166,8 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou @Override public void delete(Context context, Group group) throws SQLException { - Query query = getHibernateSession(context).createSQLQuery("DELETE FROM group2group WHERE parent_id=:groupId or child_id=:groupId"); + Query query = getHibernateSession(context) + .createSQLQuery("DELETE FROM group2group WHERE parent_id=:groupId or child_id=:groupId"); query.setParameter("groupId", group.getID()); query.executeUpdate(); super.delete(context, group); @@ -178,8 +178,8 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou public List> getGroup2GroupResults(Context context, boolean flushQueries) throws SQLException { Query query = createQuery(context, "SELECT new org.apache.commons.lang3.tuple.ImmutablePair(g.id, c.id) " + - "FROM Group g " + - "JOIN g.groups c "); + "FROM Group g " + + "JOIN g.groups c "); @SuppressWarnings("unchecked") List> results = query.getResultList(); diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java index ffbac0f893..e825106834 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java @@ -7,19 +7,17 @@ */ package org.dspace.eperson.dao.impl; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.eperson.Group2GroupCache; -import org.dspace.eperson.RegistrationData; -import org.dspace.eperson.RegistrationData_; -import org.dspace.eperson.dao.RegistrationDataDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; +import java.sql.SQLException; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import java.sql.SQLException; + +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.eperson.RegistrationData; +import org.dspace.eperson.RegistrationData_; +import org.dspace.eperson.dao.RegistrationDataDAO; /** * Hibernate implementation of the Database Access Object interface class for the RegistrationData object. @@ -28,11 +26,9 @@ import java.sql.SQLException; * * @author kevinvandevelde at atmire.com */ -public class RegistrationDataDAOImpl extends AbstractHibernateDAO implements RegistrationDataDAO -{ +public class RegistrationDataDAOImpl extends AbstractHibernateDAO implements RegistrationDataDAO { - protected RegistrationDataDAOImpl() - { + protected RegistrationDataDAOImpl() { super(); } diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java index f9fd9ca30a..a90c5da5a1 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java @@ -47,7 +47,8 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl } @Override - public Subscription findByCollectionAndEPerson(Context context, EPerson eperson, Collection collection) throws SQLException { + public Subscription findByCollectionAndEPerson(Context context, EPerson eperson, Collection collection) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); Root subscriptionRoot = criteriaQuery.from(Subscription.class); @@ -56,7 +57,7 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl .where(criteriaBuilder.and(criteriaBuilder.equal(subscriptionRoot.get(Subscription_.ePerson), eperson), criteriaBuilder.equal(subscriptionRoot.get(Subscription_.collection), collection) ) - ); + ); return singleResult(context, criteriaQuery); } diff --git a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java index 4b5a39b549..3bd702bf80 100644 --- a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java @@ -7,31 +7,28 @@ */ package org.dspace.handle.dao.impl; -import org.dspace.content.DSpaceObject; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.core.Context; -import org.dspace.handle.Handle; -import org.dspace.handle.Handle_; -import org.dspace.handle.dao.HandleDAO; -import org.dspace.xmlworkflow.storedcomponents.ClaimedTask; -import org.hibernate.Criteria; -import javax.persistence.Query; -import org.hibernate.criterion.Restrictions; -import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver; -import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter; -import org.hibernate.engine.jdbc.dialect.spi.DialectResolver; -import org.hibernate.jdbc.ReturningWork; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collections; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.dspace.content.DSpaceObject; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.handle.Handle; +import org.dspace.handle.Handle_; +import org.dspace.handle.dao.HandleDAO; +import org.hibernate.dialect.Dialect; +import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver; +import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter; +import org.hibernate.engine.jdbc.dialect.spi.DialectResolver; +import org.hibernate.jdbc.ReturningWork; /** * Hibernate implementation of the Database Access Object interface class for the Handle object. @@ -40,26 +37,24 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class HandleDAOImpl extends AbstractHibernateDAO implements HandleDAO -{ +public class HandleDAOImpl extends AbstractHibernateDAO implements HandleDAO { // The name of the sequence used to determine next available handle private static final String HANDLE_SEQUENCE = "handle_seq"; - protected HandleDAOImpl() - { + protected HandleDAOImpl() { super(); } @Override public List getHandlesByDSpaceObject(Context context, DSpaceObject dso) throws SQLException { - if(dso == null) { + if (dso == null) { return Collections.emptyList(); } else { Query query = createQuery(context, - "SELECT h " + - "FROM Handle h " + - "LEFT JOIN FETCH h.dso " + - "WHERE h.dso.id = :id "); + "SELECT h " + + "FROM Handle h " + + "LEFT JOIN FETCH h.dso " + + "WHERE h.dso.id = :id "); query.setParameter("id", dso.getID()); @@ -71,10 +66,10 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl @Override public Handle findByHandle(Context context, String handle) throws SQLException { Query query = createQuery(context, - "SELECT h " + - "FROM Handle h " + - "LEFT JOIN FETCH h.dso " + - "WHERE h.handle = :handle "); + "SELECT h " + + "FROM Handle h " + + "LEFT JOIN FETCH h.dso " + + "WHERE h.handle = :handle "); query.setParameter("handle", handle); @@ -89,7 +84,7 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Handle.class); Root handleRoot = criteriaQuery.from(Handle.class); criteriaQuery.select(handleRoot); - criteriaQuery.where(criteriaBuilder.like(handleRoot.get(Handle_.handle), prefix+"%")); + criteriaQuery.where(criteriaBuilder.like(handleRoot.get(Handle_.handle), prefix + "%")); return list(context, criteriaQuery, false, Handle.class, -1, -1); } @@ -102,14 +97,14 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl Root handleRoot = criteriaQuery.from(Handle.class); criteriaQuery.select(criteriaBuilder.count(criteriaQuery.from(Handle.class))); - criteriaQuery.where(criteriaBuilder.like(handleRoot.get(Handle_.handle), prefix+"%")); + criteriaQuery.where(criteriaBuilder.like(handleRoot.get(Handle_.handle), prefix + "%")); return countLong(context, criteriaQuery, criteriaBuilder, handleRoot); } @Override - public int updateHandlesWithNewPrefix(Context context, String newPrefix, String oldPrefix) throws SQLException - { - String hql = "UPDATE Handle set handle = concat(:newPrefix, '/', substring(handle, :oldPrefixLength + 2)) WHERE handle like concat(:oldPrefix,'%')"; + public int updateHandlesWithNewPrefix(Context context, String newPrefix, String oldPrefix) throws SQLException { + String hql = "UPDATE Handle set handle = concat(:newPrefix, '/', substring(handle, :oldPrefixLength + 2)) " + + "WHERE handle like concat(:oldPrefix,'%')"; Query query = createQuery(context, hql); query.setParameter("newPrefix", newPrefix); query.setParameter("oldPrefixLength", oldPrefix.length()); @@ -129,8 +124,7 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl * @throws SQLException if database error or sequence doesn't exist */ @Override - public Long getNextHandleSuffix(Context context) throws SQLException - { + public Long getNextHandleSuffix(Context context) throws SQLException { // Create a new Hibernate ReturningWork, which will return the // result of the next value in the Handle Sequence. ReturningWork nextValReturningWork = new ReturningWork() { @@ -140,16 +134,15 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl // Determine what dialect we are using for this DB DialectResolver dialectResolver = new StandardDialectResolver(); - Dialect dialect = dialectResolver.resolveDialect(new DatabaseMetaDataDialectResolutionInfoAdapter(connection.getMetaData())); + Dialect dialect = dialectResolver + .resolveDialect(new DatabaseMetaDataDialectResolutionInfoAdapter(connection.getMetaData())); // Find the next value in our sequence (based on DB dialect) - try (PreparedStatement preparedStatement = connection.prepareStatement(dialect.getSequenceNextValString(HANDLE_SEQUENCE))) - { + try (PreparedStatement preparedStatement = connection + .prepareStatement(dialect.getSequenceNextValString(HANDLE_SEQUENCE))) { // Execute query and return results - try(ResultSet resultSet = preparedStatement.executeQuery()) - { - if(resultSet.next()) - { + try (ResultSet resultSet = preparedStatement.executeQuery()) { + if (resultSet.next()) { // Return result of query (from first column) nextVal = resultSet.getLong(1); } diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java index 2fd22c1b29..2117b45735 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java @@ -7,22 +7,21 @@ */ package org.dspace.harvest.dao.impl; -import org.dspace.content.Bitstream; -import org.dspace.content.Bitstream_; -import org.dspace.content.Collection; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.harvest.HarvestedCollection; -import org.dspace.harvest.HarvestedCollection_; -import org.dspace.harvest.dao.HarvestedCollectionDAO; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; import java.sql.SQLException; import java.util.Date; import java.util.LinkedList; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +import org.dspace.content.Collection; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.harvest.HarvestedCollection; +import org.dspace.harvest.HarvestedCollection_; +import org.dspace.harvest.dao.HarvestedCollectionDAO; /** * Hibernate implementation of the Database Access Object interface class for the HarvestedCollection object. @@ -31,17 +30,18 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO implements HarvestedCollectionDAO -{ - protected HarvestedCollectionDAOImpl() - { +public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO + implements HarvestedCollectionDAO { + protected HarvestedCollectionDAOImpl() { super(); } @Override - public HarvestedCollection findByStatusAndMinimalTypeOrderByLastHarvestedDesc(Context context, int status, int type, int limit) throws SQLException { -// Old query: "select collection_id from harvested_collection where harvest_type > ? and harvest_status = ? order by last_harvested desc limit 1"; + public HarvestedCollection findByStatusAndMinimalTypeOrderByLastHarvestedDesc(Context context, int status, int type, + int limit) throws SQLException { +// Old query: "select collection_id from harvested_collection where harvest_type > ? and harvest_status = ? +// order by last_harvested desc limit 1"; CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); @@ -57,8 +57,10 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO ? and harvest_status = ? order by last_harvested asc limit 1"; + public HarvestedCollection findByStatusAndMinimalTypeOrderByLastHarvestedAsc(Context context, int status, int type, + int limit) throws SQLException { +// Old query: "select collection_id from harvested_collection where harvest_type > ? and harvest_status = ? +// order by last_harvested asc limit 1"; CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); @@ -78,7 +80,8 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); criteriaQuery.select(harvestedCollectionRoot); - criteriaQuery.where(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); + criteriaQuery + .where(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); return list(context, criteriaQuery, false, HarvestedCollection.class, -1, -1); } @@ -88,16 +91,27 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); criteriaQuery.select(harvestedCollectionRoot); - criteriaQuery.where(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.collection), collection)); + criteriaQuery + .where(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.collection), collection)); return singleResult(context, criteriaQuery); } @Override - public List findByLastHarvestedAndHarvestTypeAndHarvestStatusesAndHarvestTime(Context context, Date startTime, int minimalType, int[] statuses, int expirationStatus, Date expirationTime) throws SQLException { + public List + findByLastHarvestedAndHarvestTypeAndHarvestStatusesAndHarvestTime(Context context, + Date startTime, + int minimalType, + int[] statuses, + int expirationStatus, + Date expirationTime) + throws SQLException { // Old query: "SELECT * FROM harvested_collection WHERE -// (last_harvested < ? or last_harvested is null) and harvest_type > ? and (harvest_status = ? or harvest_status = ? or (harvest_status=? and harvest_start_time < ?)) ORDER BY last_harvested", -// new java.sql.Timestamp(startTime.getTime()), 0, HarvestedCollection.STATUS_READY, HarvestedCollection.STATUS_OAI_ERROR, HarvestedCollection.STATUS_BUSY, new java.sql.Timestamp(expirationTime.getTime())); +// (last_harvested < ? or last_harvested is null) and harvest_type > ? and (harvest_status = ? or harvest_status = ? +// or (harvest_status=? and harvest_start_time < ?)) ORDER BY last_harvested", +// new java.sql.Timestamp(startTime.getTime()), 0, HarvestedCollection.STATUS_READY, +// HarvestedCollection.STATUS_OAI_ERROR, HarvestedCollection.STATUS_BUSY, new java.sql.Timestamp(expirationTime +// .getTime())); CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); @@ -105,29 +119,35 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); criteriaQuery.select(harvestedCollectionRoot); - Predicate orPredicate = criteriaBuilder.or(criteriaBuilder.lessThan(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested), startTime), - criteriaBuilder.isNull(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested)) - ); + Predicate orPredicate = criteriaBuilder + .or(criteriaBuilder.lessThan(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested), startTime), + criteriaBuilder.isNull(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested)) + ); List orPredicates = new LinkedList<>(); - for(int status : statuses){ - orPredicates.add(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); + for (int status : statuses) { + orPredicates + .add(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); } - Predicate andPredicate = criteriaBuilder.and(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), expirationStatus), - criteriaBuilder.greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestStartTime), expirationTime) - ); + Predicate andPredicate = criteriaBuilder.and( + criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), expirationStatus), + criteriaBuilder + .greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestStartTime), expirationTime) + ); orPredicates.add(andPredicate); - Predicate secondPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[]{})); + Predicate secondPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[] {})); criteriaQuery.where(criteriaBuilder.and(orPredicate, - criteriaBuilder.greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestType), minimalType), + criteriaBuilder.greaterThan( + harvestedCollectionRoot.get(HarvestedCollection_.harvestType), + minimalType), secondPredicate - ) - ); + ) + ); List orderList = new LinkedList<>(); orderList.add(criteriaBuilder.asc(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested))); @@ -137,7 +157,6 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); criteriaQuery.select(harvestedCollectionRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestType), type), - criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status) - ) - ); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestType), type), + criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status) + ) + ); return criteriaQuery; } diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java index 5cb58e74dd..9e9838be6c 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java @@ -7,23 +7,20 @@ */ package org.dspace.harvest.dao.impl; -import org.dspace.content.Collection; -import org.dspace.content.Item; -import org.dspace.content.Item_; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.harvest.HarvestedItem; -import org.dspace.harvest.HarvestedItem_; -import org.dspace.harvest.dao.HarvestedItemDAO; -import org.dspace.identifier.DOI; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - +import java.sql.SQLException; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; -import java.sql.SQLException; + +import org.dspace.content.Collection; +import org.dspace.content.Item; +import org.dspace.content.Item_; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.harvest.HarvestedItem; +import org.dspace.harvest.HarvestedItem_; +import org.dspace.harvest.dao.HarvestedItemDAO; /** * Hibernate implementation of the Database Access Object interface class for the HarvestedItem object. @@ -32,10 +29,8 @@ import java.sql.SQLException; * * @author kevinvandevelde at atmire.com */ -public class HarvestedItemDAOImpl extends AbstractHibernateDAO implements HarvestedItemDAO -{ - protected HarvestedItemDAOImpl() - { +public class HarvestedItemDAOImpl extends AbstractHibernateDAO implements HarvestedItemDAO { + protected HarvestedItemDAOImpl() { super(); } @@ -57,10 +52,11 @@ public class HarvestedItemDAOImpl extends AbstractHibernateDAO im Root harvestedItemRoot = criteriaQuery.from(HarvestedItem.class); Join join = harvestedItemRoot.join("item"); criteriaQuery.select(harvestedItemRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(harvestedItemRoot.get(HarvestedItem_.oaiId), itemOaiID), - criteriaBuilder.equal(join.get(Item_.owningCollection), collection) - ) - ); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(harvestedItemRoot.get(HarvestedItem_.oaiId), itemOaiID), + criteriaBuilder.equal(join.get(Item_.owningCollection), collection) + ) + ); return singleResult(context, criteriaQuery); } diff --git a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java index 5f7eb7d819..83cea389ab 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java @@ -7,25 +7,20 @@ */ package org.dspace.identifier.dao.impl; -import org.dspace.content.DSpaceObject; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.identifier.DOI; -import org.dspace.identifier.DOI_; -import org.dspace.identifier.dao.DOIDAO; -import org.dspace.workflowbasic.BasicWorkflowItem; -import org.hibernate.Criteria; -import org.hibernate.criterion.Conjunction; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Restrictions; - +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.LinkedList; -import java.util.List; + +import org.dspace.content.DSpaceObject; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.identifier.DOI; +import org.dspace.identifier.DOI_; +import org.dspace.identifier.dao.DOIDAO; /** * Hibernate implementation of the Database Access Object interface class for the DOI object. @@ -34,10 +29,8 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO -{ - protected DOIDAOImpl() - { +public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { + protected DOIDAOImpl() { super(); } @@ -52,8 +45,10 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO } @Override - public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List statusToExclude) throws SQLException { - //SELECT * FROM Doi WHERE resource_type_id = ? AND resource_id = ? AND resource_id = ? AND ((status != ? AND status != ?) OR status IS NULL) + public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List statusToExclude) + throws SQLException { + //SELECT * FROM Doi WHERE resource_type_id = ? AND resource_id = ? AND resource_id = ? AND ((status != ? AND + // status != ?) OR status IS NULL) CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); @@ -62,17 +57,17 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO List listToIncludeInOrPredicate = new LinkedList<>(); - for(Integer status : statusToExclude){ + for (Integer status : statusToExclude) { listToIncludeInOrPredicate.add(criteriaBuilder.notEqual(doiRoot.get(DOI_.status), status)); } listToIncludeInOrPredicate.add(criteriaBuilder.isNull(doiRoot.get(DOI_.status))); - Predicate orPredicate = criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[]{})); + Predicate orPredicate = criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[] {})); criteriaQuery.where(criteriaBuilder.and(orPredicate, criteriaBuilder.equal(doiRoot.get(DOI_.dSpaceObject), dso) - ) - ); + ) + ); return singleResult(context, criteriaQuery); } @@ -84,18 +79,19 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO Root doiRoot = criteriaQuery.from(DOI.class); criteriaQuery.select(doiRoot); List orPredicates = new LinkedList<>(); - for( Integer status : statuses){ + for (Integer status : statuses) { orPredicates.add(criteriaBuilder.equal(doiRoot.get(DOI_.status), status)); } - criteriaQuery.where(criteriaBuilder.or(orPredicates.toArray(new Predicate[]{}))); + criteriaQuery.where(criteriaBuilder.or(orPredicates.toArray(new Predicate[] {}))); return list(context, criteriaQuery, false, DOI.class, -1, -1); } - + @Override - public List findSimilarNotInState(Context context, String doi, List excludedStatuses, boolean dsoNotNull) - throws SQLException - { - // SELECT * FROM Doi WHERE doi LIKE ? AND resource_type_id = ? AND resource_id IS NOT NULL AND status != ? AND status != ? + public List findSimilarNotInState(Context context, String doi, List excludedStatuses, + boolean dsoNotNull) + throws SQLException { + // SELECT * FROM Doi WHERE doi LIKE ? AND resource_type_id = ? AND resource_id IS NOT NULL AND status != ? + // AND status != ? CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); @@ -104,22 +100,21 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO List listToIncludeInOrPredicate = new LinkedList<>(); - for(Integer status: excludedStatuses){ + for (Integer status : excludedStatuses) { listToIncludeInOrPredicate.add(criteriaBuilder.notEqual(doiRoot.get(DOI_.status), status)); } List listToIncludeInAndPredicate = new LinkedList<>(); listToIncludeInAndPredicate.add(criteriaBuilder.like(doiRoot.get(DOI_.doi), doi)); - listToIncludeInAndPredicate.add(criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[]{}))); - if(dsoNotNull){ + listToIncludeInAndPredicate.add(criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[] {}))); + if (dsoNotNull) { listToIncludeInAndPredicate.add(criteriaBuilder.isNotNull(doiRoot.get(DOI_.dSpaceObject))); } - criteriaQuery.where(listToIncludeInAndPredicate.toArray(new Predicate[]{})); + criteriaQuery.where(listToIncludeInAndPredicate.toArray(new Predicate[] {})); return list(context, criteriaQuery, false, DOI.class, -1, -1); - } @Override diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java index dd4d71df0a..6633c892ea 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java @@ -7,25 +7,21 @@ */ package org.dspace.versioning.dao.impl; -import org.dspace.content.Item; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.core.Context; -import org.dspace.harvest.HarvestedCollection; -import org.dspace.harvest.HarvestedCollection_; -import org.dspace.versioning.Version; -import org.dspace.versioning.VersionHistory; -import org.dspace.versioning.Version_; -import org.dspace.versioning.dao.VersionDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.LinkedList; -import java.util.List; + +import org.dspace.content.Item; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.versioning.Version; +import org.dspace.versioning.VersionHistory; +import org.dspace.versioning.Version_; +import org.dspace.versioning.dao.VersionDAO; /** * Hibernate implementation of the Database Access Object interface class for the Version object. @@ -38,10 +34,8 @@ import java.util.List; * @author kevinvandevelde at atmire.com * @author Pascal-Nicolas Becker (dspace at pascal dash becker dot de) */ -public class VersionDAOImpl extends AbstractHibernateDAO implements VersionDAO -{ - protected VersionDAOImpl() - { +public class VersionDAOImpl extends AbstractHibernateDAO implements VersionDAO { + protected VersionDAOImpl() { super(); } @@ -57,28 +51,28 @@ public class VersionDAOImpl extends AbstractHibernateDAO implements Ver @Override public int getNextVersionNumber(Context c, VersionHistory vh) throws SQLException { - Query q = this.createQuery(c, - "SELECT (COALESCE(MAX(versionNumber), 0) + 1) " - + "FROM Version WHERE versionHistory.id = :historyId"); + Query q = this.createQuery(c, + "SELECT (COALESCE(MAX(versionNumber), 0) + 1) " + + "FROM Version WHERE versionHistory.id = :historyId"); q.setParameter("historyId", vh.getID()); int next = (Integer) q.getSingleResult(); return next; } - + @Override public List findVersionsWithItems(Context context, VersionHistory versionHistory) - throws SQLException - { + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Version.class); Root versionRoot = criteriaQuery.from(Version.class); criteriaQuery.select(versionRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(versionRoot.get(Version_.versionHistory), versionHistory), - criteriaBuilder.isNotNull(versionRoot.get(Version_.item)) - ) - ); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(versionRoot.get(Version_.versionHistory), versionHistory), + criteriaBuilder.isNotNull(versionRoot.get(Version_.item)) + ) + ); List orderList = new LinkedList<>(); orderList.add(criteriaBuilder.desc(versionRoot.get(Version_.versionNumber))); diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java index b95c6e6eba..eac78c3e62 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java @@ -7,29 +7,22 @@ */ package org.dspace.versioning.dao.impl; -import org.dspace.content.BitstreamFormat_; -import org.dspace.content.Item; -import org.dspace.content.Item_; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.versioning.VersionHistory; -import org.dspace.versioning.Version_; -import org.dspace.versioning.dao.VersionHistoryDAO; -import org.dspace.workflowbasic.BasicWorkflowItem; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - import java.sql.SQLException; import java.util.LinkedList; import java.util.List; -import org.dspace.versioning.Version; -import org.hibernate.criterion.Order; - import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; +import org.dspace.content.Item; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.versioning.Version; +import org.dspace.versioning.VersionHistory; +import org.dspace.versioning.Version_; +import org.dspace.versioning.dao.VersionHistoryDAO; + /** * Hibernate implementation of the Database Access Object interface class for the VersionHistory object. * This class is responsible for all database calls for the VersionHistory object and is autowired by spring @@ -40,10 +33,8 @@ import javax.persistence.criteria.Root; * @author Ben Bosman (ben at atmire dot com) * @author kevinvandevelde at atmire.com */ -public class VersionHistoryDAOImpl extends AbstractHibernateDAO implements VersionHistoryDAO -{ - protected VersionHistoryDAOImpl() - { +public class VersionHistoryDAOImpl extends AbstractHibernateDAO implements VersionHistoryDAO { + protected VersionHistoryDAOImpl() { super(); } diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java index 5660c532cd..78af3d2f8c 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java @@ -7,26 +7,23 @@ */ package org.dspace.workflowbasic.dao.impl; -import org.dspace.content.Collection; -import org.dspace.content.Item; -import org.dspace.content.Item_; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.eperson.EPerson; -import org.dspace.workflowbasic.BasicWorkflowItem; -import org.dspace.workflowbasic.BasicWorkflowItem_; -import org.dspace.workflowbasic.dao.BasicWorkflowItemDAO; -import org.hibernate.Criteria; +import java.sql.SQLException; +import java.util.List; import javax.persistence.Query; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; - import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; + +import org.dspace.content.Collection; +import org.dspace.content.Item; +import org.dspace.content.Item_; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.workflowbasic.BasicWorkflowItem; +import org.dspace.workflowbasic.BasicWorkflowItem_; +import org.dspace.workflowbasic.dao.BasicWorkflowItemDAO; /** * Hibernate implementation of the Database Access Object interface class for the BasicWorkflowItem object. @@ -35,10 +32,8 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO implements BasicWorkflowItemDAO -{ - protected BasicWorkflowItemDAOImpl() - { +public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO implements BasicWorkflowItemDAO { + protected BasicWorkflowItemDAOImpl() { super(); } @@ -54,8 +49,7 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO findBySubmitter(Context context, EPerson ep) throws SQLException - { + public List findBySubmitter(Context context, EPerson ep) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); @@ -69,8 +63,7 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO findByCollection(Context context, Collection c) throws SQLException - { + public List findByCollection(Context context, Collection c) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); @@ -80,9 +73,9 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO findByPooledTasks(Context context, EPerson ePerson) throws SQLException - { - String queryString = "select wf from TaskListItem as tli join tli.workflowItem wf where tli.ePerson = :eperson ORDER BY wf.workflowitemId"; + public List findByPooledTasks(Context context, EPerson ePerson) throws SQLException { + String queryString = "select wf from TaskListItem as tli join tli.workflowItem wf where tli.ePerson = " + + ":eperson ORDER BY wf.workflowitemId"; Query query = createQuery(context, queryString); query.setParameter("eperson", ePerson); return list(query); diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java index 43f58bc16f..ec92faec03 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java @@ -7,22 +7,20 @@ */ package org.dspace.workflowbasic.dao.impl; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.eperson.EPerson; -import org.dspace.harvest.HarvestedItem; -import org.dspace.workflowbasic.BasicWorkflowItem; -import org.dspace.workflowbasic.TaskListItem; -import org.dspace.workflowbasic.TaskListItem_; -import org.dspace.workflowbasic.dao.TaskListItemDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; +import java.sql.SQLException; +import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; + +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.workflowbasic.BasicWorkflowItem; +import org.dspace.workflowbasic.TaskListItem; +import org.dspace.workflowbasic.TaskListItem_; +import org.dspace.workflowbasic.dao.TaskListItemDAO; /** * Hibernate implementation of the Database Access Object interface class for the TaskListItem object. @@ -31,10 +29,8 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class TaskListItemDAOImpl extends AbstractHibernateDAO implements TaskListItemDAO -{ - protected TaskListItemDAOImpl() - { +public class TaskListItemDAOImpl extends AbstractHibernateDAO implements TaskListItemDAO { + protected TaskListItemDAOImpl() { super(); } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java index e9fb23425d..bb5a167237 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java @@ -7,22 +7,19 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import org.dspace.content.WorkspaceItem; -import org.dspace.core.Context; +import java.sql.SQLException; +import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.xmlworkflow.storedcomponents.ClaimedTask; import org.dspace.xmlworkflow.storedcomponents.ClaimedTask_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.ClaimedTaskDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the ClaimedTask object. @@ -31,10 +28,8 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implements ClaimedTaskDAO -{ - protected ClaimedTaskDAOImpl() - { +public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implements ClaimedTaskDAO { + protected ClaimedTaskDAOImpl() { super(); } @@ -50,15 +45,17 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem } @Override - public ClaimedTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { + public ClaimedTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); criteriaQuery.select(claimedTaskRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), - criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson) - ) - ); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson) + ) + ); return uniqueResult(context, criteriaQuery, false, ClaimedTask.class, -1, -1); @@ -75,44 +72,52 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem } @Override - public List findByWorkflowItemAndStepId(Context context, XmlWorkflowItem workflowItem, String stepID) throws SQLException { + public List findByWorkflowItemAndStepId(Context context, XmlWorkflowItem workflowItem, String stepID) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); criteriaQuery.select(claimedTaskRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), - criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID) - ) - ); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID) + ) + ); return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override - public ClaimedTask findByEPersonAndWorkflowItemAndStepIdAndActionId(Context context, EPerson ePerson, XmlWorkflowItem workflowItem, String stepID, String actionID) throws SQLException { + public ClaimedTask findByEPersonAndWorkflowItemAndStepIdAndActionId(Context context, EPerson ePerson, + XmlWorkflowItem workflowItem, String stepID, + String actionID) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); criteriaQuery.select(claimedTaskRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), - criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID), - criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson), - criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.actionId), actionID) - ) - ); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.actionId), actionID) + ) + ); return uniqueResult(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override - public List findByWorkflowItemAndStepIdAndActionId(Context context, XmlWorkflowItem workflowItem, String stepID, String actionID) throws SQLException { + public List findByWorkflowItemAndStepIdAndActionId(Context context, XmlWorkflowItem workflowItem, + String stepID, String actionID) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); criteriaQuery.select(claimedTaskRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), - criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID), - criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.actionId), actionID) - ) - ); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.actionId), actionID) + ) + ); return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java index b5f54b8a39..c4218d7109 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java @@ -7,21 +7,19 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import org.dspace.content.Collection; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.xmlworkflow.storedcomponents.CollectionRole; -import org.dspace.xmlworkflow.storedcomponents.CollectionRole_; -import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; -import org.dspace.xmlworkflow.storedcomponents.dao.CollectionRoleDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; +import java.sql.SQLException; +import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; + +import org.dspace.content.Collection; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.xmlworkflow.storedcomponents.CollectionRole; +import org.dspace.xmlworkflow.storedcomponents.CollectionRole_; +import org.dspace.xmlworkflow.storedcomponents.dao.CollectionRoleDAO; /** * Hibernate implementation of the Database Access Object interface class for the CollectionRole object. @@ -30,10 +28,8 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class CollectionRoleDAOImpl extends AbstractHibernateDAO implements CollectionRoleDAO -{ - protected CollectionRoleDAOImpl() - { +public class CollectionRoleDAOImpl extends AbstractHibernateDAO implements CollectionRoleDAO { + protected CollectionRoleDAOImpl() { super(); } @@ -48,15 +44,17 @@ public class CollectionRoleDAOImpl extends AbstractHibernateDAO } @Override - public CollectionRole findByCollectionAndRole(Context context, Collection collection, String role) throws SQLException { + public CollectionRole findByCollectionAndRole(Context context, Collection collection, String role) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CollectionRole.class); Root collectionRoleRoot = criteriaQuery.from(CollectionRole.class); criteriaQuery.select(collectionRoleRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.collection), collection), - criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.roleId), role) - ) - ); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.collection), collection), + criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.roleId), role) + ) + ); return uniqueResult(context, criteriaQuery, false, CollectionRole.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java index 77052e36ff..cdba1600a8 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java @@ -7,22 +7,19 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import org.dspace.content.Community; -import org.dspace.core.Context; +import java.sql.SQLException; +import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.xmlworkflow.storedcomponents.InProgressUser; import org.dspace.xmlworkflow.storedcomponents.InProgressUser_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.InProgressUserDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the InProgressUser object. @@ -31,24 +28,24 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class InProgressUserDAOImpl extends AbstractHibernateDAO implements InProgressUserDAO -{ - protected InProgressUserDAOImpl() - { +public class InProgressUserDAOImpl extends AbstractHibernateDAO implements InProgressUserDAO { + protected InProgressUserDAOImpl() { super(); } @Override - public InProgressUser findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { + public InProgressUser findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); criteriaQuery.select(inProgressUserRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), - criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.ePerson),ePerson) - ) - ); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.ePerson), ePerson) + ) + ); return uniqueResult(context, criteriaQuery, false, InProgressUser.class, -1, -1); } @@ -82,10 +79,11 @@ public class InProgressUserDAOImpl extends AbstractHibernateDAO Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), - criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.finished), false) - ) - ); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.finished), false) + ) + ); return count(context, criteriaQuery, criteriaBuilder, inProgressUserRoot); } @@ -97,9 +95,10 @@ public class InProgressUserDAOImpl extends AbstractHibernateDAO Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), - criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.finished), true) - ) + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.finished), true) + ) ); return count(context, criteriaQuery, criteriaBuilder, inProgressUserRoot); } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java index 0dc3720c54..b38041da39 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java @@ -7,23 +7,20 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import org.dspace.content.Bitstream; -import org.dspace.core.Context; +import java.sql.SQLException; +import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.xmlworkflow.storedcomponents.PoolTask; import org.dspace.xmlworkflow.storedcomponents.PoolTask_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.PoolTaskDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the PoolTask object. @@ -32,10 +29,8 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class PoolTaskDAOImpl extends AbstractHibernateDAO implements PoolTaskDAO -{ - protected PoolTaskDAOImpl() - { +public class PoolTaskDAOImpl extends AbstractHibernateDAO implements PoolTaskDAO { + protected PoolTaskDAOImpl() { super(); } @@ -71,28 +66,32 @@ public class PoolTaskDAOImpl extends AbstractHibernateDAO implements P } @Override - public PoolTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { + public PoolTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); Root poolTaskRoot = criteriaQuery.from(PoolTask.class); criteriaQuery.select(poolTaskRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem), - criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.ePerson), ePerson) - ) - ); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem), + criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.ePerson), ePerson) + ) + ); return uniqueResult(context, criteriaQuery, false, PoolTask.class, -1, -1); } @Override - public PoolTask findByWorkflowItemAndGroup(Context context, Group group, XmlWorkflowItem workflowItem) throws SQLException { + public PoolTask findByWorkflowItemAndGroup(Context context, Group group, XmlWorkflowItem workflowItem) + throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); Root poolTaskRoot = criteriaQuery.from(PoolTask.class); criteriaQuery.select(poolTaskRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem), - criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.group), group) - ) - ); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem), + criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.group), group) + ) + ); return uniqueResult(context, criteriaQuery, false, PoolTask.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java index 9dc6cdd052..fdc2413b5f 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java @@ -7,22 +7,19 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import org.dspace.core.Context; +import java.sql.SQLException; +import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; import org.dspace.eperson.EPerson; -import org.dspace.xmlworkflow.storedcomponents.PoolTask; import org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole; import org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.WorkflowItemRoleDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; /** * Hibernate implementation of the Database Access Object interface class for the WorkflowItemRole object. @@ -31,33 +28,40 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class WorkflowItemRoleDAOImpl extends AbstractHibernateDAO implements WorkflowItemRoleDAO -{ - protected WorkflowItemRoleDAOImpl() - { +public class WorkflowItemRoleDAOImpl extends AbstractHibernateDAO implements WorkflowItemRoleDAO { + + protected WorkflowItemRoleDAOImpl() { super(); } @Override - public List findByWorkflowItemAndRole(Context context, XmlWorkflowItem workflowItem, String role) throws SQLException { + public List findByWorkflowItemAndRole(Context context, + XmlWorkflowItem workflowItem, + String role) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); criteriaQuery.select(workflowItemRoleRoot); - criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.workflowItem), workflowItem), - criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.roleId), role) - ) - ); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder + .equal(workflowItemRoleRoot.get(WorkflowItemRole_.workflowItem), + workflowItem), + criteriaBuilder + .equal(workflowItemRoleRoot.get(WorkflowItemRole_.roleId), + role) + ) + ); return list(context, criteriaQuery, false, WorkflowItemRole.class, -1, -1); } @Override - public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { + public List findByWorkflowItem(Context context, + XmlWorkflowItem workflowItem) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); criteriaQuery.select(workflowItemRoleRoot); - criteriaQuery.where(criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.workflowItem), workflowItem)); + criteriaQuery.where(criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.workflowItem), + workflowItem)); return list(context, criteriaQuery, false, WorkflowItemRole.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java index 2854e1f1aa..c7d9d0b3ba 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java @@ -7,25 +7,23 @@ */ package org.dspace.xmlworkflow.storedcomponents.dao.impl; -import org.dspace.content.Collection; -import org.dspace.content.Item; -import org.dspace.content.Item_; -import org.dspace.core.Context; -import org.dspace.core.AbstractHibernateDAO; -import org.dspace.eperson.EPerson; -import org.dspace.harvest.HarvestedCollection; -import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; -import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem_; -import org.dspace.xmlworkflow.storedcomponents.dao.XmlWorkflowItemDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; +import java.sql.SQLException; +import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; -import java.sql.SQLException; -import java.util.List; + +import org.dspace.content.Collection; +import org.dspace.content.Item; +import org.dspace.content.Item_; +import org.dspace.core.AbstractHibernateDAO; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; +import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem_; +import org.dspace.xmlworkflow.storedcomponents.dao.XmlWorkflowItemDAO; /** * Hibernate implementation of the Database Access Object interface class for the XmlWorkflowItem object. @@ -34,27 +32,28 @@ import java.util.List; * * @author kevinvandevelde at atmire.com */ -public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO implements XmlWorkflowItemDAO -{ +public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO implements XmlWorkflowItemDAO { - protected XmlWorkflowItemDAOImpl() - { + protected XmlWorkflowItemDAOImpl() { super(); } @Override - public List findAllInCollection(Context context, Integer offset, Integer limit, Collection collection) throws SQLException { + public List findAllInCollection(Context context, Integer offset, + Integer limit, + Collection collection) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); criteriaQuery.select(xmlWorkflowItemRoot); - if(collection!=null){ - criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), collection)); + if (collection != null) { + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), + collection)); } - if(offset == null){ + if (offset == null) { offset = -1; } - if(limit != null){ + if (limit != null) { limit = -1; } return list(context, criteriaQuery, false, XmlWorkflowItem.class, limit, offset); @@ -73,8 +72,9 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO criteriaQuery = criteriaBuilder.createQuery(Long.class); Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); - if(collection != null){ - criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), collection)); + if (collection != null) { + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), + collection)); } return count(context, criteriaQuery, criteriaBuilder, xmlWorkflowItemRoot); } From a12c22a767f64e09db940708381b48a5dae79915 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Fri, 25 May 2018 15:35:50 +0200 Subject: [PATCH 025/193] Removed a bunch of unnecessary code in comments --- .../dao/impl/ResourcePolicyDAOImpl.java | 5 +-- .../dao/impl/MostRecentChecksumDAOImpl.java | 31 ---------------- .../content/dao/impl/BitstreamDAOImpl.java | 11 ------ .../content/dao/impl/CollectionDAOImpl.java | 29 --------------- .../content/dao/impl/CommunityDAOImpl.java | 16 --------- .../org/dspace/core/AbstractHibernateDAO.java | 36 ++++++++----------- .../dao/impl/HarvestedCollectionDAOImpl.java | 14 -------- .../identifier/dao/impl/DOIDAOImpl.java | 6 ---- 8 files changed, 18 insertions(+), 130 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java index 34be343abe..a0f69dc526 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java @@ -122,7 +122,6 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO public List findByEPersonGroupTypeIdAction(Context context, EPerson e, List groups, int action, int type_id) throws SQLException { - //TODO Make sure you double check this CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); @@ -133,7 +132,9 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO criteriaBuilder .or(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.eperson), e), criteriaBuilder - .in(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups))))); + .in(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups))) + ) + ); return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java index 80f66fffdf..989d313a10 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java @@ -45,15 +45,6 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO findByNotProcessedInDateRange(Context context, Date startDate, Date endDate) throws SQLException { -// + "most_recent_checksum.last_process_start_date, most_recent_checksum.last_process_end_date, " -// + "most_recent_checksum.expected_checksum, most_recent_checksum.current_checksum, " -// + "result_description " -// + "from checksum_results, most_recent_checksum " -// + "where most_recent_checksum.to_be_processed = false " -// + "and most_recent_checksum.result = checksum_results.result_code " -// + "and most_recent_checksum.last_process_start_date >= ? " -// + "and most_recent_checksum.last_process_start_date < ? " -// + "order by most_recent_checksum.bitstream_id CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); @@ -88,14 +79,6 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO findByResultTypeInDateRange(Context context, Date startDate, Date endDate, ChecksumResultCode resultCode) throws SQLException { -// "select bitstream_id, last_process_start_date, last_process_end_date, " -// + "expected_checksum, current_checksum, result_description " -// + "from most_recent_checksum, checksum_results " -// + "where most_recent_checksum.result = checksum_results.result_code " -// + "and most_recent_checksum.result= ? " -// + "and most_recent_checksum.last_process_start_date >= ? " -// + "and most_recent_checksum.last_process_start_date < ? " -// + "order by bitstream_id"; CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); @@ -123,12 +106,6 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); @@ -143,14 +120,6 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java index 9269839d2d..31110e6aa5 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java @@ -67,16 +67,6 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public List findBitstreamsWithNoRecentChecksum(Context context) throws SQLException { -// "select bitstream.deleted, bitstream.store_number, bitstream.size_bytes, " -// + "bitstreamformatregistry.short_description, bitstream.bitstream_id, " -// + "bitstream.user_format_description, bitstream.internal_id, " -// + "bitstream.source, bitstream.checksum_algorithm, bitstream.checksum, " -// + "bitstream.name, bitstream.description " -// + "from bitstream left outer join bitstreamformatregistry on " -// + "bitstream.bitstream_format_id = bitstreamformatregistry.bitstream_format_id " -// + "where not exists( select 'x' from most_recent_checksum " -// + "where most_recent_checksum.bitstream_id = bitstream.bitstream_id )" - Query query = createQuery(context, "select b from Bitstream b where b not in (select c.bitstream from " + "MostRecentChecksum c)"); @@ -173,7 +163,6 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Iterator findAll(Context context, int limit, int offset) throws SQLException { Map map = new HashMap<>(); -// map.put("sizeBytes", 12); return findByX(context, Bitstream.class, map, true, limit, offset).iterator(); } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java index d19c6389f9..9180fb3c09 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java @@ -85,7 +85,6 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); Root collectionRoot = criteriaQuery.from(Collection.class); - //TODO Used to be template_item, may be wrong criteriaQuery.select(collectionRoot); criteriaQuery.where(criteriaBuilder.equal(collectionRoot.get(Collection_.template), item)); return uniqueResult(context, criteriaQuery, false, Collection.class, -1, -1); @@ -111,14 +110,6 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple @Override public List findAuthorized(Context context, EPerson ePerson, List actions) throws SQLException { - // TableRowIterator tri = DatabaseManager.query(context, -// "SELECT * FROM collection, resourcepolicy, eperson " + -// "WHERE resourcepolicy.resource_id = collection.collection_id AND " + -// "eperson.eperson_id = resourcepolicy.eperson_id AND "+ -// "resourcepolicy.resource_type_id = 3 AND "+ -// "( resourcepolicy.action_id = 3 OR resourcepolicy.action_id = 11 ) AND "+ -// "eperson.eperson_id = ?", context.getCurrentUser().getID()); - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); Root collectionRoot = criteriaQuery.from(Collection.class); @@ -139,26 +130,6 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple @Override public List findAuthorizedByGroup(Context context, EPerson ePerson, List actions) throws SQLException { - // TableRowIterator tri = DatabaseManager.query(context, - // "SELECT \n" + - // " * \n" + - // "FROM \n" + - // " public.eperson, \n" + - // " public.epersongroup2eperson, \n" + - // " public.epersongroup, \n" + - // " public.group2group, \n" + - // " public.resourcepolicy rp_parent, \n" + - // " public.collection\n" + - // "WHERE \n" + - // " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + - // " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + - // " group2group.child_id = epersongroup.eperson_group_id AND\n" + - // " rp_parent.epersongroup_id = group2group.parent_id AND\n" + - // " collection.collection_id = rp_parent.resource_id AND\n" + - // " eperson.eperson_id = ? AND \n" + - // " (rp_parent.action_id = 3 OR \n" + - // " rp_parent.action_id = 11 \n" + - // " ) AND rp_parent.resource_type_id = 3;", context.getCurrentUser().getID()); StringBuilder query = new StringBuilder(); query.append("select c from Collection c join c.resourcePolicies rp join rp.epersonGroup rpGroup WHERE "); for (int i = 0; i < actions.size(); i++) { diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java index a0cd514ef5..7f33846a76 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java @@ -149,22 +149,6 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme @Override public List findAuthorizedByGroup(Context context, EPerson ePerson, List actions) throws SQLException { -// "SELECT \n" + -// " * \n" + -// "FROM \n" + -// " public.eperson, \n" + -// " public.epersongroup2eperson, \n" + -// " public.epersongroup, \n" + -// " public.community, \n" + -// " public.resourcepolicy\n" + -// "WHERE \n" + -// " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + -// " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + -// " resourcepolicy.epersongroup_id = epersongroup.eperson_group_id AND\n" + -// " resourcepolicy.resource_id = community.community_id AND\n" + -// " ( resourcepolicy.action_id = 3 OR \n" + -// " resourcepolicy.action_id = 11) AND \n" + -// " resourcepolicy.resource_type_id = 4 AND eperson.eperson_id = ?", context.getCurrentUser().getID()); StringBuilder query = new StringBuilder(); query.append("select c from Community c join c.resourcePolicies rp join rp.epersonGroup rpGroup WHERE "); for (int i = 0; i < actions.size(); i++) { diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index d7a428391a..a9e4f912a1 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -48,6 +48,13 @@ public abstract class AbstractHibernateDAO implements GenericDAO { //Isn't required, is just here for other DB implementation. Hibernate auto keeps track of changes. } + /** + * The Session used to manipulate entities of this type. + * + * @param context current DSpace context. + * @return the current Session. + * @throws SQLException + */ protected Session getHibernateSession(Context context) throws SQLException { return ((Session) context.getDBConnection().getSession()); } @@ -112,14 +119,14 @@ public abstract class AbstractHibernateDAO implements GenericDAO { return result; } -// public Criteria createCriteria(Context context, Class persistentClass) throws SQLException { -// return getHibernateSession(context).createCriteria(persistentClass); -// } -// -// public Criteria createCriteria(Context context, Class persistentClass, String alias) throws SQLException { -// return getHibernateSession(context).createCriteria(persistentClass, alias); -// } - + /** + * Create a parsed query from a query expression. + * + * @param context current DSpace context. + * @param query textual form of the query. + * @return parsed form of the query. + * @throws SQLException + */ public Query createQuery(Context context, String query) throws SQLException { return getHibernateSession(context).createQuery(query); } @@ -174,14 +181,6 @@ public abstract class AbstractHibernateDAO implements GenericDAO { * @return a DAO specified by the criteria */ public T singleResult(Context context, CriteriaQuery criteriaQuery) throws SQLException { -// List list = list(context, criteriaQuery, cacheable, clazz, maxResults, offset); -// if(CollectionUtils.isNotEmpty(list)) -// { -// return list.get(0); -// }else{ -// return null; -// } -// Query query = this.getHibernateSession(context).createQuery(criteriaQuery); return singleResult(query); @@ -237,12 +236,9 @@ public abstract class AbstractHibernateDAO implements GenericDAO { public List executeCriteriaQuery(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, int offset) throws SQLException { - //This has to be here, otherwise a 500 gets thrown Query query = this.getHibernateSession(context).createQuery(criteriaQuery); - //TODO Check if this works and is desireable query.setHint("org.hibernate.cacheable", cacheable); -// query.setCacheable(cacheable); if (maxResults != -1) { query.setMaxResults(maxResults); } @@ -260,12 +256,10 @@ public abstract class AbstractHibernateDAO implements GenericDAO { Root root = criteria.from(clazz); criteria.select(root); - //TODO Maybe one big where, test this;;;; seems to not be necessary for (Map.Entry entry : equals.entrySet()) { criteria.where(criteriaBuilder.equal(root.get(entry.getKey()), entry.getValue())); } return executeCriteriaQuery(context, criteria, cacheable, clazz, maxResults, offset); } - //TODO find alternative for uniqueResult } diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java index 2117b45735..a7182d63ab 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java @@ -40,9 +40,6 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO ? and harvest_status = ? -// order by last_harvested desc limit 1"; - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); @@ -59,9 +56,6 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO ? and harvest_status = ? -// order by last_harvested asc limit 1"; - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); @@ -106,14 +100,6 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO ? and (harvest_status = ? or harvest_status = ? -// or (harvest_status=? and harvest_start_time < ?)) ORDER BY last_harvested", -// new java.sql.Timestamp(startTime.getTime()), 0, HarvestedCollection.STATUS_READY, -// HarvestedCollection.STATUS_OAI_ERROR, HarvestedCollection.STATUS_BUSY, new java.sql.Timestamp(expirationTime -// .getTime())); - - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); diff --git a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java index 83cea389ab..019e89c129 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java @@ -47,9 +47,6 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { @Override public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List statusToExclude) throws SQLException { - //SELECT * FROM Doi WHERE resource_type_id = ? AND resource_id = ? AND resource_id = ? AND ((status != ? AND - // status != ?) OR status IS NULL) - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); Root doiRoot = criteriaQuery.from(DOI.class); @@ -90,9 +87,6 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { public List findSimilarNotInState(Context context, String doi, List excludedStatuses, boolean dsoNotNull) throws SQLException { - // SELECT * FROM Doi WHERE doi LIKE ? AND resource_type_id = ? AND resource_id IS NOT NULL AND status != ? - // AND status != ? - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); Root doiRoot = criteriaQuery.from(DOI.class); From b95a55d3d0ed8b8d000860a88bb0340a68eb9ca5 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Mon, 28 May 2018 11:42:13 +0200 Subject: [PATCH 026/193] Applied the community feedback regarding the PR --- .../dao/impl/MostRecentChecksumDAOImpl.java | 8 +- .../content/dao/impl/BitstreamDAOImpl.java | 2 +- .../dspace/content/dao/impl/ItemDAOImpl.java | 86 +++++++++++++------ .../dao/impl/MetadataFieldDAOImpl.java | 5 +- .../eperson/dao/impl/EPersonDAOImpl.java | 2 +- .../dao/impl/HarvestedCollectionDAOImpl.java | 25 +++--- .../dao/impl/BasicWorkflowItemDAOImpl.java | 7 ++ .../dao/impl/XmlWorkflowItemDAOImpl.java | 2 +- dspace/config/hibernate.cfg.xml | 2 +- dspace/config/modules/rest.cfg | 5 -- pom.xml | 3 + 11 files changed, 93 insertions(+), 54 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java index 989d313a10..7e8c8d256d 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java @@ -53,8 +53,8 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAOget(MostRecentChecksum_.processStartDate), startDate), - criteriaBuilder.greaterThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), endDate) + .lessThanOrEqualTo(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), endDate) ) ); List orderList = new LinkedList<>(); @@ -85,8 +85,8 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAOget("processStartDate"), startDate), - criteriaBuilder.greaterThan(mostRecentChecksumRoot.get("processStartDate"), endDate) + criteriaBuilder.lessThanOrEqualTo(mostRecentChecksumRoot.get("processStartDate"), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get("processStartDate"), endDate) ) ); List orderList = new LinkedList<>(); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java index 31110e6aa5..02e3509c31 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java @@ -59,7 +59,7 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme criteriaQuery.select(bitstreamRoot); criteriaQuery.where(criteriaBuilder.and( criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.internalId), bitstream.getInternalId()), - criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.id), bitstream.getID()) + criteriaBuilder.notEqual(bitstreamRoot.get(Bitstream_.id), bitstream.getID()) ) ); return list(context, criteriaQuery, false, Bitstream.class, -1, -1); diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index c83b384f2d..8cb584dad8 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -142,14 +142,66 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA return iterate(query); } - enum OP { equals, not_equals, like, not_like, contains, - doesnt_contain, exists, doesnt_exist, matches, doesnt_match; } + enum OP { + equals { + public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot) { + return criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.value), query_val.get(i)); + } + }, + not_equals { + public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot) { + return criteriaBuilder.notEqual(subqueryRoot.get(MetadataValue_.value), query_val.get(i)); + } + }, + like { + public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot) { + return criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), query_val.get(i)); + } + }, + not_like { + public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot) { + return criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), query_val.get(i)); + } + }, + contains { + public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot) { + return criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), "%" + query_val.get(i) + "%"); + } + }, + doesnt_contain { + public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot) { + return criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), "%" + query_val.get(i) + "%"); + } + }, + exists { + public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot) { + return OP.equals.buildPredicate(query_val, criteriaBuilder, i, subqueryRoot); + } + }, + doesnt_exist { + public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot) { + return OP.not_equals.buildPredicate(query_val, criteriaBuilder, i, subqueryRoot); + } + }; + + public abstract Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + Root subqueryRoot); + } @Override public Iterator findByMetadataQuery(Context context, List> listFieldList, List query_op, List query_val, List collectionUuids, String regexClause, int offset, int limit) throws SQLException { + //TODO Check Tim Donohue's comment on this method. CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Item.class); Root itemRoot = criteriaQuery.from(Item.class); @@ -171,13 +223,6 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA continue; } - if (op == OP.matches || op == OP.doesnt_match) { - if (regexClause.isEmpty()) { - log.warn("Skipping Unsupported Regex Operator: " + query_op.get(i)); - continue; - } - } - Subquery subquery = criteriaQuery.subquery(DSpaceObject.class); Root subqueryRoot = subquery.from(MetadataValue.class); subquery.select(subqueryRoot.get(MetadataValue_.dSpaceObject)); @@ -190,25 +235,10 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA predicateListSubQuery.add( criteriaBuilder.isTrue(subqueryRoot.get(MetadataValue_.metadataField).in(listFieldList.get(i)))); } - if (op == OP.equals) { - predicateListSubQuery - .add(criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); - } else if (op == OP.like) { - predicateListSubQuery - .add(criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); - } else if (op == OP.contains) { - predicateListSubQuery - .add(criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), "%" + query_val.get(i) + "%")); - } else if (op == OP.not_equals) { - predicateListSubQuery - .add(criteriaBuilder.notEqual(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); - } else if (op == OP.not_like) { - predicateListSubQuery - .add(criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), query_val.get(i))); - } else if (op == OP.doesnt_contain) { - predicateListSubQuery - .add(criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), "%" + query_val.get(i) + "%")); - } + + //TODO query_val weg naar val en i weg + predicateListSubQuery.add(op.buildPredicate(query_val, criteriaBuilder, i, subqueryRoot)); + subquery.where(predicateListSubQuery.toArray(new Predicate[] {})); predicateList.add(criteriaBuilder.isTrue(itemRoot.get(Item_.id).in(subquery))); } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java index e74527eabc..de517765ba 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java @@ -16,6 +16,7 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; +import org.apache.commons.lang.StringUtils; import org.dspace.content.MetadataField; import org.dspace.content.MetadataField_; import org.dspace.content.MetadataSchema; @@ -80,7 +81,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im throws SQLException { Query query; - if (qualifier != null) { + if (StringUtils.isNotBlank(qualifier)) { query = createQuery(context, "SELECT mf " + "FROM MetadataField mf " + "JOIN FETCH mf.metadataSchema ms " + @@ -97,7 +98,7 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im query.setParameter("name", metadataSchema); query.setParameter("element", element); - if (qualifier != null) { + if (StringUtils.isNotBlank(qualifier)) { query.setParameter("qualifier", qualifier); } query.setHint("org.hibernate.cacheable", Boolean.TRUE); diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java index 840e590186..cce3f19487 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java @@ -147,7 +147,7 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); Root ePersonRoot = criteriaQuery.from(EPerson.class); criteriaQuery.select(ePersonRoot); - criteriaQuery.where(criteriaBuilder.lessThanOrEqualTo(ePersonRoot.get(EPerson_.lastActive), date)); + criteriaQuery.where(criteriaBuilder.lessThanOrEqualTo(ePersonRoot.get(EPerson_.lastActive), date)); return list(context, criteriaQuery, false, EPerson.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java index a7182d63ab..892b0d22f6 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java @@ -105,33 +105,36 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); criteriaQuery.select(harvestedCollectionRoot); - Predicate orPredicate = criteriaBuilder + Predicate wasNotHarvestedInCurrentRun = criteriaBuilder .or(criteriaBuilder.lessThan(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested), startTime), criteriaBuilder.isNull(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested)) ); - List orPredicates = new LinkedList<>(); + List hasCorrectStatusOrIsExpiredRestrictions = new LinkedList<>(); for (int status : statuses) { - orPredicates + hasCorrectStatusOrIsExpiredRestrictions .add(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); } - Predicate andPredicate = criteriaBuilder.and( + Predicate harvestExpiredRestriction = criteriaBuilder.and( criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), expirationStatus), criteriaBuilder .greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestStartTime), expirationTime) ); - orPredicates.add(andPredicate); + hasCorrectStatusOrIsExpiredRestrictions.add(harvestExpiredRestriction); - Predicate secondPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[] {})); + Predicate hasCorrectStatusOrIsExpiredPredicate = criteriaBuilder.or(hasCorrectStatusOrIsExpiredRestrictions + .toArray(new Predicate[] {})); - criteriaQuery.where(criteriaBuilder.and(orPredicate, - criteriaBuilder.greaterThan( - harvestedCollectionRoot.get(HarvestedCollection_.harvestType), - minimalType), - secondPredicate + Predicate hasMinimalType = criteriaBuilder.greaterThan( + harvestedCollectionRoot.get(HarvestedCollection_.harvestType), + minimalType); + + criteriaQuery.where(criteriaBuilder.and(wasNotHarvestedInCurrentRun, + hasMinimalType, + hasCorrectStatusOrIsExpiredPredicate ) ); diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java index 78af3d2f8c..d3ae4ba884 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java @@ -8,6 +8,7 @@ package org.dspace.workflowbasic.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; @@ -58,6 +59,12 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO join = basicWorkflowItemRoot.join("item"); criteriaQuery.select(basicWorkflowItemRoot); criteriaQuery.where(criteriaBuilder.equal(join.get(Item_.submitter), ep)); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(basicWorkflowItemRoot.get(BasicWorkflowItem_.workflowitemId))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java index c7d9d0b3ba..3c14e42a5b 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java @@ -53,7 +53,7 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAOorg.hibernate.context.internal.ThreadLocalSessionContext - true + false true diff --git a/dspace/config/modules/rest.cfg b/dspace/config/modules/rest.cfg index b209d080fc..3310d018a6 100644 --- a/dspace/config/modules/rest.cfg +++ b/dspace/config/modules/rest.cfg @@ -39,11 +39,6 @@ rest.report-url.collections = static/reports/index.html rest.report-url.item-query = static/reports/query.html #rest.report-url.custom = -##### database specific way to format a regex SQL clause ##### -# The REST Report Tools may pass a regular expression test to the database. -# The following configuration setting will construct a SQL regular expression test appropriate to your database engine -rest.regex-clause = text_value ~ ? - ##### Configure REST Report Filters ##### # A filter contains a set of tests that will be applied to an item to determine its inclusion in a particular report. # Private items and withdrawn items are frequently excluded from DSpace reports. diff --git a/pom.xml b/pom.xml index c12f272c03..88dfeec6d0 100644 --- a/pom.xml +++ b/pom.xml @@ -196,6 +196,9 @@ + + src/main/java + ${root.basedir}/checkstyle.xml ${project.build.sourceEncoding} true From 07a76d394b4655ffe1cd9c704b54236216187f4d Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Thu, 5 Jul 2018 10:40:39 +0200 Subject: [PATCH 027/193] [DS-3741] added documentation to the AbstractHibernateDAO class --- .../org/dspace/core/AbstractHibernateDAO.java | 173 +++++++++++++++++- 1 file changed, 166 insertions(+), 7 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index a9e4f912a1..9ebceafaca 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -69,7 +69,7 @@ public abstract class AbstractHibernateDAO implements GenericDAO { CriteriaQuery criteriaQuery = getCriteriaQuery(getCriteriaBuilder(context), clazz); Root root = criteriaQuery.from(clazz); criteriaQuery.select(root); - return executeCriteriaQuery(context, criteriaQuery, false, clazz, -1, -1); + return executeCriteriaQuery(context, criteriaQuery, false, -1, -1); } @Override @@ -131,22 +131,67 @@ public abstract class AbstractHibernateDAO implements GenericDAO { return getHibernateSession(context).createQuery(query); } + /** + * This method will return a list with unique results, no duplicates, made by the given CriteriaQuery and parameters + * + * @param context + * The standard DSpace context object + * @param criteriaQuery + * The CriteriaQuery for which this list will be retrieved + * @param cacheable + * Whether or not this query should be cacheable + * @param clazz + * The clazz for which this CriteriaQuery will be executed on + * @param maxResults + * The maxmimum amount of results that will be returned for this CriteriaQuery + * @param offset + * The offset to be used for the CriteriaQuery + * @return A list of distinct results as depicted by the CriteriaQuery and parameters + * @throws SQLException + */ public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, int offset) throws SQLException { criteriaQuery.distinct(true); @SuppressWarnings("unchecked") - List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, clazz, maxResults, offset); + List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, maxResults, offset); return result; } + /** + * This method will return a list of results for the given CriteriaQuery and parameters + * + * @param context + * The standard DSpace context object + * @param criteriaQuery + * The CriteriaQuery to be used to find the list of results + * @param cacheable + * A boolean value indicating whether this query should be cached or not + * @param clazz + * The class on which the CriteriaQuery will search + * @param maxResults + * The maximum amount of results to be returned + * @param offset + * The offset to be used for the CriteriaQuery + * @param distinct + * A boolean value indicating whether this list should be distinct or not + * @return A list of results determined by the CriteriaQuery and parameters + * @throws SQLException + */ public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, int offset, boolean distinct) throws SQLException { criteriaQuery.distinct(distinct); @SuppressWarnings("unchecked") - List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, clazz, maxResults, offset); + List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, maxResults, offset); return result; } + /** + * This method will be used to return a list of results for the given query + * + * @param query + * The query for which the resulting list will be returned + * @return The list of results for the given query + */ public List list(Query query) { @SuppressWarnings("unchecked") List result = (List) query.getResultList(); @@ -186,6 +231,13 @@ public abstract class AbstractHibernateDAO implements GenericDAO { } + /** + * This method will return the first result from the given query or null if no results were found + * + * @param query + * The query that is to be executed + * @return One result from the given query or null if none was found + */ public T singleResult(final Query query) { query.setMaxResults(1); List list = list(query); @@ -197,27 +249,77 @@ public abstract class AbstractHibernateDAO implements GenericDAO { } + /** + * This method will return a singular result for the given query + * + * @param query + * The query for which a single result will be given + * @return The single result for this query + */ public T uniqueResult(Query query) { @SuppressWarnings("unchecked") T result = (T) query.getSingleResult(); return result; } + /** + * This method will return an Iterator for the given Query + * + * @param query + * The query for which an Iterator will be made + * @return The Iterator for the results of this query + */ public Iterator iterate(Query query) { @SuppressWarnings("unchecked") Iterator result = (Iterator) query.getResultList().iterator(); return result; } + /** + * This method will return the amount of results that would be generated for this CriteriaQuery as an integer + * + * @param context + * The standard DSpace Context object + * @param criteriaQuery + * The CriteriaQuery for which this result will be retrieved + * @param criteriaBuilder + * The CriteriaBuilder that accompagnies the CriteriaQuery + * @param root + * The root that'll determine on which class object we need to calculate the result + * @return The amount of results that would be found by this CriteriaQuery as an integer value + * @throws SQLException + */ public int count(Context context, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder, Root root) throws SQLException { return Math.toIntExact(countLong(context, criteriaQuery, criteriaBuilder, root)); } + /** + * This method will return the count of items for this query as an integer + * This query needs to already be in a formate that'll return one record that contains the amount + * + * @param query + * The query for which the amount of results will be returned. + * @return The amount of results + */ public int count(Query query) { return ((Long) query.getSingleResult()).intValue(); } + /** + * This method will return the count of items for this query as a long + * + * @param context + * The standard DSpace Context object + * @param criteriaQuery + * The CriteriaQuery for which the amount of results will be retrieved + * @param criteriaBuilder + * The CriteriaBuilder that goes along with this CriteriaQuery + * @param root + * The root created for a DSpace class on which this query will search + * @return A long value that depicts the amount of results this query has found + * @throws SQLException + */ public long countLong(Context context, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder, Root root) throws SQLException { Expression countExpression = criteriaBuilder.countDistinct(root); @@ -225,17 +327,54 @@ public abstract class AbstractHibernateDAO implements GenericDAO { return (Long) this.getHibernateSession(context).createQuery(criteriaQuery).getSingleResult(); } - public CriteriaQuery getCriteriaQuery(CriteriaBuilder criteriaBuilder, Class c) { - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(c); + /** + * This method should always be used in order to retrieve the CriteriaQuery in order to + * start creating a query that has to be executed + * + * @param criteriaBuilder + * The CriteriaBuilder for which this CriteriaQuery will be constructed + * @param clazz + * The class that this CriteriaQuery will be constructed for + * @return A CriteriaQuery on which a query can be built + */ + public CriteriaQuery getCriteriaQuery(CriteriaBuilder criteriaBuilder, Class clazz) { + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(clazz); return criteriaQuery; } + /** + * This method should always be used in order to retrieve a CriteriaBuilder for the given context + * + * @param context + * The standard DSpace Context class for which a CriteriaBuilder will be made + * @return A CriteriaBuilder that can be used to create the query + * @throws SQLException + */ public CriteriaBuilder getCriteriaBuilder(Context context) throws SQLException { return this.getHibernateSession(context).getCriteriaBuilder(); } + /** + * This method will return a list of objects to be returned that match the given criteriaQuery and parameters. + * The maxResults and offSet can be circumvented by entering the value -1 for them. + * + * @param context + * The standard context DSpace object + * @param criteriaQuery + * The CriteriaQuery that will be used for executing the query + * @param cacheable + * Whether or not this query is able to be cached + * @param maxResults + * The maximum amount of results that this query will return + * This can be circumvented by passing along -1 as the value + * @param offset + * The offset to be used in this query + * This can be circumvented by passing along -1 as the value + * @return This will return a list of objects that conform to the made query + * @throws SQLException + */ public List executeCriteriaQuery(Context context, CriteriaQuery criteriaQuery, boolean cacheable, - Class clazz, int maxResults, int offset) throws SQLException { + int maxResults, int offset) throws SQLException { Query query = this.getHibernateSession(context).createQuery(criteriaQuery); query.setHint("org.hibernate.cacheable", cacheable); @@ -249,6 +388,26 @@ public abstract class AbstractHibernateDAO implements GenericDAO { } + /** + * This method can be used to construct a query for which there needs to be a bunch of equal properties + * These properties can be passed along in the equals hashmap + * + * @param context + * The standard DSpace context object + * @param clazz + * The class on which the criteriaQuery will be built + * @param equals + * A hashmap that can be used to store the String representation of the column + * and the value that should match that in the DB + * @param cacheable + * A boolean indicating whether this query should be cacheable or not + * @param maxResults + * The max amount of results to be returned by this query + * @param offset + * The offset to be used in this query + * @return Will return a list of objects that correspond with the constructed query and parameters + * @throws SQLException + */ public List findByX(Context context, Class clazz, Map equals, boolean cacheable, int maxResults, int offset) throws SQLException { CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); @@ -259,7 +418,7 @@ public abstract class AbstractHibernateDAO implements GenericDAO { for (Map.Entry entry : equals.entrySet()) { criteria.where(criteriaBuilder.equal(root.get(entry.getKey()), entry.getValue())); } - return executeCriteriaQuery(context, criteria, cacheable, clazz, maxResults, offset); + return executeCriteriaQuery(context, criteria, cacheable, maxResults, offset); } } From ae53acfcb79df41050003ce09445d37411772dee Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Fri, 6 Jul 2018 10:08:40 +0200 Subject: [PATCH 028/193] [DS-3741] Fixed findByMetadataQuery in ItemDAOImpl --- .../dspace/content/dao/impl/ItemDAOImpl.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index 8cb584dad8..ffc5a10bf6 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -144,55 +144,54 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA enum OP { equals { - public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot) { - return criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.value), query_val.get(i)); + return criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.value), val); } }, not_equals { - public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot) { - return criteriaBuilder.notEqual(subqueryRoot.get(MetadataValue_.value), query_val.get(i)); + return criteriaBuilder.notEqual(subqueryRoot.get(MetadataValue_.value), val); } }, like { - public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot) { - return criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), query_val.get(i)); + return criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), val); } }, not_like { - public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot) { - return criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), query_val.get(i)); + return criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), val); } }, contains { - public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot) { - return criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), "%" + query_val.get(i) + "%"); + return criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), "%" + val + "%"); } }, doesnt_contain { - public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot) { - return criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), "%" + query_val.get(i) + "%"); + return criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), "%" + val + "%"); } }, exists { - public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot) { - return OP.equals.buildPredicate(query_val, criteriaBuilder, i, subqueryRoot); + return OP.equals.buildPredicate(val, criteriaBuilder, subqueryRoot); } }, doesnt_exist { - public Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot) { - return OP.not_equals.buildPredicate(query_val, criteriaBuilder, i, subqueryRoot); + return OP.not_equals.buildPredicate(val, criteriaBuilder, subqueryRoot); } }; - - public abstract Predicate buildPredicate(List query_val, CriteriaBuilder criteriaBuilder, int i, + public abstract Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, Root subqueryRoot); } @@ -201,7 +200,6 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA List query_op, List query_val, List collectionUuids, String regexClause, int offset, int limit) throws SQLException { - //TODO Check Tim Donohue's comment on this method. CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Item.class); Root itemRoot = criteriaQuery.from(Item.class); @@ -236,8 +234,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA criteriaBuilder.isTrue(subqueryRoot.get(MetadataValue_.metadataField).in(listFieldList.get(i)))); } - //TODO query_val weg naar val en i weg - predicateListSubQuery.add(op.buildPredicate(query_val, criteriaBuilder, i, subqueryRoot)); + predicateListSubQuery.add(op.buildPredicate(query_val.get(i), criteriaBuilder, subqueryRoot)); subquery.where(predicateListSubQuery.toArray(new Predicate[] {})); predicateList.add(criteriaBuilder.isTrue(itemRoot.get(Item_.id).in(subquery))); From d0889f858c532dafe05ca99c3c9003a2f761a2ca Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Fri, 6 Jul 2018 10:32:33 +0200 Subject: [PATCH 029/193] [DS-3741] fixed checkstyle --- .../org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java b/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java index 864414307d..2e33d96d73 100644 --- a/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java +++ b/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java @@ -15,6 +15,7 @@ import java.sql.SQLException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; +import javax.persistence.Query; import org.dspace.AbstractUnitTest; import org.dspace.checker.ChecksumResultCode; @@ -23,7 +24,6 @@ import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; import org.dspace.core.CoreHelpers; import org.dspace.core.HibernateDBConnection; -import javax.persistence.Query; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; From 154177db498df75e988b2b1e27b1d2beda59d36b Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Tue, 10 Jul 2018 13:51:59 +0200 Subject: [PATCH 030/193] [DS-3741] fixed limit-offset switch in method call --- .../src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index ffc5a10bf6..0e1459cad8 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -241,7 +241,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } criteriaQuery.where(predicateList.toArray(new Predicate[] {})); - return list(context, criteriaQuery, false, Item.class, offset, limit).iterator(); + return list(context, criteriaQuery, false, Item.class, limit, offset).iterator(); } @Override From 02fb1f40777643544d009619a559772d30d4db99 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Tue, 10 Jul 2018 14:10:05 +0200 Subject: [PATCH 031/193] [DS-3741] removed unecessary import in comments and removed unused parameter of method --- .../src/main/java/org/dspace/core/AbstractHibernateDAO.java | 2 -- .../org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index 9ebceafaca..d4571b8463 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -21,8 +21,6 @@ import javax.persistence.criteria.Root; import org.apache.commons.collections.CollectionUtils; import org.hibernate.Session; -//import org.hibernate.query.Query; - /** * Hibernate implementation for generic DAO interface. Also includes additional * Hibernate calls that are commonly used. diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java index 892b0d22f6..95a0bdf216 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java @@ -158,7 +158,7 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO Date: Thu, 23 Aug 2018 08:24:59 +0200 Subject: [PATCH 032/193] Applied the feedback --- .../dao/impl/MostRecentChecksumDAOImpl.java | 15 +++++++++++---- .../dspace/content/dao/impl/CommunityDAOImpl.java | 2 +- .../content/dao/impl/MetadataValueDAOImpl.java | 2 +- .../eperson/dao/impl/RegistrationDataDAOImpl.java | 4 ++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java index 7e8c8d256d..66ce666b9d 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java @@ -14,13 +14,16 @@ import java.util.List; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; import javax.persistence.criteria.Order; import javax.persistence.criteria.Root; import javax.persistence.criteria.Subquery; import org.dspace.checker.ChecksumHistory; import org.dspace.checker.ChecksumHistory_; +import org.dspace.checker.ChecksumResult; import org.dspace.checker.ChecksumResultCode; +import org.dspace.checker.ChecksumResult_; import org.dspace.checker.MostRecentChecksum; import org.dspace.checker.MostRecentChecksum_; import org.dspace.checker.dao.MostRecentChecksumDAO; @@ -82,11 +85,15 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + Join mostRecentResult = + mostRecentChecksumRoot.join(MostRecentChecksum_.checksumResult); + criteriaQuery.select(mostRecentChecksumRoot); criteriaQuery.where(criteriaBuilder.and( - criteriaBuilder.equal(mostRecentChecksumRoot.get("checksumResult.resultCode"), resultCode), - criteriaBuilder.lessThanOrEqualTo(mostRecentChecksumRoot.get("processStartDate"), startDate), - criteriaBuilder.greaterThan(mostRecentChecksumRoot.get("processStartDate"), endDate) + criteriaBuilder.equal(mostRecentResult.get(ChecksumResult_.resultCode), resultCode), + criteriaBuilder.lessThanOrEqualTo( + mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), endDate) ) ); List orderList = new LinkedList<>(); @@ -112,8 +119,8 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO orderList = new LinkedList<>(); - orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.processEndDate))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); criteriaQuery.orderBy(orderList); return singleResult(context, criteriaQuery); } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java index 7f33846a76..67bbd18d91 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java @@ -138,7 +138,7 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[] {})); criteriaQuery.select(communityRoot); criteriaQuery.where( - criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), + criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COMMUNITY), criteriaBuilder.equal(join.get(ResourcePolicy_.eperson), ePerson), orPredicate ) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java index 518b6150a2..a4fdf57cba 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java @@ -46,7 +46,7 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im criteriaQuery.where(criteriaBuilder.equal(join.get(MetadataField_.id), metadataField.getID())); - return list(context, criteriaQuery, true, MetadataValue.class, -1, -1); + return list(context, criteriaQuery, false, MetadataValue.class, -1, -1); } @Override diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java index e825106834..35fda4b62f 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java @@ -39,7 +39,7 @@ public class RegistrationDataDAOImpl extends AbstractHibernateDAO registrationDataRoot = criteriaQuery.from(RegistrationData.class); criteriaQuery.select(registrationDataRoot); criteriaQuery.where(criteriaBuilder.equal(registrationDataRoot.get(RegistrationData_.email), email)); - return uniqueResult(context, criteriaQuery, true, RegistrationData.class, -1, -1); + return uniqueResult(context, criteriaQuery, false, RegistrationData.class, -1, -1); } @Override @@ -49,7 +49,7 @@ public class RegistrationDataDAOImpl extends AbstractHibernateDAO registrationDataRoot = criteriaQuery.from(RegistrationData.class); criteriaQuery.select(registrationDataRoot); criteriaQuery.where(criteriaBuilder.equal(registrationDataRoot.get(RegistrationData_.token), token)); - return uniqueResult(context, criteriaQuery, true, RegistrationData.class, -1, -1); + return uniqueResult(context, criteriaQuery, false, RegistrationData.class, -1, -1); } @Override From 173b7f4fce5d95b8bd957e167b4e6b0ee43f5a8d Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 28 Aug 2018 10:46:00 -0400 Subject: [PATCH 033/193] [DS-3990] Invent curation run parameters. --- .../dspace/curate/AbstractCurationTask.java | 35 +++++++++++++------ .../main/java/org/dspace/curate/Curator.java | 20 +++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java index cf9c9fe9de..8515372638 100644 --- a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java +++ b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java @@ -198,14 +198,17 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration property value for passed name, else * null if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @return value * the property value, or null */ protected String taskProperty(String name) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return parameter; + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getProperty(taskId + "." + name); } else { return configurationService.getProperty(name); @@ -215,6 +218,7 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration integer property value for passed name, else * passed default value if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @param defaultValue value @@ -223,8 +227,10 @@ public abstract class AbstractCurationTask implements CurationTask { * the property value, or default value */ protected int taskIntProperty(String name, int defaultValue) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return Integer.valueOf(parameter); + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getIntProperty(taskId + "." + name, defaultValue); } else { return configurationService.getIntProperty(name, defaultValue); @@ -234,6 +240,7 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration long property value for passed name, else * passed default value if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @param defaultValue value @@ -242,8 +249,10 @@ public abstract class AbstractCurationTask implements CurationTask { * the property value, or default */ protected long taskLongProperty(String name, long defaultValue) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return Long.valueOf(parameter); + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getLongProperty(taskId + "." + name, defaultValue); } else { return configurationService.getLongProperty(name, defaultValue); @@ -253,6 +262,7 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration boolean property value for passed name, else * passed default value if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @param defaultValue value @@ -261,8 +271,10 @@ public abstract class AbstractCurationTask implements CurationTask { * the property value, or default */ protected boolean taskBooleanProperty(String name, boolean defaultValue) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return Boolean.valueOf(parameter); + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getBooleanProperty(taskId + "." + name, defaultValue); } else { return configurationService.getBooleanProperty(name, defaultValue); @@ -272,14 +284,17 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration Array property value for passed name, else * null if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @return value * the property value, or null */ protected String[] taskArrayProperty(String name) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return new String[] { parameter }; + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getArrayProperty(taskId + "." + name); } else { return configurationService.getArrayProperty(name); diff --git a/dspace-api/src/main/java/org/dspace/curate/Curator.java b/dspace-api/src/main/java/org/dspace/curate/Curator.java index 55d9843cb3..f54d8a4ecd 100644 --- a/dspace-api/src/main/java/org/dspace/curate/Curator.java +++ b/dspace-api/src/main/java/org/dspace/curate/Curator.java @@ -10,6 +10,7 @@ package org.dspace.curate; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -82,6 +83,7 @@ public class Curator { protected static final ThreadLocal curationCtx = new ThreadLocal<>(); + protected final Map runParameters = new HashMap<>(); protected Map trMap = new HashMap<>(); protected List perfList = new ArrayList<>(); protected TaskQueue taskQ = null; @@ -102,6 +104,24 @@ public class Curator { handleService = HandleServiceFactory.getInstance().getHandleService(); } + /** + * Set a parameter visible to all tasks in this Curator instance. + * @param name the parameter's name. + * @param value the parameter's value. + */ + public void addParameter(String name, String value) { + runParameters.put(name, value); + } + + /** + * Look up a run parameter. + * @param name the name of the desired parameter. + * @return the value of the named parameter. + */ + public String getRunParameter(String name) { + return runParameters.get(name); + } + /** * Add a task to the set to be performed. Caller should make no assumptions * on execution ordering. From c56c1d38ef6226a5357fd2c2c133727b44c54dd6 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Wed, 29 Aug 2018 12:55:33 +0200 Subject: [PATCH 034/193] [DS-3991] made sure that the halbrowser now correctly downloads files through the bitstreamcontent repository --- .../app/rest/utils/MultipartFileSender.java | 3 + .../src/main/webapp/js/hal/http/client.js | 59 +++++++++++++++++-- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java index 5133431b61..1fb2fed457 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java @@ -193,6 +193,9 @@ public class MultipartFileSender { log.debug("Return full file"); response.setContentType(contentType); response.setHeader(CONTENT_LENGTH, String.valueOf(length)); + if (length > 10000) { + response.setHeader(CONTENT_DISPOSITION, String.format(CONTENT_DISPOSITION_FORMAT, CONTENT_DISPOSITION_ATTACHMENT, fileName)); + } Range.copy(inputStream, output, length, 0, length, bufferSize); } else if (ranges.size() == 1) { diff --git a/dspace-spring-rest/src/main/webapp/js/hal/http/client.js b/dspace-spring-rest/src/main/webapp/js/hal/http/client.js index 9e1871abae..f4120f230c 100644 --- a/dspace-spring-rest/src/main/webapp/js/hal/http/client.js +++ b/dspace-spring-rest/src/main/webapp/js/hal/http/client.js @@ -7,13 +7,55 @@ */ HAL.Http.Client = function(opts) { this.vent = opts.vent; - this.defaultHeaders = { 'Accept': 'application/hal+json, application/json, */*; q=0.01' }; - cookie = document.cookie.match('(^|;)\\s*' + 'MyHalBrowserToken' + '\\s*=\\s*([^;]+)'); - cookie ? this.defaultHeaders.Authorization = 'Bearer ' + cookie.pop() : ''; + this.defaultHeaders = {'Accept': 'application/hal+json, application/json, */*; q=0.01'}; + var authorizationHeader = getAuthorizationHeader(); + authorizationHeader ? this.defaultHeaders.Authorization = authorizationHeader : ''; console.log(this.defaultHeaders); this.headers = this.defaultHeaders; }; +function getAuthorizationHeader() { + var cookie = document.cookie.match('(^|;)\\s*' + 'MyHalBrowserToken' + '\\s*=\\s*([^;]+)'); + if(cookie != undefined) { + return 'Bearer ' + cookie.pop(); + } else { + return undefined; + } +} +function downloadFile(url) { + var request = new XMLHttpRequest(); + request.open('GET', url, true); + request.responseType = 'blob'; + var authorizationHeader = getAuthorizationHeader(); + if (authorizationHeader != undefined) { + request.setRequestHeader("Authorization", authorizationHeader); + } + request.onload = function () { + // Only handle status code 200 + if (request.status === 200) { + // Try to find out the filename from the content disposition `filename` value + var disposition = request.getResponseHeader('content-disposition'); + var matches = /"([^"]*)"/.exec(disposition); + var filename = (matches != null && matches[1] ? matches[1] : 'file.pdf'); + // The actual download + var contentTypeHeader = request.getResponseHeader("content-type"); + if (contentTypeHeader === undefined || contentTypeHeader === "") { + contentTypeHeader = "application/octet-stream"; + } + var blob = new Blob([request.response], {type: contentTypeHeader}); + var link = document.createElement('a'); + link.href = window.URL.createObjectURL(blob); + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + // some error handling should be done here... + }; + request.send(); +} + + HAL.Http.Client.prototype.get = function(url) { var self = this; this.vent.trigger('location-change', { url: url }); @@ -31,9 +73,14 @@ HAL.Http.Client.prototype.get = function(url) { headers: jqXHR.getAllResponseHeaders() }); } - }).error(function() { - self.vent.trigger('fail-response', { jqxhr: jqxhr }); - }); + }).error(function (response) { + self.vent.trigger('fail-response', {jqxhr: jqxhr}); + var contentTypeResponseHeader = jqxhr.getResponseHeader("content-type"); + if (contentTypeResponseHeader != undefined + && !contentTypeResponseHeader.startsWith("application/hal") + && !contentTypeResponseHeader.startsWith("application/json")) { + downloadFile(url); + }}); }; HAL.Http.Client.prototype.request = function(opts) { From 287dce21fc6d2a6444ab27c7081d3f7dcb9de4a6 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Wed, 29 Aug 2018 13:35:17 +0200 Subject: [PATCH 035/193] [DS-3991] altered the disposition rules in the BitstreamContentRestController and MultiPartFileSender --- .../app/rest/BitstreamContentRestController.java | 10 ++++++++++ .../app/rest/utils/MultipartFileSender.java | 15 ++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java index c09cebfde6..e60007d8ab 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java @@ -27,6 +27,7 @@ import org.dspace.content.BitstreamFormat; import org.dspace.content.service.BitstreamService; import org.dspace.core.Context; import org.dspace.disseminate.service.CitationDocumentService; +import org.dspace.services.ConfigurationService; import org.dspace.services.EventService; import org.dspace.usage.UsageEvent; import org.springframework.beans.factory.annotation.Autowired; @@ -70,6 +71,9 @@ public class BitstreamContentRestController { @Autowired private CitationDocumentService citationDocumentService; + @Autowired + private ConfigurationService configurationService; + @PreAuthorize("hasPermission(#uuid, 'BITSTREAM', 'READ')") @RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD}) public void retrieve(@PathVariable UUID uuid, HttpServletResponse response, @@ -104,6 +108,12 @@ public class BitstreamContentRestController { .with(request) .with(response); + //Determine if we need to send the file as a download or if the browser can open it inline + long dispositionThreshold = configurationService.getLongProperty("webui.content_disposition_threshold"); + if (dispositionThreshold >= 0 && bitstreamTuple.getRight() > dispositionThreshold) { + sender.withDisposition(MultipartFileSender.CONTENT_DISPOSITION_ATTACHMENT); + } + if (sender.isNoRangeRequest() && isNotAnErrorResponse(response)) { //We only log a download request when serving a request without Range header. This is because //a browser always sends a regular request first to check for Range support. diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java index 1fb2fed457..4ae836bccf 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java @@ -41,8 +41,8 @@ public class MultipartFileSender { private static final String MULTIPART_BOUNDARY = "MULTIPART_BYTERANGES"; private static final String CONTENT_TYPE_MULTITYPE_WITH_BOUNDARY = "multipart/byteranges; boundary=" + MULTIPART_BOUNDARY; - private static final String CONTENT_DISPOSITION_INLINE = "inline"; - private static final String CONTENT_DISPOSITION_ATTACHMENT = "attachment"; + public static final String CONTENT_DISPOSITION_INLINE = "inline"; + public static final String CONTENT_DISPOSITION_ATTACHMENT = "attachment"; private static final String IF_NONE_MATCH = "If-None-Match"; private static final String IF_MODIFIED_SINCE = "If-Modified-Since"; private static final String ETAG = "ETag"; @@ -134,6 +134,10 @@ public class MultipartFileSender { } return this; } + public MultipartFileSender withDisposition(String contentDisposition) { + this.disposition = contentDisposition; + return this; + } public void serveResource() throws IOException { @@ -172,9 +176,9 @@ public class MultipartFileSender { CONTENT_DISPOSITION_ATTACHMENT; } - response.setHeader(CONTENT_DISPOSITION, String.format(CONTENT_DISPOSITION_FORMAT, disposition, fileName)); - log.debug("Content-Disposition : {}", disposition); } + response.setHeader(CONTENT_DISPOSITION, String.format(CONTENT_DISPOSITION_FORMAT, disposition, fileName)); + log.debug("Content-Disposition : {}", disposition); // Content phase if (METHOD_HEAD.equals(request.getMethod())) { @@ -193,9 +197,6 @@ public class MultipartFileSender { log.debug("Return full file"); response.setContentType(contentType); response.setHeader(CONTENT_LENGTH, String.valueOf(length)); - if (length > 10000) { - response.setHeader(CONTENT_DISPOSITION, String.format(CONTENT_DISPOSITION_FORMAT, CONTENT_DISPOSITION_ATTACHMENT, fileName)); - } Range.copy(inputStream, output, length, 0, length, bufferSize); } else if (ranges.size() == 1) { From 349eebb834f13f16d9947e999837b0c0921bd19c Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Wed, 29 Aug 2018 13:38:05 +0200 Subject: [PATCH 036/193] [DS-3991] removed the xmlui content disposition threshold property --- dspace/config/dspace.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index c38847ac07..f8a4930e61 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -1368,7 +1368,6 @@ websvc.opensearch.formats = html,atom,rss # The 'webui.*' setting is for the JSPUI, and # the 'xmlui.*' setting is for the XMLUI webui.content_disposition_threshold = 8388608 -xmlui.content_disposition_threshold = 8388608 #### Multi-file HTML document/site settings ##### From e980811d4e51ac0b55d4583400180b543f97cfeb Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 6 Sep 2018 07:01:46 -0400 Subject: [PATCH 037/193] [DS-3990] CLI access to task run parameters. --- .../java/org/dspace/curate/CurationCli.java | 19 +++++++++++++++++++ .../main/java/org/dspace/curate/Curator.java | 8 ++++++++ 2 files changed, 27 insertions(+) diff --git a/dspace-api/src/main/java/org/dspace/curate/CurationCli.java b/dspace-api/src/main/java/org/dspace/curate/CurationCli.java index c0b206abfc..16ecb7e8a0 100644 --- a/dspace-api/src/main/java/org/dspace/curate/CurationCli.java +++ b/dspace-api/src/main/java/org/dspace/curate/CurationCli.java @@ -9,7 +9,9 @@ package org.dspace.curate; import java.io.BufferedReader; import java.io.FileReader; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -48,6 +50,8 @@ public class CurationCli { "file containing curation task names"); options.addOption("i", "id", true, "Id (handle) of object to perform task on, or 'all' to perform on whole repository"); + options.addOption("p", "parameter", true, + "a task parameter 'NAME=VALUE'"); options.addOption("q", "queue", true, "name of task queue to process"); options.addOption("e", "eperson", true, @@ -71,6 +75,7 @@ public class CurationCli { String reporterName = null; String scope = null; boolean verbose = false; + final Map parameters = new HashMap<>(); if (line.hasOption('h')) { HelpFormatter help = new HelpFormatter(); @@ -104,6 +109,19 @@ public class CurationCli { ePersonName = line.getOptionValue('e'); } + if (line.hasOption('p')) { // parameter + for (String parameter : line.getOptionValues('p')) { + String[] parts = parameter.split("=", 2); + String name = parts[0]; + String value; + if (parts.length > 1) { + value = parts[1]; + } else { + value = "true"; + } + parameters.put(name, value); + } + } if (line.hasOption('r')) { // report file reporterName = line.getOptionValue('r'); } @@ -154,6 +172,7 @@ public class CurationCli { Curator.TxScope txScope = Curator.TxScope.valueOf(scope.toUpperCase()); curator.setTransactionScope(txScope); } + curator.addParameters(parameters); // we are operating in batch mode, if anyone cares. curator.setInvoked(Curator.Invoked.BATCH); // load curation tasks diff --git a/dspace-api/src/main/java/org/dspace/curate/Curator.java b/dspace-api/src/main/java/org/dspace/curate/Curator.java index f54d8a4ecd..af6ac1d16a 100644 --- a/dspace-api/src/main/java/org/dspace/curate/Curator.java +++ b/dspace-api/src/main/java/org/dspace/curate/Curator.java @@ -113,6 +113,14 @@ public class Curator { runParameters.put(name, value); } + /** + * Set many parameters visible to all tasks in this Curator instance. + * @param parameters parameter name/value pairs. + */ + public void addParameters(Map parameters) { + runParameters.putAll(parameters); + } + /** * Look up a run parameter. * @param name the name of the desired parameter. From af27fde95b6e8e2c441c43327cc0a1983cfac5bc Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 6 Sep 2018 08:42:13 -0400 Subject: [PATCH 038/193] [DS-3990] Satisfy Checkstyle. --- dspace-api/src/main/java/org/dspace/curate/CurationCli.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 16ecb7e8a0..036c75af15 100644 --- a/dspace-api/src/main/java/org/dspace/curate/CurationCli.java +++ b/dspace-api/src/main/java/org/dspace/curate/CurationCli.java @@ -51,7 +51,7 @@ public class CurationCli { 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'"); + "a task parameter 'NAME=VALUE'"); options.addOption("q", "queue", true, "name of task queue to process"); options.addOption("e", "eperson", true, @@ -117,8 +117,8 @@ public class CurationCli { if (parts.length > 1) { value = parts[1]; } else { - value = "true"; - } + value = "true"; + } parameters.put(name, value); } } From 2c47e9b1494e3ff8043149e2dd0305d2a231970c Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 6 Sep 2018 08:44:06 -0400 Subject: [PATCH 039/193] [DS-3990] Satisfy Checkstyle (tested this time)-: --- dspace-api/src/main/java/org/dspace/curate/Curator.java | 1 - 1 file changed, 1 deletion(-) 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 af6ac1d16a..eb91dc9b7e 100644 --- a/dspace-api/src/main/java/org/dspace/curate/Curator.java +++ b/dspace-api/src/main/java/org/dspace/curate/Curator.java @@ -10,7 +10,6 @@ package org.dspace.curate; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; From 0c58803a441f8ed711f7e5820949d46b3840f722 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Thu, 6 Sep 2018 14:46:22 +0200 Subject: [PATCH 040/193] [DS-3741] restored the findByMetadataQuery method in a slightly altered version --- .../dspace/content/dao/impl/ItemDAOImpl.java | 127 ++++++++++-------- dspace/config/modules/rest.cfg | 6 + 2 files changed, 74 insertions(+), 59 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index 0e1459cad8..786bf10ed8 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -11,29 +11,28 @@ import java.sql.SQLException; import java.util.Collections; import java.util.Date; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.UUID; import javax.persistence.Query; import javax.persistence.TemporalType; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; -import javax.persistence.criteria.Subquery; import org.apache.log4j.Logger; import org.dspace.content.Collection; -import org.dspace.content.DSpaceObject; import org.dspace.content.Item; -import org.dspace.content.Item_; import org.dspace.content.MetadataField; import org.dspace.content.MetadataValue; -import org.dspace.content.MetadataValue_; import org.dspace.content.dao.ItemDAO; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; +import org.hibernate.Criteria; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Property; +import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.Subqueries; +import org.hibernate.type.StandardBasicTypes; /** * Hibernate implementation of the Database Access Object interface class for the Item object. @@ -144,75 +143,79 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA enum OP { equals { - public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot) { - return criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.value), val); + public Criterion buildPredicate(String val, String regexClause) { + return Property.forName("mv.value").eq(val); } }, not_equals { - public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot) { - return criteriaBuilder.notEqual(subqueryRoot.get(MetadataValue_.value), val); + public Criterion buildPredicate(String val, String regexClause) { + return OP.equals.buildPredicate(val, regexClause); } }, like { - public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot) { - return criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), val); + public Criterion buildPredicate(String val, String regexClause) { + return Property.forName("mv.value").like(val); } }, not_like { - public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot) { - return criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), val); + public Criterion buildPredicate(String val, String regexClause) { + return OP.like.buildPredicate(val, regexClause); } }, contains { - public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot) { - return criteriaBuilder.like(subqueryRoot.get(MetadataValue_.value), "%" + val + "%"); + public Criterion buildPredicate(String val, String regexClause) { + return Property.forName("mv.value").like("%" + val + "%"); } }, doesnt_contain { - public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot) { - return criteriaBuilder.notLike(subqueryRoot.get(MetadataValue_.value), "%" + val + "%"); + public Criterion buildPredicate(String val, String regexClause) { + return OP.contains.buildPredicate(val, regexClause); } }, exists { - public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot) { - return OP.equals.buildPredicate(val, criteriaBuilder, subqueryRoot); + public Criterion buildPredicate(String val, String regexClause) { + return OP.equals.buildPredicate(val, regexClause); } }, doesnt_exist { - public Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot) { - return OP.not_equals.buildPredicate(val, criteriaBuilder, subqueryRoot); + public Criterion buildPredicate(String val, String regexClause) { + return OP.not_equals.buildPredicate(val, regexClause); } + }, + matches { + public Criterion buildPredicate(String val, String regexClause) { + return Restrictions.sqlRestriction(regexClause, val, StandardBasicTypes.STRING); + } + }, + doesnt_match { + public Criterion buildPredicate(String val, String regexClause) { + return OP.matches.buildPredicate(val, regexClause); + } + }; - public abstract Predicate buildPredicate(String val, CriteriaBuilder criteriaBuilder, - Root subqueryRoot); + public abstract Criterion buildPredicate(String val, String regexClause); } @Override + @Deprecated public Iterator findByMetadataQuery(Context context, List> listFieldList, List query_op, List query_val, List collectionUuids, String regexClause, int offset, int limit) throws SQLException { - CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); - CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Item.class); - Root itemRoot = criteriaQuery.from(Item.class); - criteriaQuery.select(itemRoot); - - - List predicateList = new LinkedList<>(); + Criteria criteria = getHibernateSession(context).createCriteria(Item.class, "item"); + criteria.setFirstResult(offset); + criteria.setMaxResults(limit); if (!collectionUuids.isEmpty()) { - predicateList.add(criteriaBuilder.isTrue(itemRoot.get(Item_.owningCollection).in(collectionUuids))); + DetachedCriteria dcollCriteria = DetachedCriteria.forClass(Collection.class, "coll"); + dcollCriteria.setProjection(Projections.property("coll.id")); + dcollCriteria.add(Restrictions.eqProperty("coll.id", "item.owningCollection")); + dcollCriteria.add(Restrictions.in("coll.id", collectionUuids)); + criteria.add(Subqueries.exists(dcollCriteria)); } int index = Math.min(listFieldList.size(), Math.min(query_op.size(), query_val.size())); + StringBuilder sb = new StringBuilder(); for (int i = 0; i < index; i++) { OP op = OP.valueOf(query_op.get(i)); @@ -221,27 +224,33 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA continue; } - Subquery subquery = criteriaQuery.subquery(DSpaceObject.class); - Root subqueryRoot = subquery.from(MetadataValue.class); - subquery.select(subqueryRoot.get(MetadataValue_.dSpaceObject)); - List predicateListSubQuery = new LinkedList<>(); - - predicateListSubQuery - .add(criteriaBuilder.equal(subqueryRoot.get(MetadataValue_.dSpaceObject), itemRoot.get(Item_.id))); - - if (!listFieldList.get(i).isEmpty()) { - predicateListSubQuery.add( - criteriaBuilder.isTrue(subqueryRoot.get(MetadataValue_.metadataField).in(listFieldList.get(i)))); + if (op == OP.matches || op == OP.doesnt_match) { + if (regexClause.isEmpty()) { + log.warn("Skipping Unsupported Regex Operator: " + query_op.get(i)); + continue; + } } - predicateListSubQuery.add(op.buildPredicate(query_val.get(i), criteriaBuilder, subqueryRoot)); + DetachedCriteria subcriteria = DetachedCriteria.forClass(MetadataValue.class, "mv"); + subcriteria.add(Property.forName("mv.dSpaceObject").eqProperty("item.id")); + subcriteria.setProjection(Projections.property("mv.dSpaceObject")); - subquery.where(predicateListSubQuery.toArray(new Predicate[] {})); - predicateList.add(criteriaBuilder.isTrue(itemRoot.get(Item_.id).in(subquery))); + if (!listFieldList.get(i).isEmpty()) { + subcriteria.add(Restrictions.in("metadataField", listFieldList.get(i))); + } + + subcriteria.add(op.buildPredicate(query_val.get(i), regexClause)); + + if (op == OP.exists || op == OP.equals || op == OP.like || op == OP.contains || op == OP.matches) { + criteria.add(Subqueries.exists(subcriteria)); + } else { + criteria.add(Subqueries.notExists(subcriteria)); + } } - criteriaQuery.where(predicateList.toArray(new Predicate[] {})); + log.debug(String.format("Running custom query with %d filters", index)); + + return ((List) criteria.list()).iterator(); - return list(context, criteriaQuery, false, Item.class, limit, offset).iterator(); } @Override diff --git a/dspace/config/modules/rest.cfg b/dspace/config/modules/rest.cfg index 3310d018a6..c8ac235dc9 100644 --- a/dspace/config/modules/rest.cfg +++ b/dspace/config/modules/rest.cfg @@ -39,6 +39,12 @@ rest.report-url.collections = static/reports/index.html rest.report-url.item-query = static/reports/query.html #rest.report-url.custom = +##### database specific way to format a regex SQL clause ##### +# The REST Report Tools may pass a regular expression test to the database. +# The following configuration setting will construct a SQL regular expression test appropriate to your database engine +rest.regex-clause = text_value ~ ? + + ##### Configure REST Report Filters ##### # A filter contains a set of tests that will be applied to an item to determine its inclusion in a particular report. # Private items and withdrawn items are frequently excluded from DSpace reports. From d4dbd3894a645c6351d25dd1030b7e80962286ed Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Thu, 6 Sep 2018 11:23:56 -0700 Subject: [PATCH 041/193] fix exist/doesn't exist --- .../main/java/org/dspace/content/dao/impl/ItemDAOImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index 786bf10ed8..67644ee7b4 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -174,12 +174,12 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA }, exists { public Criterion buildPredicate(String val, String regexClause) { - return OP.equals.buildPredicate(val, regexClause); + return Property.forName("mv.value").isNotNull(); } }, doesnt_exist { public Criterion buildPredicate(String val, String regexClause) { - return OP.not_equals.buildPredicate(val, regexClause); + return OP.exists.buildPredicate(val, regexClause); } }, matches { From 43d01f283f1f1bccbb0f23c9987e2cd0ffae53b4 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 9 Sep 2018 12:37:07 -0400 Subject: [PATCH 042/193] [DS-3990] Dummy task to test properties and parameters. --- .../testing/PropertyParameterTestingTask.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 dspace-api/src/main/java/org/dspace/ctask/testing/PropertyParameterTestingTask.java diff --git a/dspace-api/src/main/java/org/dspace/ctask/testing/PropertyParameterTestingTask.java b/dspace-api/src/main/java/org/dspace/ctask/testing/PropertyParameterTestingTask.java new file mode 100644 index 0000000000..279204cf57 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/ctask/testing/PropertyParameterTestingTask.java @@ -0,0 +1,61 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ + +package org.dspace.ctask.testing; + +import java.io.IOException; + +import org.dspace.content.DSpaceObject; +import org.dspace.core.Context; +import org.dspace.curate.AbstractCurationTask; +import org.dspace.curate.Curator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Logs what it was asked to do, samples run parameters and task + * properties, making no changes to the repository. For testing. + * + *

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

+ * This is a debugging tool, NOT a regression test. + * + * @author mhwood + */ +public class PropertyParameterTestingTask + extends AbstractCurationTask { + private static final Logger LOG + = LoggerFactory.getLogger(PropertyParameterTestingTask.class); + + @Override + public void init(Curator curator, String taskId) + throws IOException { + super.init(curator, taskId); + LOG.info("Received 'init' on task {}", taskId); + // Display some properties. + LOG.info("taskProperty = '{}'; runParameter = '{}'", + taskProperty("taskProperty"), taskProperty("runParameter")); + } + + @Override + public int perform(DSpaceObject dso) + throws IOException { + LOG.info("Received 'perform' on {}", dso); + return Curator.CURATE_SUCCESS; + } + + @Override + public int perform(Context ctx, String id) + throws IOException { + LOG.info("Received 'perform' on object ID {}", id); + return Curator.CURATE_SUCCESS; + } +} From 0340cd73ad0f35528c6058e3a9880d51c3834319 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 9 Sep 2018 17:19:39 -0400 Subject: [PATCH 043/193] [DS-3990] Add simple unit test. --- .../java/org/dspace/curate/CuratorTest.java | 413 ++++++++++++++++++ .../java/org/dspace/curate/DummyTask.java | 30 ++ 2 files changed, 443 insertions(+) create mode 100644 dspace-api/src/test/java/org/dspace/curate/CuratorTest.java create mode 100644 dspace-api/src/test/java/org/dspace/curate/DummyTask.java diff --git a/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java b/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java new file mode 100644 index 0000000000..7652caade0 --- /dev/null +++ b/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java @@ -0,0 +1,413 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.curate; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.dspace.AbstractUnitTest; +import org.dspace.content.DSpaceObject; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.SiteService; +import org.dspace.services.ConfigurationService; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * + * @author mhwood + */ +public class CuratorTest + extends AbstractUnitTest { + private static final SiteService SITE_SERVICE = ContentServiceFactory.getInstance().getSiteService(); + + static final String RUN_PARAMETER_NAME = "runParameter"; + static final String RUN_PARAMETER_VALUE = "a parameter"; + static final String TASK_PROPERTY_NAME = "taskProperty"; + static final String TASK_PROPERTY_VALUE = "a property"; + + /** Value of a known runtime parameter, if any. */ + static String runParameter; + + /** Value of a known task property, if any. */ + static String taskProperty; + + public CuratorTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + /** + * Test of addParameter method, of class Curator. + */ +/* + @Test + public void testAddParameter() { + System.out.println("addParameter"); + String name = ""; + String value = ""; + Curator instance = new Curator(); + instance.addParameter(name, value); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of addParameters method, of class Curator. + */ +/* + @Test + public void testAddParameters() { + System.out.println("addParameters"); + Map parameters = null; + Curator instance = new Curator(); + instance.addParameters(parameters); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of getRunParameter method, of class Curator. + */ +/* + @Test + public void testGetRunParameter() { + System.out.println("getRunParameter"); + String name = ""; + Curator instance = new Curator(); + String expResult = ""; + String result = instance.getRunParameter(name); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of addTask method, of class Curator. + */ +/* + @Test + public void testAddTask() { + System.out.println("addTask"); + String taskName = ""; + Curator instance = new Curator(); + Curator expResult = null; + Curator result = instance.addTask(taskName); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of hasTask method, of class Curator. + */ +/* + @Test + public void testHasTask() { + System.out.println("hasTask"); + String taskName = ""; + Curator instance = new Curator(); + boolean expResult = false; + boolean result = instance.hasTask(taskName); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of removeTask method, of class Curator. + */ +/* + @Test + public void testRemoveTask() { + System.out.println("removeTask"); + String taskName = ""; + Curator instance = new Curator(); + Curator expResult = null; + Curator result = instance.removeTask(taskName); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of setInvoked method, of class Curator. + */ +/* + @Test + public void testSetInvoked() { + System.out.println("setInvoked"); + Curator.Invoked mode = null; + Curator instance = new Curator(); + Curator expResult = null; + Curator result = instance.setInvoked(mode); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of setReporter method, of class Curator. + */ +/* + @Test + public void testSetReporter() { + System.out.println("setReporter"); + String reporter = ""; + Curator instance = new Curator(); + Curator expResult = null; + Curator result = instance.setReporter(reporter); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of setTransactionScope method, of class Curator. + */ +/* + @Test + public void testSetTransactionScope() { + System.out.println("setTransactionScope"); + Curator.TxScope scope = null; + Curator instance = new Curator(); + Curator expResult = null; + Curator result = instance.setTransactionScope(scope); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of curate method, of class Curator. + */ +/* + @Test + public void testCurate_Context_String() throws Exception { + System.out.println("curate"); + String id = ""; + Curator instance = new Curator(); + instance.curate(context, id); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of curate method, of class Curator. + * Currently this just tests task properties and run parameters. + * @throws java.lang.Exception passed through. + */ + @Test + public void testCurate_DSpaceObject() + throws Exception { + System.out.println("curate"); + + final String TASK_NAME = "dummyTask"; + + // Configure the task to be run. + ConfigurationService cfg = kernelImpl.getConfigurationService(); + cfg.setProperty("plugin.named.org.dspace.curate.CurationTask", + DummyTask.class.getName() + " = " + TASK_NAME); + cfg.setProperty(TASK_NAME + '.' + TASK_PROPERTY_NAME, TASK_PROPERTY_VALUE); + + // Get and configure a Curator. + Curator instance = new Curator(); + instance.setReporter("-"); // Send any report to standard out. FIXME when DS-3989 is merged + instance.addTask(TASK_NAME); + + // Configure the run. + Map parameters = new HashMap<>(); + parameters.put(RUN_PARAMETER_NAME, RUN_PARAMETER_VALUE); + instance.addParameters(parameters); + + // Curate the site. + DSpaceObject dso = SITE_SERVICE.findSite(context); + instance.curate(context, dso); + + // Check the result. + System.out.format("Task %s result was '%s'%n", + TASK_NAME, instance.getResult(TASK_NAME)); + System.out.format("Task %s status was %d%n", + TASK_NAME, instance.getStatus(TASK_NAME)); + assertEquals("Unexpected task status", + Curator.CURATE_SUCCESS, instance.getStatus(TASK_NAME)); + assertEquals("Wrong run parameter", RUN_PARAMETER_VALUE, runParameter); + assertEquals("Wrong task property", TASK_PROPERTY_VALUE, taskProperty); + } + + /** + * Test of curate method, of class Curator. + */ +/* + @Test + public void testCurate_Context_DSpaceObject() throws Exception { + System.out.println("curate"); + DSpaceObject dso = null; + Curator instance = new Curator(); + instance.curate(context, dso); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of queue method, of class Curator. + */ +/* + @Test + public void testQueue() throws Exception { + System.out.println("queue"); + Context c = null; + String id = ""; + String queueId = ""; + Curator instance = new Curator(); + instance.queue(c, id, queueId); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of clear method, of class Curator. + */ +/* + @Test + public void testClear() { + System.out.println("clear"); + Curator instance = new Curator(); + instance.clear(); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of report method, of class Curator. + */ +/* + @Test + public void testReport() { + System.out.println("report"); + String message = ""; + Curator instance = new Curator(); + instance.report(message); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of getStatus method, of class Curator. + */ +/* + @Test + public void testGetStatus() { + System.out.println("getStatus"); + String taskName = ""; + Curator instance = new Curator(); + int expResult = 0; + int result = instance.getStatus(taskName); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of getResult method, of class Curator. + */ +/* + @Test + public void testGetResult() { + System.out.println("getResult"); + String taskName = ""; + Curator instance = new Curator(); + String expResult = ""; + String result = instance.getResult(taskName); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of setResult method, of class Curator. + */ +/* + @Test + public void testSetResult() { + System.out.println("setResult"); + String taskName = ""; + String result_2 = ""; + Curator instance = new Curator(); + instance.setResult(taskName, result_2); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of curationContext method, of class Curator. + */ +/* + @Test + public void testCurationContext() throws Exception { + System.out.println("curationContext"); + Context expResult = null; + Context result = Curator.curationContext(); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ + + /** + * Test of isContainer method, of class Curator. + */ +/* + @Test + public void testIsContainer() { + System.out.println("isContainer"); + DSpaceObject dso = null; + boolean expResult = false; + boolean result = Curator.isContainer(dso); + assertEquals(expResult, result); + // TODO review the generated test code and remove the default call to fail. + fail("The test case is a prototype."); + } +*/ +} diff --git a/dspace-api/src/test/java/org/dspace/curate/DummyTask.java b/dspace-api/src/test/java/org/dspace/curate/DummyTask.java new file mode 100644 index 0000000000..22492a1e16 --- /dev/null +++ b/dspace-api/src/test/java/org/dspace/curate/DummyTask.java @@ -0,0 +1,30 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.curate; + +import java.io.IOException; + +import org.dspace.content.DSpaceObject; + +/** + * Makes no model changes, but records certain property values for inspection. + */ +public class DummyTask + extends AbstractCurationTask { + public DummyTask() { + // This constructor intentionally left blank. + } + + @Override + public int perform(DSpaceObject dso) + throws IOException { + CuratorTest.runParameter = taskProperty(CuratorTest.RUN_PARAMETER_NAME); + CuratorTest.taskProperty = taskProperty(CuratorTest.TASK_PROPERTY_NAME); + return Curator.CURATE_SUCCESS; + } +} From 7aed10c1b1a40dd78f5b211395030e54a7f9682b Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Tue, 11 Sep 2018 20:27:12 +0200 Subject: [PATCH 044/193] DS-3937 Add support for styling and rows in the submission-forms.xml --- .../java/org/dspace/app/util/DCInputSet.java | 43 +- .../org/dspace/app/util/DCInputsReader.java | 137 ++- .../main/java/org/dspace/app/util/Util.java | 40 +- .../authority/ChoiceAuthorityServiceImpl.java | 59 +- .../MetadataAuthorityServiceImpl.java | 32 +- .../ctask/general/RequiredMetadata.java | 22 +- .../DSpaceWorkspaceItemOutputGenerator.java | 16 +- .../dspaceFolder/config/submission-forms.xml | 790 +++++++++--------- .../converter/SubmissionFormConverter.java | 53 +- .../rest/model/SubmissionFormFieldRest.java | 2 + .../app/rest/model/SubmissionFormRest.java | 12 +- .../app/rest/model/SubmissionFormRowRest.java | 30 + .../app/rest/submit/step/DescribeStep.java | 16 +- .../step/validation/MetadataValidation.java | 69 +- dspace/config/submission-forms.dtd | 6 +- dspace/config/submission-forms.xml | 87 +- 16 files changed, 794 insertions(+), 620 deletions(-) create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInputSet.java b/dspace-api/src/main/java/org/dspace/app/util/DCInputSet.java index 52405c2874..faa3fb7190 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DCInputSet.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DCInputSet.java @@ -25,25 +25,26 @@ public class DCInputSet { /** * the inputs ordered by row position */ - private DCInput[] inputs = null; + private DCInput[][] inputs = null; /** * constructor * * @param formName form name - * @param headings * @param mandatoryFlags - * @param fields fields + * @param rows the rows * @param listMap map */ - public DCInputSet(String formName, - List> fields, Map> listMap) { + public DCInputSet(String formName, List>> rows, Map> listMap) { this.formName = formName; - this.inputs = new DCInput[fields.size()]; + this.inputs = new DCInput[rows.size()][]; for (int i = 0; i < inputs.length; i++) { - Map field = fields.get(i); - inputs[i] = new DCInput(field, listMap); - + List> fields = rows.get(i); + inputs[i] = new DCInput[fields.size()]; + for (int j = 0; j < inputs[i].length; j++) { + Map field = rows.get(i).get(j); + inputs[i][j] = new DCInput(field, listMap); + } } } @@ -71,7 +72,7 @@ public class DCInputSet { * @return an array containing the fields */ - public DCInput[] getFields() { + public DCInput[][] getFields() { return inputs; } @@ -104,10 +105,12 @@ public class DCInputSet { */ public boolean isFieldPresent(String fieldName) { for (int i = 0; i < inputs.length; i++) { - DCInput field = inputs[i]; - String fullName = field.getFieldName(); - if (fullName.equals(fieldName)) { - return true; + for (int j = 0; j < inputs[i].length; j++) { + DCInput field = inputs[i][j]; + String fullName = field.getFieldName(); + if (fullName.equals(fieldName)) { + return true; + } } } return false; @@ -127,11 +130,13 @@ public class DCInputSet { documentType = ""; } for (int i = 0; i < inputs.length; i++) { - DCInput field = inputs[i]; - String fullName = field.getFieldName(); - if (fullName.equals(fieldName)) { - if (field.isAllowedFor(documentType)) { - return true; + for (int j = 0; j < inputs[i].length; j++) { + DCInput field = inputs[i][j]; + String fullName = field.getFieldName(); + if (fullName.equals(fieldName)) { + if (field.isAllowedFor(documentType)) { + return true; + } } } } diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java b/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java index f88ec61d50..2f1ec19875 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java @@ -74,7 +74,7 @@ public class DCInputsReader { * Reference to the forms definitions map, computed from the forms * definition file */ - private Map>> formDefns = null; + private Map>>> formDefns = null; /** * Reference to the value-pairs map, computed from the forms definition file @@ -87,6 +87,8 @@ public class DCInputsReader { */ private DCInputSet lastInputSet = null; + private Map> mappedValuePairs = new HashMap>(); + /** * Parse an XML encoded submission forms template file, and create a hashmap * containing all the form information. This hashmap will contain three top @@ -115,7 +117,7 @@ public class DCInputsReader { private void buildInputs(String fileName) throws DCInputsReaderException { - formDefns = new HashMap>>(); + formDefns = new HashMap>>>(); valuePairs = new HashMap>(); String uri = "file:" + new File(fileName).getAbsolutePath(); @@ -212,7 +214,7 @@ public class DCInputsReader { return lastInputSet; } // cache miss - construct new DCInputSet - List> pages = formDefns.get(formName); + List>> pages = formDefns.get(formName); if (pages == null) { throw new DCInputsReaderException("Missing the " + formName + " form"); } @@ -292,8 +294,8 @@ public class DCInputsReader { /** * Process the form-definitions section of the XML file. Each element is - * formed thusly:

...pages...
Each pages - * subsection is formed: ...fields... Each field + * formed thusly:
...row...
Each rows + * subsection is formed: ...fields... Each field * is formed from: dc-element, dc-qualifier, label, hint, input-type name, * required text, and repeatable flag. */ @@ -311,26 +313,24 @@ public class DCInputsReader { if (formName == null) { throw new SAXException("form element has no name attribute"); } - List> fields = new ArrayList>(); // the form contains fields - formDefns.put(formName, fields); + List>> rows = new ArrayList>>(); // the form + // contains rows of fields + formDefns.put(formName, rows); NodeList pl = nd.getChildNodes(); int lenpg = pl.getLength(); for (int j = 0; j < lenpg; j++) { Node npg = pl.item(j); - - if (npg.getNodeName().equals("field")) { - // process each field definition - Map field = new HashMap(); - processField(formName, npg, field); - fields.add(field); - // we omit the duplicate validation, allowing multiple - // fields definition for - // the same metadata and different visibility/type-bind + if (npg.getNodeName().equals("row")) { + List> fields = new ArrayList>(); // the fields in the + // row + // process each row definition + processRow(formName, j, npg, fields); + rows.add(fields); } } // sanity check number of fields - if (fields.size() < 1) { - throw new DCInputsReaderException("Form " + formName + " has no fields"); + if (rows.size() < 1) { + throw new DCInputsReaderException("Form " + formName + " has no rows"); } } } @@ -339,6 +339,64 @@ public class DCInputsReader { } } + /** + * Process parts of a row + */ + private void processRow(String formName, int rowIdx, Node n, List> fields) + throws SAXException, DCInputsReaderException { + + NodeList pl = n.getChildNodes(); + int lenpg = pl.getLength(); + for (int j = 0; j < lenpg; j++) { + Node npg = pl.item(j); + + if (npg.getNodeName().equals("field")) { + // process each field definition + Map field = new HashMap(); + processField(formName, npg, field); + fields.add(field); + String key = field.get(PAIR_TYPE_NAME); + if (StringUtils + .isNotBlank(key)) { + String schema = field.get("dc-schema"); + String element = field.get("dc-element"); + String qualifier = field + .get("dc-qualifier"); + String metadataField = schema + "." + + element; + if (StringUtils.isNotBlank(qualifier)) { + metadataField += "." + qualifier; + } + + if (mappedValuePairs.containsKey( + key)) { + if (!mappedValuePairs + .get(key).contains(metadataField)) { + mappedValuePairs + .get(key).add(metadataField); + } + + } else { + List newval = new ArrayList(); + newval.add(metadataField); + mappedValuePairs.put( + key, + newval); + } + } + + // we omit the duplicate validation, allowing multiple + // fields definition for + // the same metadata and different visibility/type-bind + } + } + // sanity check number of fields + if (fields.size() < 1) { + throw new DCInputsReaderException("Form " + formName + "row " + rowIdx + " has no fields"); + } + } + + /** * Process parts of a field * At the end, make sure that input-types 'qualdrop_value' and @@ -537,26 +595,29 @@ public class DCInputsReader { Iterator ki = formDefns.keySet().iterator(); while (ki.hasNext()) { String idName = ki.next(); - List> fields = formDefns.get(idName); - for (int i = 0; i < fields.size(); i++) { - Map fld = fields.get(i); - // verify reference in certain input types - String type = fld.get("input-type"); - if (type.equals("dropdown") - || type.equals("qualdrop_value") - || type.equals("list")) { - String pairsName = fld.get(PAIR_TYPE_NAME); - List v = valuePairs.get(pairsName); - if (v == null) { - String errString = "Cannot find value pairs for " + pairsName; - throw new DCInputsReaderException(errString); + List>> rows = formDefns.get(idName); + for (int j = 0; j < rows.size(); j++) { + List> fields = rows.get(j); + for (int i = 0; i < fields.size(); i++) { + Map fld = fields.get(i); + // verify reference in certain input types + String type = fld.get("input-type"); + if (type.equals("dropdown") + || type.equals("qualdrop_value") + || type.equals("list")) { + String pairsName = fld.get(PAIR_TYPE_NAME); + List v = valuePairs.get(pairsName); + if (v == null) { + String errString = "Cannot find value pairs for " + pairsName; + throw new DCInputsReaderException(errString); + } } - } - // we omit the "required" and "visibility" validation, provided this must be checked in the - // processing class - // only when it makes sense (if the field isn't visible means that it is not applicable, therefore it - // can't be required) + // we omit the "required" and "visibility" validation, provided this must be checked in the + // processing class + // only when it makes sense (if the field isn't visible means that it is not applicable, + // therefore it can't be required) + } } } } @@ -639,4 +700,8 @@ public class DCInputsReader { } throw new DCInputsReaderException("No field configuration found!"); } + + public Map> getMappedValuePairs() { + return mappedValuePairs; + } } diff --git a/dspace-api/src/main/java/org/dspace/app/util/Util.java b/dspace-api/src/main/java/org/dspace/app/util/Util.java index edfc782092..b3b6049b00 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/Util.java +++ b/dspace-api/src/main/java/org/dspace/app/util/Util.java @@ -418,11 +418,12 @@ public class Util { List inputSets = inputsReader.getInputsByCollectionHandle(col_handle); + // Replace the values of Metadatum[] with the correct ones in case + // of + // controlled vocabularies + String currentField = Utils.standardize(schema, element, qualifier, "."); + for (DCInputSet inputSet : inputSets) { - // Replace the values of Metadatum[] with the correct ones in case - // of - // controlled vocabularies - String currentField = Utils.standardize(schema, element, qualifier, "."); if (inputSet != null) { @@ -430,19 +431,20 @@ public class Util { for (int p = 0; p < fieldsNums; p++) { - DCInput[] inputs = inputSet.getFields(); + DCInput[][] inputs = inputSet.getFields(); if (inputs != null) { for (int i = 0; i < inputs.length; i++) { - String inputField = Utils.standardize(inputs[i].getSchema(), inputs[i].getElement(), - inputs[i].getQualifier(), "."); - if (currentField.equals(inputField)) { - - myInputs = inputs[i]; - myInputsFound = true; - break; - + for (int j = 0; j < inputs[i].length; j++) { + String inputField = Utils + .standardize(inputs[i][j].getSchema(), inputs[i][j].getElement(), + inputs[i][j].getQualifier(), "."); + if (currentField.equals(inputField)) { + myInputs = inputs[i][j]; + myInputsFound = true; + break; + } } } } @@ -480,13 +482,17 @@ public class Util { Set fromFieldName = new HashSet<>(); Set toFieldName = new HashSet<>(); for (DCInputSet ff : from) { - for (DCInput fdc : ff.getFields()) { - fromFieldName.add(fdc.getFieldName()); + for (DCInput[] fdcrow : ff.getFields()) { + for (DCInput fdc : fdcrow) { + fromFieldName.add(fdc.getFieldName()); + } } } for (DCInputSet tt : to) { - for (DCInput tdc : tt.getFields()) { - toFieldName.add(tdc.getFieldName()); + for (DCInput[] tdcrow : tt.getFields()) { + for (DCInput tdc : tdcrow) { + toFieldName.add(tdc.getFieldName()); + } } } diff --git a/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java index e90e93e864..94d5696f5e 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java @@ -264,39 +264,42 @@ public final class ChoiceAuthorityServiceImpl implements ChoiceAuthorityService try { DCInputsReader dcInputsReader = new DCInputsReader(); for (DCInputSet dcinputSet : dcInputsReader.getAllInputs(Integer.MAX_VALUE, 0)) { - DCInput[] dcinputs = dcinputSet.getFields(); - for (DCInput dcinput : dcinputs) { - if (StringUtils.isNotBlank(dcinput.getPairsType()) - || StringUtils.isNotBlank(dcinput.getVocabulary())) { - String authorityName = dcinput.getPairsType(); - if (StringUtils.isBlank(authorityName)) { - authorityName = dcinput.getVocabulary(); - } - if (!StringUtils.equals(dcinput.getInputType(), "qualdrop_value")) { - String fieldKey = makeFieldKey(dcinput.getSchema(), dcinput.getElement(), - dcinput.getQualifier()); - ChoiceAuthority ca = controller.get(authorityName); - if (ca == null) { - InputFormSelfRegisterWrapperAuthority ifa = new InputFormSelfRegisterWrapperAuthority(); - if (controller.containsKey(fieldKey)) { - ifa = (InputFormSelfRegisterWrapperAuthority) controller.get(fieldKey); + DCInput[][] dcinputs = dcinputSet.getFields(); + for (DCInput[] dcrows : dcinputs) { + for (DCInput dcinput : dcrows) { + if (StringUtils.isNotBlank(dcinput.getPairsType()) + || StringUtils.isNotBlank(dcinput.getVocabulary())) { + String authorityName = dcinput.getPairsType(); + if (StringUtils.isBlank(authorityName)) { + authorityName = dcinput.getVocabulary(); + } + if (!StringUtils.equals(dcinput.getInputType(), "qualdrop_value")) { + String fieldKey = makeFieldKey(dcinput.getSchema(), dcinput.getElement(), + dcinput.getQualifier()); + ChoiceAuthority ca = controller.get(authorityName); + if (ca == null) { + InputFormSelfRegisterWrapperAuthority ifa = new + InputFormSelfRegisterWrapperAuthority(); + if (controller.containsKey(fieldKey)) { + ifa = (InputFormSelfRegisterWrapperAuthority) controller.get(fieldKey); + } + + ChoiceAuthority ma = (ChoiceAuthority) pluginService + .getNamedPlugin(ChoiceAuthority.class, authorityName); + if (ma == null) { + log.warn("Skipping invalid configuration for " + fieldKey + + " because named plugin not found: " + authorityName); + continue; + } + ifa.getDelegates().put(dcinputSet.getFormName(), ma); + controller.put(fieldKey, ifa); } - ChoiceAuthority ma = (ChoiceAuthority) pluginService - .getNamedPlugin(ChoiceAuthority.class, authorityName); - if (ma == null) { - log.warn("Skipping invalid configuration for " + fieldKey - + " because named plugin not found: " + authorityName); - continue; + if (!authorities.containsKey(authorityName)) { + authorities.put(authorityName, fieldKey); } - ifa.getDelegates().put(dcinputSet.getFormName(), ma); - controller.put(fieldKey, ifa); - } - if (!authorities.containsKey(authorityName)) { - authorities.put(authorityName, fieldKey); } - } } } diff --git a/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java index 5ad3e91a16..dc9797598f 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java @@ -235,21 +235,23 @@ public class MetadataAuthorityServiceImpl implements MetadataAuthorityService { try { DCInputsReader dcInputsReader = new DCInputsReader(); for (DCInputSet dcinputSet : dcInputsReader.getAllInputs(Integer.MAX_VALUE, 0)) { - DCInput[] dcinputs = dcinputSet.getFields(); - for (DCInput dcinput : dcinputs) { - if (StringUtils.isNotBlank(dcinput.getPairsType()) - || StringUtils.isNotBlank(dcinput.getVocabulary())) { - String authorityName = dcinput.getPairsType(); - if (StringUtils.isBlank(authorityName)) { - authorityName = dcinput.getVocabulary(); - } - if (!StringUtils.equals(dcinput.getInputType(), "qualdrop_value")) { - String fieldKey = makeFieldKey(dcinput.getSchema(), dcinput.getElement(), - dcinput.getQualifier()); - boolean req = ConfigurationManager - .getBooleanProperty("authority.required." + fieldKey, false); - controlled.put(fieldKey, true); - isAuthorityRequired.put(fieldKey, req); + DCInput[][] dcinputs = dcinputSet.getFields(); + for (DCInput[] dcrows : dcinputs) { + for (DCInput dcinput : dcrows) { + if (StringUtils.isNotBlank(dcinput.getPairsType()) + || StringUtils.isNotBlank(dcinput.getVocabulary())) { + String authorityName = dcinput.getPairsType(); + if (StringUtils.isBlank(authorityName)) { + authorityName = dcinput.getVocabulary(); + } + if (!StringUtils.equals(dcinput.getInputType(), "qualdrop_value")) { + String fieldKey = makeFieldKey(dcinput.getSchema(), dcinput.getElement(), + dcinput.getQualifier()); + boolean req = ConfigurationManager + .getBooleanProperty("authority.required." + fieldKey, false); + controlled.put(fieldKey, true); + isAuthorityRequired.put(fieldKey, req); + } } } } diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/RequiredMetadata.java b/dspace-api/src/main/java/org/dspace/ctask/general/RequiredMetadata.java index fa387a59c4..07bfed5fe5 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/RequiredMetadata.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/RequiredMetadata.java @@ -100,17 +100,19 @@ public class RequiredMetadata extends AbstractCurationTask { reqList = new ArrayList(); List inputSet = reader.getInputsByCollectionHandle(handle); for (DCInputSet inputs : inputSet) { - for (DCInput input : inputs.getFields()) { - if (input.isRequired()) { - StringBuilder sb = new StringBuilder(); - sb.append(input.getSchema()).append("."); - sb.append(input.getElement()).append("."); - String qual = input.getQualifier(); - if (qual == null) { - qual = ""; + for (DCInput[] row : inputs.getFields()) { + for (DCInput input : row) { + if (input.isRequired()) { + StringBuilder sb = new StringBuilder(); + sb.append(input.getSchema()).append("."); + sb.append(input.getElement()).append("."); + String qual = input.getQualifier(); + if (qual == null) { + qual = ""; + } + sb.append(qual); + reqList.add(sb.toString()); } - sb.append(qual); - reqList.add(sb.toString()); } } reqMap.put(inputs.getFormName(), reqList); diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java index aab93ef6a5..13d57a303d 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java @@ -275,13 +275,15 @@ public class DSpaceWorkspaceItemOutputGenerator implements OutputGenerator { String qualifier) throws DCInputsReaderException { List dcinputsets = new DCInputsReader().getInputsBySubmissionName(formName); for (DCInputSet dcinputset : dcinputsets) { - for (DCInput dcinput : dcinputset.getFields()) { - if (dcinput.getSchema().equals(schema) - && dcinput.getElement().equals(element) - && ((dcinput.getQualifier() != null && dcinput - .getQualifier().equals(qualifier)) - || (dcinput.getQualifier() == null && qualifier == null))) { - return dcinput; + for (DCInput[] dcrow : dcinputset.getFields()) { + for (DCInput dcinput : dcrow) { + if (dcinput.getSchema().equals(schema) + && dcinput.getElement().equals(element) + && ((dcinput.getQualifier() != null && dcinput + .getQualifier().equals(qualifier)) + || (dcinput.getQualifier() == null && qualifier == null))) { + return dcinput; + } } } } diff --git a/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml b/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml index 3467ef2ec7..10e9578c88 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml +++ b/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml @@ -4,402 +4,416 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - -
- - dc - title - - false - - onebox - Enter the name of the file. - You must enter a main title for this item. - + + + + + dc + title + + false + + onebox + Enter the name of the file. + You must enter a main title for this item. + + + + + dc + description + true + + textarea + Enter a description for the file + + + + + +
+ + + dc + contributor + author + true + + name + Enter the names of the authors of this item. + + + + + + dc + title + + false + + onebox + Enter the main title of the item. + You must enter a main title for this item. + + + + + + dc + title + alternative + true + + onebox + If the item has any alternative titles, please enter them here. + + + + + + dc + date + issued + false + + + date + Please give the date of previous publication or public distribution. + You can leave out the day and/or month if they aren't + applicable. + You must enter at least the year. + - - dc - description - true - - textarea - Enter a description for the file - - - + + dc + publisher + + false + + + onebox + Enter the name of the publisher of the previously issued instance of this item. + + +
+ + + dc + identifier + citation + false + + onebox + Enter the standard citation for the previously issued instance of this item. + + + + + + dc + relation + ispartofseries + true + + series + Enter the series and number assigned to this item by your community. + + + + + + dc + identifier + + + true + + qualdrop_value + If the item has any identification numbers or codes associated with +it, please enter the types and the actual numbers or codes. + + + + + + dc + type + + true + + dropdown + Select the type(s) of content of the item. To select more than one value in the list, you may have to hold down the "CTRL" or "Shift" key. + + + + + + dc + language + iso + false + + dropdown + Select the language of the main content of the item. If the language does not appear in the list, please select 'Other'. If the content does not really have a language (for example, if it is a dataset or an image) please select 'N/A'. + + + + + +
+ + + dc + subject + + + true + + twobox + Enter appropriate subject keywords or phrases. + + srsc + + + + + dc + description + abstract + false + + textarea + Enter the abstract of the item. + + + + + + dc + description + sponsorship + false + + textarea + Enter the names of any sponsors and/or funding codes in the box. + + + + + + dc + description + + false + + textarea + Enter any other description or comments in this box. + + + +
-
- - dc - contributor - author - true - - name - Enter the names of the authors of this item. - - - - - dc - title - - false - - onebox - Enter the main title of the item. - You must enter a main title for this item. - - - - dc - title - alternative - true - - onebox - If the item has any alternative titles, please enter them here. - - - - - dc - date - issued - false - - date - Please give the date of previous publication or public distribution. - You can leave out the day and/or month if they aren't - applicable. - - You must enter at least the year. - - - - dc - publisher - - false - - onebox - Enter the name of the publisher of the previously issued instance of this item. - - - - - dc - identifier - citation - false - - onebox - Enter the standard citation for the previously issued instance of this item. - - - - - dc - relation - ispartofseries - true - - series - Enter the series and number assigned to this item by your community. - - - - - dc - identifier - - - true - - qualdrop_value - If the item has any identification numbers or codes associated with - it, please enter the types and the actual numbers or codes. - - - - - - dc - type - - true - - dropdown - Select the type(s) of content of the item. To select more than one value in the list, you may have - to hold down the "CTRL" or "Shift" key. - - - - - - dc - language - iso - false - - dropdown - Select the language of the main content of the item. If the language does not appear in the list, - please select 'Other'. If the content does not really have a language (for example, if it is a - dataset or an image) please select 'N/A'. - - - -
- -
- - dc - subject - - - true - - twobox - Enter appropriate subject keywords or phrases. - - srsc - - - - dc - description - abstract - false - - textarea - Enter the abstract of the item. - - - - - dc - description - sponsorship - false - - textarea - Enter the names of any sponsors and/or funding codes in the box. - - - - - dc - description - - false - - textarea - Enter any other description or comments in this box. - - -
- -
+
- - - - - - - - - - - - + + + + + + + + + + + + - - - - ISSN - issn - - - Other - other - - - ISMN - ismn - - - Gov't Doc # - govdoc - - - URI - uri - - - ISBN - isbn - - + + + + ISSN + issn + + + Other + other + + + ISMN + ismn + + + Gov't Doc # + govdoc + + + URI + uri + + + ISBN + isbn + + - - - Animation - Animation - - - Article - Article - - - Book - Book - - - Book chapter - Book chapter - - - Dataset - Dataset - - - Learning Object - Learning Object - - - Image - Image - - - Image, 3-D - Image, 3-D - - - Map - Map - - - Musical Score - Musical Score - - - Plan or blueprint - Plan or blueprint - - - Preprint - Preprint - - - Presentation - Presentation - - - Recording, acoustical - Recording, acoustical - - - Recording, musical - Recording, musical - - - Recording, oral - Recording, oral - - - Software - Software - - - Technical Report - Technical Report - - - Thesis - Thesis - - - Video - Video - - - Working Paper - Working Paper - - - Other - Other - - + + + Animation + Animation + + + Article + Article + + + Book + Book + + + Book chapter + Book chapter + + + Dataset + Dataset + + + Learning Object + Learning Object + + + Image + Image + + + Image, 3-D + Image, 3-D + + + Map + Map + + + Musical Score + Musical Score + + + Plan or blueprint + Plan or blueprint + + + Preprint + Preprint + + + Presentation + Presentation + + + Recording, acoustical + Recording, acoustical + + + Recording, musical + Recording, musical + + + Recording, oral + Recording, oral + + + Software + Software + + + Technical Report + Technical Report + + + Thesis + Thesis + + + Video + Video + + + Working Paper + Working Paper + + + Other + Other + + - - - - N/A - - - - English (United States) - en_US - - - English - en - - - Spanish - es - - - German - de - - - French - fr - - - Italian - it - - - Japanese - ja - - - Chinese - zh - - - Turkish - tr - - - (Other) - other - - + + + + N/A + + + + English (United States) + en_US + + + English + en + + + Spanish + es + + + German + de + + + French + fr + + + Italian + it + + + Japanese + ja + + + Chinese + zh + + + Turkish + tr + + + (Other) + other + + - +
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionFormConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionFormConverter.java index 9dde977064..c9ec1268b2 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionFormConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionFormConverter.java @@ -17,8 +17,10 @@ import org.dspace.app.rest.model.ScopeEnum; import org.dspace.app.rest.model.SubmissionFormFieldRest; import org.dspace.app.rest.model.SubmissionFormInputTypeRest; import org.dspace.app.rest.model.SubmissionFormRest; +import org.dspace.app.rest.model.SubmissionFormRowRest; import org.dspace.app.rest.model.SubmissionVisibilityRest; import org.dspace.app.rest.model.VisibilityEnum; +import org.dspace.app.rest.repository.SubmissionFormRestRepository; import org.dspace.app.rest.utils.AuthorityUtils; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; @@ -44,25 +46,35 @@ public class SubmissionFormConverter extends DSpaceConverter fields = getPage(step); - sd.setFields(fields); + DCInput[][] step = obj.getFields(); + List rows = getPage(step, obj.getFormName()); + sd.setRows(rows); return sd; } - private List getPage(DCInput[] page) { - List fields = new LinkedList(); - for (DCInput dcinput : page) { - fields.add(getField(dcinput)); + private List getPage(DCInput[][] page, String formName) { + List rows = new LinkedList(); + + for (DCInput[] row : page) { + List fields = new LinkedList(); + SubmissionFormRowRest rowRest = new SubmissionFormRowRest(); + rowRest.setFields(fields); + rows.add(rowRest); + for (DCInput dcinput : row) { + fields.add(getField(dcinput, formName)); + } } - return fields; + return rows; } - private SubmissionFormFieldRest getField(DCInput dcinput) { + private SubmissionFormFieldRest getField(DCInput dcinput, String formName) { SubmissionFormFieldRest inputField = new SubmissionFormFieldRest(); List selectableMetadata = new ArrayList(); @@ -99,17 +111,16 @@ public class SubmissionFormConverter extends DSpaceConverter { private String name; - private List fields; + private List rows; @Override public String getId() { @@ -53,11 +53,11 @@ public class SubmissionFormRest extends BaseObjectRest { return CATEGORY; } - public List getFields() { - return fields; + public List getRows() { + return rows; } - public void setFields(List fields) { - this.fields = fields; + public void setRows(List rows) { + this.rows = rows; } -} \ No newline at end of file +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java new file mode 100644 index 0000000000..49062270a9 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java @@ -0,0 +1,30 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ + +package org.dspace.app.rest.model; + +import java.util.List; + +/** + * The InputFormRow REST Resource. It is not addressable directly, only used + * as inline object in the InputForm resource + * + * @author Andrea Bollini (andrea.bollini at 4science.it) + */ +public class SubmissionFormRowRest { + private List fields; + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } +} + diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java index 9a6864f8d0..313d6b64d9 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java @@ -23,6 +23,7 @@ import org.dspace.app.util.DCInputSet; import org.dspace.app.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; import org.dspace.app.util.SubmissionStepConfig; +import org.dspace.content.InProgressSubmission; import org.dspace.content.MetadataValue; import org.dspace.content.WorkspaceItem; import org.dspace.core.Context; @@ -49,7 +50,17 @@ public class DescribeStep extends org.dspace.submit.step.DescribeStep implements DataDescribe data = new DataDescribe(); try { DCInputSet inputConfig = inputReader.getInputsByFormName(config.getId()); - for (DCInput input : inputConfig.getFields()) { + readField(obj, config, data, inputConfig); + } catch (DCInputsReaderException e) { + log.error(e.getMessage(), e); + } + return data; + } + + private void readField(InProgressSubmission obj, SubmissionStepConfig config, DataDescribe data, + DCInputSet inputConfig) throws DCInputsReaderException { + for (DCInput[] row : inputConfig.getFields()) { + for (DCInput input : row) { List fieldsName = new ArrayList(); if (input.isQualdropValue()) { @@ -93,10 +104,7 @@ public class DescribeStep extends org.dspace.submit.step.DescribeStep implements } } } - } catch (DCInputsReaderException e) { - log.error(e.getMessage(), e); } - return data; } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/MetadataValidation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/MetadataValidation.java index ce13677e83..53581361ac 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/MetadataValidation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/MetadataValidation.java @@ -55,43 +55,46 @@ public class MetadataValidation extends AbstractValidation { SubmissionStepConfig config) throws DCInputsReaderException, SQLException { DCInputSet inputConfig = getInputReader().getInputsByFormName(config.getId()); - for (DCInput input : inputConfig.getFields()) { + for (DCInput[] row : inputConfig.getFields()) { + for (DCInput input : row) { + String fieldKey = + metadataAuthorityService.makeFieldKey(input.getSchema(), input.getElement(), input.getQualifier()); + boolean isAuthorityControlled = metadataAuthorityService.isAuthorityControlled(fieldKey); - String fieldKey = metadataAuthorityService.makeFieldKey(input.getSchema(), input.getElement(), - input.getQualifier()); - boolean isAuthorityControlled = metadataAuthorityService.isAuthorityControlled(fieldKey); - - List fieldsName = new ArrayList(); - if (input.isQualdropValue()) { - for (Object qualifier : input.getPairs()) { - fieldsName.add(input.getFieldName() + "." + (String) qualifier); - } - } else { - fieldsName.add(input.getFieldName()); - } - - for (String fieldName : fieldsName) { - List mdv = itemService.getMetadataByMetadataString(obj.getItem(), fieldName); - for (MetadataValue md : mdv) { - if (!(input.validate(md.getValue()))) { - addError(ERROR_VALIDATION_REGEX, "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" - + config.getId() + "/" + input.getFieldName() + "/" + md.getPlace()); + List fieldsName = new ArrayList(); + if (input.isQualdropValue()) { + for (Object qualifier : input.getPairs()) { + fieldsName.add(input.getFieldName() + "." + (String) qualifier); } - if (isAuthorityControlled) { - String authKey = md.getAuthority(); - if (metadataAuthorityService.isAuthorityRequired(fieldKey) && StringUtils.isNotBlank(authKey)) { - addError(ERROR_VALIDATION_AUTHORITY_REQUIRED, - "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + config.getId() - + "/" + input.getFieldName() + "/" + md.getPlace()); + } else { + fieldsName.add(input.getFieldName()); + } + + for (String fieldName : fieldsName) { + List mdv = itemService.getMetadataByMetadataString(obj.getItem(), fieldName); + for (MetadataValue md : mdv) { + if (!(input.validate(md.getValue()))) { + addError(ERROR_VALIDATION_REGEX, + "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + config.getId() + "/" + + input.getFieldName() + "/" + md.getPlace()); + } + if (isAuthorityControlled) { + String authKey = md.getAuthority(); + if (metadataAuthorityService.isAuthorityRequired(fieldKey) && + StringUtils.isNotBlank(authKey)) { + addError(ERROR_VALIDATION_AUTHORITY_REQUIRED, + "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + config.getId() + + "/" + input.getFieldName() + "/" + md.getPlace()); + } } } - } - - if ((input.isRequired() && mdv.size() == 0) && input.isVisible(DCInput.SUBMISSION_SCOPE)) { - // since this field is missing add to list of error - // fields - addError(ERROR_VALIDATION_REQUIRED, "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" - + config.getId() + "/" + input.getFieldName()); + if ((input.isRequired() && mdv.size() == 0) && input.isVisible(DCInput.SUBMISSION_SCOPE)) { + // since this field is missing add to list of error + // fields + addError(ERROR_VALIDATION_REQUIRED, + "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + config.getId() + "/" + + input.getFieldName()); + } } } } diff --git a/dspace/config/submission-forms.dtd b/dspace/config/submission-forms.dtd index 27509aad71..7c94d133aa 100644 --- a/dspace/config/submission-forms.dtd +++ b/dspace/config/submission-forms.dtd @@ -4,10 +4,11 @@ - + + - + @@ -16,6 +17,7 @@ + diff --git a/dspace/config/submission-forms.xml b/dspace/config/submission-forms.xml index 9c3bc4c801..10e9578c88 100644 --- a/dspace/config/submission-forms.xml +++ b/dspace/config/submission-forms.xml @@ -21,30 +21,34 @@ -
- - dc - title - - false - - onebox - Enter the name of the file. - You must enter a main title for this file. - - - - dc - description - true - - textarea - Enter a description for the file - - -
+
+ + + dc + title + + false + + onebox + Enter the name of the file. + You must enter a main title for this item. + + + + + dc + description + true + + textarea + Enter a description for the file + + + +
+ dc contributor @@ -55,7 +59,8 @@ Enter the names of the authors of this item. - + + dc title @@ -65,8 +70,10 @@ onebox Enter the main title of the item. You must enter a main title for this item. + - + + dc title @@ -77,13 +84,15 @@ If the item has any alternative titles, please enter them here. - + + dc date issued false + date Please give the date of previous publication or public distribution. You can leave out the day and/or month if they aren't @@ -97,11 +106,13 @@ false + onebox Enter the name of the publisher of the previously issued instance of this item. - + + dc identifier @@ -112,7 +123,8 @@ Enter the standard citation for the previously issued instance of this item. - + + dc relation @@ -123,7 +135,8 @@ Enter the series and number assigned to this item by your community. - + + dc identifier @@ -136,7 +149,8 @@ it, please enter the types and the actual numbers or codes. - + + dc type @@ -147,7 +161,8 @@ it, please enter the types and the actual numbers or codes. Select the type(s) of content of the item. To select more than one value in the list, you may have to hold down the "CTRL" or "Shift" key. - + + dc language @@ -158,9 +173,11 @@ it, please enter the types and the actual numbers or codes. Select the language of the main content of the item. If the language does not appear in the list, please select 'Other'. If the content does not really have a language (for example, if it is a dataset or an image) please select 'N/A'. +
+ dc subject @@ -173,7 +190,8 @@ it, please enter the types and the actual numbers or codes. srsc - + + dc description @@ -184,7 +202,8 @@ it, please enter the types and the actual numbers or codes. Enter the abstract of the item. - + + dc description @@ -195,7 +214,8 @@ it, please enter the types and the actual numbers or codes. Enter the names of any sponsors and/or funding codes in the box. - + + dc description @@ -206,6 +226,7 @@ it, please enter the types and the actual numbers or codes. Enter any other description or comments in this box. +
From 4f530753178594001f00aab2a711b59a243faeb4 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Mon, 17 Sep 2018 15:10:33 +0200 Subject: [PATCH 045/193] ImageMagick: Only execute "identify" on first page The Info object used to get the color format runs "identify" on the supplied input file. If the file has many pages, this process might require some time. "identify" supports the same syntax for the input file like the other ImageMagick tools and we can simply restrict the pages by changing the input file name. This fixes DS-3664. --- .../org/dspace/app/mediafilter/ImageMagickThumbnailFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/ImageMagickThumbnailFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/ImageMagickThumbnailFilter.java index 58bae2e22b..27413544b9 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/ImageMagickThumbnailFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/ImageMagickThumbnailFilter.java @@ -143,7 +143,7 @@ public abstract class ImageMagickThumbnailFilter extends MediaFilter { // PDFs using the CMYK color system can be handled specially if // profiles are defined if (cmyk_profile != null && srgb_profile != null) { - Info imageInfo = new Info(f.getAbsolutePath(), true); + Info imageInfo = new Info(f.getAbsolutePath() + s, true); String imageClass = imageInfo.getImageClass(); if (imageClass.contains("CMYK")) { op.profile(cmyk_profile); From b3abd7743c1c6eb67844bc1f14dd8ad9110dd440 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Mon, 17 Sep 2018 15:58:11 +0200 Subject: [PATCH 046/193] [DS-4010] Removed the escaping on the query parameter for the discover endpoint --- .../java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java index 3de1ad2e53..28d15c5844 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java @@ -183,7 +183,7 @@ public class DiscoverQueryBuilder implements InitializingBean { if (StringUtils.isNotBlank(query)) { //Note that these quotes are needed incase we try to query OR for example. //If the quotes aren't present, it'll crash. - queryArgs.setQuery("\"" + searchService.escapeQueryChars(query) + "\""); + queryArgs.setQuery(query); } //Limit results to DSO type From a73b98095584c32388a4cfd8fe23cb454ab314a8 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Mon, 17 Sep 2018 16:50:01 +0200 Subject: [PATCH 047/193] [DS-4010] removed the comments that don't represent the code anymore --- .../java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java index 28d15c5844..6d82c8cc39 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java @@ -181,8 +181,6 @@ public class DiscoverQueryBuilder implements InitializingBean { //Set search query if (StringUtils.isNotBlank(query)) { - //Note that these quotes are needed incase we try to query OR for example. - //If the quotes aren't present, it'll crash. queryArgs.setQuery(query); } From 26a55312b3744c1e175668b2694cc6649e4757ac Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Tue, 18 Sep 2018 08:49:38 +0200 Subject: [PATCH 048/193] [DS-4010] Fixed the tests --- .../org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java index bfc846fa74..75a22bf141 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java @@ -168,7 +168,7 @@ public class DiscoverQueryBuilderTest { Arrays.asList(searchFilter), "item", page); assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true", "subject:\"Java\"")); - assertThat(discoverQuery.getQuery(), is("\"" + query + "\"")); + assertThat(discoverQuery.getQuery(), is(query)); assertThat(discoverQuery.getDSpaceObjectFilter(), is(Constants.ITEM)); assertThat(discoverQuery.getSortField(), is("dc.title_sort")); assertThat(discoverQuery.getSortOrder(), is(DiscoverQuery.SORT_ORDER.asc)); @@ -293,7 +293,7 @@ public class DiscoverQueryBuilderTest { "subject"); assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true", "subject:\"Java\"")); - assertThat(discoverQuery.getQuery(), is("\"" + query + "\"")); + assertThat(discoverQuery.getQuery(), is(query)); assertThat(discoverQuery.getDSpaceObjectFilter(), is(Constants.ITEM)); assertThat(discoverQuery.getSortField(), isEmptyOrNullString()); assertThat(discoverQuery.getMaxResults(), is(0)); From aa4f3bb60b8e910b0587ef6af20831d78dc029c5 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Wed, 19 Sep 2018 10:56:19 +0200 Subject: [PATCH 049/193] [Task 55655] set the status to Bad Request if the query entered wasn't valid and the searchservice threw an exception --- .../org/dspace/app/rest/DiscoveryRestController.java | 12 ++++++++++-- .../app/rest/repository/DiscoveryRestRepository.java | 5 ++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index 85c7a1e098..041768f29e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -10,6 +10,7 @@ package org.dspace.app.rest; import java.util.Arrays; import java.util.List; import java.util.Objects; +import javax.ws.rs.BadRequestException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -34,6 +35,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.Link; import org.springframework.hateoas.ResourceSupport; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -142,8 +145,13 @@ public class DiscoveryRestController implements InitializingBean { } //Get the Search results in JSON format - SearchResultsRest searchResultsRest = discoveryRestRepository - .getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page); + SearchResultsRest searchResultsRest = null; + try { + searchResultsRest = discoveryRestRepository + .getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page); + } catch (BadRequestException badRequestException) { + new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } //Convert the Search JSON results to paginated HAL resources SearchResultsResource searchResultsResource = new SearchResultsResource(searchResultsRest, utils, page); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index 4ccfc51ae6..50880e98d8 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -9,6 +9,8 @@ package org.dspace.app.rest.repository; import java.util.List; +import javax.ws.rs.BadRequestException; + import org.apache.log4j.Logger; import org.dspace.app.rest.converter.DiscoverConfigurationConverter; import org.dspace.app.rest.converter.DiscoverFacetConfigurationConverter; @@ -91,7 +93,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { public SearchResultsRest getSearchObjects(final String query, final String dsoType, final String dsoScope, final String configurationName, final List searchFilters, final Pageable page) - throws InvalidRequestException { + throws InvalidRequestException, BadRequestException { Context context = obtainContext(); DSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope); @@ -108,6 +110,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { } catch (SearchServiceException e) { log.error("Error while searching with Discovery", e); + throw new BadRequestException(); } return discoverResultConverter From b192552888518fd955b99f791229ad3da889e572 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Fri, 21 Sep 2018 14:07:01 +0200 Subject: [PATCH 050/193] [DS-4010] added a catch for the search error and throw illegalarguement instead so that the exception handling picks it up easily and returns a proper error response with headers included --- .../org/dspace/app/rest/DiscoveryRestController.java | 11 ++--------- .../exception/DSpaceApiExceptionControllerAdvice.java | 8 ++++++++ .../app/rest/repository/DiscoveryRestRepository.java | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index 041768f29e..227f3edfee 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -10,7 +10,6 @@ package org.dspace.app.rest; import java.util.Arrays; import java.util.List; import java.util.Objects; -import javax.ws.rs.BadRequestException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -35,8 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.Link; import org.springframework.hateoas.ResourceSupport; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -146,12 +143,8 @@ public class DiscoveryRestController implements InitializingBean { //Get the Search results in JSON format SearchResultsRest searchResultsRest = null; - try { - searchResultsRest = discoveryRestRepository - .getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page); - } catch (BadRequestException badRequestException) { - new ResponseEntity<>(HttpStatus.BAD_REQUEST); - } + searchResultsRest = discoveryRestRepository + .getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page); //Convert the Search JSON results to paginated HAL resources SearchResultsResource searchResultsResource = new SearchResultsResource(searchResultsRest, utils, page); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java index 161c0cf403..2dcc620942 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java @@ -20,6 +20,7 @@ import org.dspace.authorize.AuthorizeException; import org.springframework.beans.TypeMismatchException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.support.QueryMethodParameterConversionException; +import org.springframework.data.rest.webmvc.ResourceNotFoundException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -38,6 +39,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExcep */ @ControllerAdvice public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionHandler { + @Autowired private RestAuthenticationService restAuthenticationService; @@ -51,6 +53,12 @@ public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionH } } + @ExceptionHandler(IllegalArgumentException.class) + protected void handleIllegalArgumentException(HttpServletRequest request, HttpServletResponse response, + Exception ex) throws IOException { + sendErrorResponse(request, response, ex, ex.getMessage(), HttpServletResponse.SC_BAD_REQUEST); + } + @ExceptionHandler(SQLException.class) protected void handleSQLException(HttpServletRequest request, HttpServletResponse response, Exception ex) throws IOException { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index 50880e98d8..83707c06dc 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -110,7 +110,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { } catch (SearchServiceException e) { log.error("Error while searching with Discovery", e); - throw new BadRequestException(); + throw new IllegalArgumentException(); } return discoverResultConverter From ea42765849ff0ba1e9d7d1c45011ac53d4ee7c03 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Fri, 21 Sep 2018 14:38:55 +0200 Subject: [PATCH 051/193] Revert "[DS-4010] added a catch for the search error and throw illegalarguement instead so that the exception handling picks it up easily and returns a proper error response with headers included" This reverts commit b192552888518fd955b99f791229ad3da889e572. --- .../org/dspace/app/rest/DiscoveryRestController.java | 11 +++++++++-- .../exception/DSpaceApiExceptionControllerAdvice.java | 8 -------- .../app/rest/repository/DiscoveryRestRepository.java | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index 227f3edfee..041768f29e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -10,6 +10,7 @@ package org.dspace.app.rest; import java.util.Arrays; import java.util.List; import java.util.Objects; +import javax.ws.rs.BadRequestException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -34,6 +35,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.Link; import org.springframework.hateoas.ResourceSupport; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -143,8 +146,12 @@ public class DiscoveryRestController implements InitializingBean { //Get the Search results in JSON format SearchResultsRest searchResultsRest = null; - searchResultsRest = discoveryRestRepository - .getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page); + try { + searchResultsRest = discoveryRestRepository + .getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page); + } catch (BadRequestException badRequestException) { + new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } //Convert the Search JSON results to paginated HAL resources SearchResultsResource searchResultsResource = new SearchResultsResource(searchResultsRest, utils, page); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java index 2dcc620942..161c0cf403 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java @@ -20,7 +20,6 @@ import org.dspace.authorize.AuthorizeException; import org.springframework.beans.TypeMismatchException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.support.QueryMethodParameterConversionException; -import org.springframework.data.rest.webmvc.ResourceNotFoundException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -39,7 +38,6 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExcep */ @ControllerAdvice public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionHandler { - @Autowired private RestAuthenticationService restAuthenticationService; @@ -53,12 +51,6 @@ public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionH } } - @ExceptionHandler(IllegalArgumentException.class) - protected void handleIllegalArgumentException(HttpServletRequest request, HttpServletResponse response, - Exception ex) throws IOException { - sendErrorResponse(request, response, ex, ex.getMessage(), HttpServletResponse.SC_BAD_REQUEST); - } - @ExceptionHandler(SQLException.class) protected void handleSQLException(HttpServletRequest request, HttpServletResponse response, Exception ex) throws IOException { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index 83707c06dc..50880e98d8 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -110,7 +110,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { } catch (SearchServiceException e) { log.error("Error while searching with Discovery", e); - throw new IllegalArgumentException(); + throw new BadRequestException(); } return discoverResultConverter From df5816dff93c4ec26ba325e8d9eb8c384f7d7825 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Fri, 21 Sep 2018 15:25:24 +0200 Subject: [PATCH 052/193] Revert "Revert "[DS-4010] added a catch for the search error and throw illegalarguement instead so that the exception handling picks it up easily and returns a proper error response with headers included"" This reverts commit ea42765849ff0ba1e9d7d1c45011ac53d4ee7c03. --- .../org/dspace/app/rest/DiscoveryRestController.java | 11 ++--------- .../exception/DSpaceApiExceptionControllerAdvice.java | 8 ++++++++ .../app/rest/repository/DiscoveryRestRepository.java | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index 041768f29e..227f3edfee 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -10,7 +10,6 @@ package org.dspace.app.rest; import java.util.Arrays; import java.util.List; import java.util.Objects; -import javax.ws.rs.BadRequestException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -35,8 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.hateoas.Link; import org.springframework.hateoas.ResourceSupport; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -146,12 +143,8 @@ public class DiscoveryRestController implements InitializingBean { //Get the Search results in JSON format SearchResultsRest searchResultsRest = null; - try { - searchResultsRest = discoveryRestRepository - .getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page); - } catch (BadRequestException badRequestException) { - new ResponseEntity<>(HttpStatus.BAD_REQUEST); - } + searchResultsRest = discoveryRestRepository + .getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page); //Convert the Search JSON results to paginated HAL resources SearchResultsResource searchResultsResource = new SearchResultsResource(searchResultsRest, utils, page); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java index 161c0cf403..2dcc620942 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java @@ -20,6 +20,7 @@ import org.dspace.authorize.AuthorizeException; import org.springframework.beans.TypeMismatchException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.support.QueryMethodParameterConversionException; +import org.springframework.data.rest.webmvc.ResourceNotFoundException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -38,6 +39,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExcep */ @ControllerAdvice public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionHandler { + @Autowired private RestAuthenticationService restAuthenticationService; @@ -51,6 +53,12 @@ public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionH } } + @ExceptionHandler(IllegalArgumentException.class) + protected void handleIllegalArgumentException(HttpServletRequest request, HttpServletResponse response, + Exception ex) throws IOException { + sendErrorResponse(request, response, ex, ex.getMessage(), HttpServletResponse.SC_BAD_REQUEST); + } + @ExceptionHandler(SQLException.class) protected void handleSQLException(HttpServletRequest request, HttpServletResponse response, Exception ex) throws IOException { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index 50880e98d8..83707c06dc 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -110,7 +110,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { } catch (SearchServiceException e) { log.error("Error while searching with Discovery", e); - throw new BadRequestException(); + throw new IllegalArgumentException(); } return discoverResultConverter From 47dc9482c6a8bea494b6f2c3296bee3e1f8c849f Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Tue, 25 Sep 2018 14:14:51 +0200 Subject: [PATCH 053/193] [DS-4010] added IT test for the discoverQuery with a query parameter containing dc.date.issued --- .../DSpaceApiExceptionControllerAdvice.java | 1 - .../app/rest/DiscoveryRestControllerIT.java | 95 +++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java index 2dcc620942..ac68d0ffdb 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java @@ -20,7 +20,6 @@ import org.dspace.authorize.AuthorizeException; import org.springframework.beans.TypeMismatchException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.support.QueryMethodParameterConversionException; -import org.springframework.data.rest.webmvc.ResourceNotFoundException; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java index 56d25ecf8c..7b3a8392e0 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java @@ -2678,4 +2678,99 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest ; } + + @Test + public void discoverSearchObjectsTestWithDateIssuedQuery() throws Exception { + //We turn off the authorization system in order to create the structure as defined below + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Test") + .withIssueDate("2010-10-17") + .withAuthor("Smith, Donald") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("Test 2") + .withIssueDate("1990-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("Public item 2") + .withIssueDate("2010-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane").withAuthor("test,test") + .withAuthor("test2, test2").withAuthor("Maybe, Maybe") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + String bitstreamContent = "ThisIsSomeDummyText"; + //Add a bitstream to an item + try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) { + Bitstream bitstream = BitstreamBuilder. + createBitstream(context, publicItem1, is) + .withName("Bitstream") + .withMimeType("text/plain") + .build(); + } + + //Run the filter media to make the text in the bitstream searchable through the query + runDSpaceScript("filter-media", "-f", "-i", publicItem1.getHandle()); + + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "dc.date.issued:2010-02-13")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + //The page object needs to look like this + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 1) + ))) + //This is the only item that should be returned with the query given + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.contains( + SearchResultMatcher.matchOnItemName("item", "items", "Public item 2") + ))) + + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) + ; + + + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "dc.date.issued:2013-02-13")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + //The page object needs to look like this + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 0, 0) + ))) + + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) + ; + + } } From bd464e03f51311af705ed3ac58f83b0399416fc9 Mon Sep 17 00:00:00 2001 From: Tom Desair Date: Thu, 23 Aug 2018 13:59:21 +0200 Subject: [PATCH 054/193] DS-3542: Only trust X-Forwared-For headers from trusted proxies --- .../dspace/authenticate/IPAuthentication.java | 18 +-- .../core/factory/CoreServiceFactory.java | 3 + .../core/factory/CoreServiceFactoryImpl.java | 8 ++ .../google/GoogleRecorderEventListener.java | 27 ++-- .../org/dspace/service/ClientInfoService.java | 37 +++++ .../service/impl/ClientInfoServiceImpl.java | 129 ++++++++++++++++++ .../statistics/SolrLoggerServiceImpl.java | 120 ++++++---------- .../util/SpiderDetectorServiceImpl.java | 17 +-- .../statistics/MockSolrLoggerServiceImpl.java | 1 - .../util/SpiderDetectorServiceImplTest.java | 13 +- .../rest/security/jwt/JWTTokenHandler.java | 10 +- .../security/jwt/JWTTokenHandlerTest.java | 5 + .../statistics/MockSolrLoggerServiceImpl.java | 1 - dspace/config/dspace.cfg | 14 +- dspace/config/spring/api/core-services.xml | 1 + 15 files changed, 269 insertions(+), 135 deletions(-) create mode 100644 dspace-api/src/main/java/org/dspace/service/ClientInfoService.java create mode 100644 dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java index 9a8dcf7d55..a36c7dbb00 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java @@ -18,13 +18,14 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; -import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.core.LogManager; +import org.dspace.core.factory.CoreServiceFactory; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.service.GroupService; +import org.dspace.service.ClientInfoService; import org.dspace.services.factory.DSpaceServicesFactory; /** @@ -67,6 +68,7 @@ public class IPAuthentication implements AuthenticationMethod { protected List ipNegativeMatchers; protected GroupService groupService; + protected ClientInfoService clientInfoService; /** @@ -91,6 +93,7 @@ public class IPAuthentication implements AuthenticationMethod { ipMatcherGroupIDs = new HashMap<>(); ipMatcherGroupNames = new HashMap<>(); groupService = EPersonServiceFactory.getInstance().getGroupService(); + clientInfoService = CoreServiceFactory.getInstance().getClientInfoService(); List propNames = DSpaceServicesFactory.getInstance().getConfigurationService() .getPropertyKeys("authentication-ip"); @@ -169,18 +172,7 @@ public class IPAuthentication implements AuthenticationMethod { List groups = new ArrayList(); // Get the user's IP address - String addr = request.getRemoteAddr(); - if (useProxies == null) { - useProxies = ConfigurationManager.getBooleanProperty("useProxies", false); - } - if (useProxies && request.getHeader("X-Forwarded-For") != null) { - /* This header is a comma delimited list */ - for (String xfip : request.getHeader("X-Forwarded-For").split(",")) { - if (!request.getHeader("X-Forwarded-For").contains(addr)) { - addr = xfip.trim(); - } - } - } + String addr = clientInfoService.getClientIp(request); for (IPMatcher ipm : ipMatchers) { try { diff --git a/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactory.java b/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactory.java index 888cd21764..e7260fc2b4 100644 --- a/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactory.java +++ b/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactory.java @@ -10,6 +10,7 @@ package org.dspace.core.factory; import org.dspace.core.service.LicenseService; import org.dspace.core.service.NewsService; import org.dspace.core.service.PluginService; +import org.dspace.service.ClientInfoService; import org.dspace.services.factory.DSpaceServicesFactory; /** @@ -26,6 +27,8 @@ public abstract class CoreServiceFactory { public abstract PluginService getPluginService(); + public abstract ClientInfoService getClientInfoService(); + public static CoreServiceFactory getInstance() { return DSpaceServicesFactory.getInstance().getServiceManager() .getServiceByName("coreServiceFactory", CoreServiceFactory.class); diff --git a/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactoryImpl.java b/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactoryImpl.java index 4beb47f2c0..7db3ad24d7 100644 --- a/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactoryImpl.java +++ b/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactoryImpl.java @@ -10,6 +10,7 @@ package org.dspace.core.factory; import org.dspace.core.service.LicenseService; import org.dspace.core.service.NewsService; import org.dspace.core.service.PluginService; +import org.dspace.service.ClientInfoService; import org.springframework.beans.factory.annotation.Autowired; /** @@ -29,6 +30,9 @@ public class CoreServiceFactoryImpl extends CoreServiceFactory { @Autowired(required = true) private PluginService pluginService; + @Autowired(required = true) + private ClientInfoService clientInfoService; + @Override public LicenseService getLicenseService() { return licenseService; @@ -43,4 +47,8 @@ public class CoreServiceFactoryImpl extends CoreServiceFactory { public PluginService getPluginService() { return pluginService; } + + public ClientInfoService getClientInfoService() { + return clientInfoService; + } } diff --git a/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java b/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java index f7ebaebb4d..a2ba14f6be 100644 --- a/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java +++ b/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java @@ -25,8 +25,8 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; -import org.dspace.core.ConfigurationManager; import org.dspace.core.Constants; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.dspace.services.model.Event; import org.dspace.usage.AbstractUsageEventListener; @@ -50,6 +50,7 @@ public class GoogleRecorderEventListener extends AbstractUsageEventListener { protected ContentServiceFactory contentServiceFactory; protected ConfigurationService configurationService; + protected ClientInfoService clientInfoService; public GoogleRecorderEventListener() { // httpclient is threadsafe so we only need one. @@ -62,10 +63,15 @@ public class GoogleRecorderEventListener extends AbstractUsageEventListener { } @Autowired - public void setConfigurationService(final ConfigurationService configurationService) { + public void setConfigurationService(ConfigurationService configurationService) { this.configurationService = configurationService; } + @Autowired + public void setClientInfoService(ClientInfoService clientInfoService) { + this.clientInfoService = clientInfoService; + } + @Override public void receiveEvent(Event event) { if ((event instanceof UsageEvent)) { @@ -187,22 +193,7 @@ public class GoogleRecorderEventListener extends AbstractUsageEventListener { } private String getIPAddress(HttpServletRequest request) { - String clientIP = request.getRemoteAddr(); - if (ConfigurationManager.getBooleanProperty("useProxies", false) && request - .getHeader("X-Forwarded-For") != null) { - /* This header is a comma delimited list */ - for (String xfip : request.getHeader("X-Forwarded-For").split(",")) { - /* proxy itself will sometime populate this header with the same value in - remote address. ordering in spec is vague, we'll just take the last - not equal to the proxy - */ - if (!request.getHeader("X-Forwarded-For").contains(clientIP)) { - clientIP = xfip.trim(); - } - } - } - - return clientIP; + return clientInfoService.getClientIp(request); } } diff --git a/dspace-api/src/main/java/org/dspace/service/ClientInfoService.java b/dspace-api/src/main/java/org/dspace/service/ClientInfoService.java new file mode 100644 index 0000000000..68fb5b7f43 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/service/ClientInfoService.java @@ -0,0 +1,37 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.service; + +import javax.servlet.http.HttpServletRequest; + +/** + * Service that can be used to retrieve information about DSpace clients + */ +public interface ClientInfoService { + + /** + * Get the client IP of this request taking into account the X-Forwarded-For header and the "useProxies" setting + * @param request The client HTTP request + * @return The IP address of the originating client + */ + String getClientIp(HttpServletRequest request); + + /** + * Get the client IP of this request taking into account the X-Forwarded-For header and the "useProxies" setting + * @param remoteIp the remote address of the current request + * @param xForwardedForHeaderValue The value of the X-Forwarded-For header + * @return The IP address of the originating client + */ + String getClientIp(String remoteIp, String xForwardedForHeaderValue); + + /** + * Does DSpace take into account HTTP proxy headers or not + * @return true if this is the case, false otherwise + */ + boolean isUseProxiesEnabled(); +} diff --git a/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java b/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java new file mode 100644 index 0000000000..771374299c --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java @@ -0,0 +1,129 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.service.impl; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.dspace.service.ClientInfoService; +import org.dspace.services.ConfigurationService; +import org.dspace.statistics.util.IPTable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Implementation of {@link ClientInfoService} that can provide information on DSpace client requests + */ +public class ClientInfoServiceImpl implements ClientInfoService { + + private static final String X_FORWARDED_FOR_HEADER = "X-Forwarded-For"; + + private static final Logger log = LoggerFactory.getLogger(ClientInfoServiceImpl.class); + + private Boolean useProxiesEnabled; + + private ConfigurationService configurationService; + + /** + * Sparse HashTable structure to hold IP address ranges of trusted proxies + */ + private IPTable trustedProxies; + + @Autowired(required = true) + public ClientInfoServiceImpl(ConfigurationService configurationService) { + this.configurationService = configurationService; + this.trustedProxies = parseTrustedProxyRanges( + configurationService.getArrayProperty("proxies.trusted.ipranges")); + } + + @Override + public String getClientIp(HttpServletRequest request) { + return getClientIp(request.getRemoteAddr(), request.getHeader(X_FORWARDED_FOR_HEADER)); + } + + @Override + public String getClientIp(String remoteIp, String xForwardedForHeaderValue) { + String ip = remoteIp; + + if (isUseProxiesEnabled()) { + String xForwardedForIp = getXForwardedForIpValue(remoteIp, xForwardedForHeaderValue); + + if (StringUtils.isNotBlank(xForwardedForIp) && isRequestFromTrustedProxy(ip)) { + ip = xForwardedForIp; + } + + } else if (StringUtils.isNotBlank(xForwardedForHeaderValue)) { + log.warn( + "X-Forwarded-For header detected but useProxiesEnabled is not enabled. " + + "If your dspace is behind a proxy set it to true"); + } + + return ip; + } + + @Override + public boolean isUseProxiesEnabled() { + if (useProxiesEnabled == null) { + useProxiesEnabled = configurationService.getBooleanProperty("useProxies", true); + log.info("useProxies=" + useProxiesEnabled); + } + + return useProxiesEnabled; + } + + private IPTable parseTrustedProxyRanges(String[] proxyProperty) { + if (ArrayUtils.isEmpty(proxyProperty)) { + return null; + } else { + //Load all supplied proxy IP ranges into the IP table + IPTable ipTable = new IPTable(); + try { + for (String proxyRange : proxyProperty) { + ipTable.add(proxyRange); + } + } catch (IPTable.IPFormatException e) { + log.error("Property proxies.trusted.ipranges contains an invalid IP range", e); + ipTable = null; + } + + return ipTable; + } + } + + private boolean isRequestFromTrustedProxy(String ipAddress) { + try { + return trustedProxies == null || trustedProxies.contains(ipAddress); + } catch (IPTable.IPFormatException e) { + log.error("Request contains invalid remote address", e); + return false; + } + } + + private String getXForwardedForIpValue(String remoteIp, String xForwardedForValue) { + String ip = null; + + /* This header is a comma delimited list */ + String headerValue = StringUtils.trimToEmpty(xForwardedForValue); + for (String xfip : headerValue.split(",")) { + /* proxy itself will sometime populate this header with the same value in + remote address. ordering in spec is vague, we'll just take the last + not equal to the proxy + */ + if (!StringUtils.equals(remoteIp, xfip) && StringUtils.isNotBlank(xfip) + //if we have trusted proxies, we'll assume that they are not the client IP + && (trustedProxies == null || !isRequestFromTrustedProxy(xfip))) { + + ip = xfip.trim(); + } + } + + return ip; + } +} diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java index e6c09ea32b..59641865f3 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java @@ -82,6 +82,7 @@ import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.dspace.statistics.service.SolrLoggerService; import org.dspace.statistics.util.DnsLookup; @@ -115,8 +116,6 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea protected DatabaseReader locationService; - protected boolean useProxies; - private static List statisticYearCores = new ArrayList(); private static boolean statisticYearCoresInit = false; @@ -126,6 +125,8 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea protected ContentServiceFactory contentServiceFactory; @Autowired(required = true) private ConfigurationService configurationService; + @Autowired(required = true) + private ClientInfoService clientInfoService; public static enum StatisticsType { VIEW("view"), @@ -192,9 +193,6 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea log.error("The required 'dbfile' configuration is missing in solr-statistics.cfg!"); } locationService = service; - - useProxies = configurationService.getBooleanProperty("useProxies"); - log.info("useProxies=" + useProxies); } @Override @@ -296,26 +294,7 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea // Save our basic info that we already have if (request != null) { - String ip = request.getRemoteAddr(); - - if (isUseProxies() && request.getHeader("X-Forwarded-For") != null) { - /* This header is a comma delimited list */ - for (String xfip : request.getHeader("X-Forwarded-For").split(",")) { - /* proxy itself will sometime populate this header with the same value in - remote address. ordering in spec is vague, we'll just take the last - not equal to the proxy - */ - if (!request.getHeader("X-Forwarded-For").contains(ip)) { - ip = xfip.trim(); - } - } - } - if (!isUseProxies() && request.getHeader("X-Forwarded-For") != null) { - log.warn( - "X-Forwarded-For header detected but useProxies is not enabled. If your dspace is behind a proxy " + - "set it to true"); - } - + String ip = clientInfoService.getClientIp(request); doc1.addField("ip", ip); //Also store the referrer @@ -391,65 +370,48 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea SolrInputDocument doc1 = new SolrInputDocument(); // Save our basic info that we already have - if (!isUseProxies() && xforwardedfor != null) { - log.warn( - "X-Forwarded-For header detected but useProxies is not enabled. If your dspace is behind a proxy set " + - "it to true"); + ip = clientInfoService.getClientIp(ip, xforwardedfor); + doc1.addField("ip", ip); + + try { + String dns = DnsLookup.reverseDns(ip); + doc1.addField("dns", dns.toLowerCase()); + } catch (Exception e) { + log.info("Failed DNS Lookup for IP:" + ip); + log.debug(e.getMessage(), e); } - if (isUseProxies() && xforwardedfor != null) { - /* This header is a comma delimited list */ - for (String xfip : xforwardedfor.split(",")) { - /* proxy itself will sometime populate this header with the same value in - remote address. ordering in spec is vague, we'll just take the last - not equal to the proxy - */ - if (!xforwardedfor.contains(ip)) { - ip = xfip.trim(); - } - } - - doc1.addField("ip", ip); - + if (userAgent != null) { + doc1.addField("userAgent", userAgent); + } + doc1.addField("isBot", isSpiderBot); + // Save the location information if valid, save the event without + // location information if not valid + if (locationService != null) { try { - String dns = DnsLookup.reverseDns(ip); - doc1.addField("dns", dns.toLowerCase()); - } catch (Exception e) { - log.info("Failed DNS Lookup for IP:" + ip); - log.debug(e.getMessage(), e); - } - if (userAgent != null) { - doc1.addField("userAgent", userAgent); - } - doc1.addField("isBot", isSpiderBot); - // Save the location information if valid, save the event without - // location information if not valid - if (locationService != null) { - try { - InetAddress ipAddress = InetAddress.getByName(ip); - CityResponse location = locationService.city(ipAddress); - String countryCode = location.getCountry().getIsoCode(); - double latitude = location.getLocation().getLatitude(); - double longitude = location.getLocation().getLongitude(); - if (!( - "--".equals(countryCode) - && latitude == -180 - && longitude == -180) - ) { - try { - doc1.addField("continent", LocationUtils + InetAddress ipAddress = InetAddress.getByName(ip); + CityResponse location = locationService.city(ipAddress); + String countryCode = location.getCountry().getIsoCode(); + double latitude = location.getLocation().getLatitude(); + double longitude = location.getLocation().getLongitude(); + if (!( + "--".equals(countryCode) + && latitude == -180 + && longitude == -180) + ) { + try { + doc1.addField("continent", LocationUtils .getContinentCode(countryCode)); - } catch (Exception e) { - System.out + } catch (Exception e) { + System.out .println("COUNTRY ERROR: " + countryCode); - } - doc1.addField("countryCode", countryCode); - doc1.addField("city", location.getCity().getName()); - doc1.addField("latitude", latitude); - doc1.addField("longitude", longitude); } - } catch (GeoIp2Exception | IOException e) { - log.error("Unable to get location of request: {}", e.getMessage()); + doc1.addField("countryCode", countryCode); + doc1.addField("city", location.getCity().getName()); + doc1.addField("latitude", latitude); + doc1.addField("longitude", longitude); } + } catch (GeoIp2Exception | IOException e) { + log.error("Unable to get location of request: {}", e.getMessage()); } } @@ -604,7 +566,7 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea @Override public boolean isUseProxies() { - return useProxies; + return clientInfoService.isUseProxiesEnabled(); } @Override diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java index 7939db3a12..508f6ffe64 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java @@ -21,6 +21,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.configuration.ConversionException; import org.apache.commons.lang.StringUtils; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,8 +41,6 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { private static final Logger log = LoggerFactory.getLogger(SpiderDetectorServiceImpl.class); - private Boolean useProxies; - private Boolean useCaseInsensitiveMatching; private final List agents @@ -51,6 +50,7 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { = Collections.synchronizedList(new ArrayList()); private ConfigurationService configurationService; + private ClientInfoService clientInfoService; /** * Sparse HashTable structure to hold IP address ranges. @@ -58,8 +58,9 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { private IPTable table = null; @Autowired(required = true) - public SpiderDetectorServiceImpl(ConfigurationService configurationService) { + public SpiderDetectorServiceImpl(ConfigurationService configurationService, ClientInfoService clientInfoService) { this.configurationService = configurationService; + this.clientInfoService = clientInfoService; } public IPTable getTable() { @@ -104,7 +105,7 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { } // No. See if any IP addresses match - if (isUseProxies() && proxyIPs != null) { + if (clientInfoService.isUseProxiesEnabled() && proxyIPs != null) { /* This header is a comma delimited list */ for (String xfip : proxyIPs.split(",")) { if (isSpider(xfip)) { @@ -306,12 +307,4 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { return useCaseInsensitiveMatching; } - private boolean isUseProxies() { - if (useProxies == null) { - useProxies = configurationService.getBooleanProperty("useProxies"); - } - - return useProxies; - } - } diff --git a/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java b/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java index 9716fc8892..0c02c0a100 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java +++ b/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java @@ -38,7 +38,6 @@ public class MockSolrLoggerServiceImpl File locationDb = new File(locationDbPath); locationDb.createNewFile(); locationService = new DatabaseReader.Builder(locationDb).build(); - useProxies = configurationService.getBooleanProperty("useProxies"); } } diff --git a/dspace-api/src/test/java/org/dspace/statistics/util/SpiderDetectorServiceImplTest.java b/dspace-api/src/test/java/org/dspace/statistics/util/SpiderDetectorServiceImplTest.java index 5566562580..6abda2b13e 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/util/SpiderDetectorServiceImplTest.java +++ b/dspace-api/src/test/java/org/dspace/statistics/util/SpiderDetectorServiceImplTest.java @@ -13,6 +13,8 @@ import static org.junit.Assert.assertTrue; import mockit.Mock; import mockit.MockUp; import org.dspace.AbstractDSpaceTest; +import org.dspace.core.factory.CoreServiceFactory; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.statistics.SolrLoggerServiceImpl; @@ -32,14 +34,15 @@ public class SpiderDetectorServiceImplTest extends AbstractDSpaceTest { private ConfigurationService configurationService; + private ClientInfoService clientInfoService; private SpiderDetectorService spiderDetectorService; @Before public void init() { configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); - spiderDetectorService = new SpiderDetectorServiceImpl(configurationService); - + clientInfoService = CoreServiceFactory.getInstance().getClientInfoService(); + spiderDetectorService = new SpiderDetectorServiceImpl(configurationService, clientInfoService); } @Test @@ -60,7 +63,7 @@ public class SpiderDetectorServiceImplTest extends AbstractDSpaceTest { @Test public void testCaseInsensitiveMatching() throws Exception { configurationService.setProperty("usage-statistics.bots.case-insensitive", true); - spiderDetectorService = new SpiderDetectorServiceImpl(configurationService); + spiderDetectorService = new SpiderDetectorServiceImpl(configurationService, clientInfoService); DummyHttpServletRequest req = new DummyHttpServletRequest(); req.setAddress(NOT_A_BOT_ADDRESS); // avoid surprises @@ -265,7 +268,7 @@ public class SpiderDetectorServiceImplTest extends AbstractDSpaceTest { public void testBothLowerAndUpperCaseGetMatched() { configurationService.setProperty("usage-statistics.bots.case-insensitive", true); - spiderDetectorService = new SpiderDetectorServiceImpl(configurationService); + spiderDetectorService = new SpiderDetectorServiceImpl(configurationService, clientInfoService); DummyHttpServletRequest req = new DummyHttpServletRequest(); req.setAddress(NOT_A_BOT_ADDRESS); // avoid surprises @@ -297,7 +300,7 @@ public class SpiderDetectorServiceImplTest extends AbstractDSpaceTest { @Test public void testNonBooleanConfig() { configurationService.setProperty("usage-statistics.bots.case-insensitive", "RandomNonBooleanString"); - spiderDetectorService = new SpiderDetectorServiceImpl(configurationService); + spiderDetectorService = new SpiderDetectorServiceImpl(configurationService, clientInfoService); DummyHttpServletRequest req = new DummyHttpServletRequest(); req.setAddress(NOT_A_BOT_ADDRESS); // avoid surprises diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenHandler.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenHandler.java index 15f73b1be6..50801bf13b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenHandler.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenHandler.java @@ -38,6 +38,7 @@ import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.service.EPersonService; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,6 +72,9 @@ public class JWTTokenHandler implements InitializingBean { @Autowired private EPersonService ePersonService; + @Autowired + private ClientInfoService clientInfoService; + private String jwtKey; private long expirationTime; private boolean includeIP; @@ -276,11 +280,7 @@ public class JWTTokenHandler implements InitializingBean { } private String getIpAddress(HttpServletRequest request) { - String ipAddress = request.getHeader("X-FORWARDED-FOR"); - if (ipAddress == null) { - ipAddress = request.getRemoteAddr(); - } - return ipAddress; + return clientInfoService.getClientIp(request); } private EPerson updateSessionSalt(final Context context, final Date previousLoginDate) throws SQLException { diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java index 75a930aa61..a67f747b62 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java @@ -23,6 +23,7 @@ import com.nimbusds.jwt.SignedJWT; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.service.EPersonService; +import org.dspace.service.ClientInfoService; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -62,6 +63,9 @@ public class JWTTokenHandlerTest { @Mock private EPersonClaimProvider ePersonClaimProvider; + @Mock + private ClientInfoService clientInfoService; + @Spy private List jwtClaimProviders = new ArrayList<>(); @@ -71,6 +75,7 @@ public class JWTTokenHandlerTest { when(ePerson.getSessionSalt()).thenReturn("01234567890123456789012345678901"); when(ePerson.getLastActive()).thenReturn(new Date()); when(context.getCurrentUser()).thenReturn(ePerson); + when(clientInfoService.getClientIp(any())).thenReturn("123.123.123.123"); when(ePersonClaimProvider.getKey()).thenReturn("eid"); when(ePersonClaimProvider.getValue(any(), Mockito.any(HttpServletRequest.class))).thenReturn("epersonID"); jwtClaimProviders.add(ePersonClaimProvider); diff --git a/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java b/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java index 543146ff36..8cb60ae780 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java +++ b/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java @@ -42,7 +42,6 @@ public class MockSolrLoggerServiceImpl File locationDb = new File(locationDbPath); locationDb.createNewFile(); locationService = new DatabaseReader.Builder(locationDb).build(); - useProxies = configurationService.getBooleanProperty("useProxies"); } @Override diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index c38847ac07..3810060406 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -326,7 +326,19 @@ http.proxy.port = # If enabled, the logging and the Solr statistics system will look for # an X-Forwarded-For header. If it finds it, it will use this for the user IP address -useProxies = false +# Note that server-side rendered Angular UI requests always present the X-Forwarded-For header +# with the original client IP address. +useProxies = true + +# If "useProxies" is enabled, the authentication and statistics logging code will read the X-Forwarded-For header in +# order to determine the correct client IP address. But they will only use that header value when the request is coming +# from a trusted proxy server location (e.g. HTTPD on localhost). Leave this property empty to trust X-Forwarded-For +# values of all requests. You can specify a range by only listing the first three ip-address blocks, e.g. 128.177.243 +# You can list multiple IP addresses or ranges by comma-separating them. +# If you are running REST & UI on different servers, you should add the UI servers (range) as a proxy. +# For example : proxies.trusted.ipranges = 127.0.0.1, 192.168.2 +# This is necessary because Angular Universal will also behave as a proxy server. +proxies.trusted.ipranges = 127.0.0.1 #### Media Filter / Format Filter plugins (through PluginService) #### # Media/Format Filters help to full-text index content or diff --git a/dspace/config/spring/api/core-services.xml b/dspace/config/spring/api/core-services.xml index f25cb5ea20..6886a73507 100644 --- a/dspace/config/spring/api/core-services.xml +++ b/dspace/config/spring/api/core-services.xml @@ -93,6 +93,7 @@ + From e0d10d7eec1d80e3b0a036c6986c6fdd91c4fc58 Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Tue, 25 Sep 2018 14:50:39 -0700 Subject: [PATCH 055/193] support mult dockerfiles per branch --- Dockerfile => Dockerfile.jdk8 | 7 + README.md | 3 + dspace/src/main/docker/test/rest_web.xml | 114 +++++++++++++ dspace/src/main/docker/test/solr_web.xml | 205 +++++++++++++++++++++++ 4 files changed, 329 insertions(+) rename Dockerfile => Dockerfile.jdk8 (88%) create mode 100644 dspace/src/main/docker/test/rest_web.xml create mode 100644 dspace/src/main/docker/test/solr_web.xml diff --git a/Dockerfile b/Dockerfile.jdk8 similarity index 88% rename from Dockerfile rename to Dockerfile.jdk8 index 03913666ea..a2c2e168d3 100644 --- a/Dockerfile +++ b/Dockerfile.jdk8 @@ -1,5 +1,10 @@ # This image will be published as dspace/dspace # See https://dspace-labs.github.io/DSpace-Docker-Images/ for usage details +# +# This version is JDK8 compatible +# - tomcat:8 +# - ANT 1.10.5 +# - maven:latest # Step 1 - Run Maven Build FROM maven as build @@ -8,6 +13,8 @@ WORKDIR /app # Copy the DSpace source code into the workdir (excluding .dockerignore contents) ADD . /app/ COPY dspace/src/main/docker/local.cfg /app/local.cfg +COPY dspace/src/main/docker/test/solr_web.xml /app/dspace-solr/src/main/webapp/WEB-INF/web.xml +COPY dspace/src/main/docker/test/rest_web.xml /app/dspace-rest/src/main/webapp/WEB-INF/web.xml RUN mvn package diff --git a/README.md b/README.md index aa38a079d4..a62fc1943d 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,9 @@ Please be aware that, as a Java web application, DSpace requires a database (Pos and a servlet container (usually Tomcat) in order to function. More information about these and all other prerequisites can be found in the Installation instructions above. +## Dockerfile Usage +See the [DSpace Docker Tutorial](https://dspace-labs.github.io/DSpace-Docker-Images/). + ## Contributing DSpace is a community built and supported project. We do not have a centralized development or support team, diff --git a/dspace/src/main/docker/test/rest_web.xml b/dspace/src/main/docker/test/rest_web.xml new file mode 100644 index 0000000000..842e7695ab --- /dev/null +++ b/dspace/src/main/docker/test/rest_web.xml @@ -0,0 +1,114 @@ + + + + + + dspace.request + org.dspace.utils.servlet.DSpaceWebappServletFilter + + + + dspace.request + /* + + + + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + + springSecurityFilterChain + /* + + + + + DSpace REST API + + org.glassfish.jersey.servlet.ServletContainer + + + javax.ws.rs.Application + org.dspace.rest.DSpaceRestApplication + + 1 + + + + DSpace REST API + /* + + + + default + /static/* + + + + + + + + + The location of the DSpace home directory + + dspace.dir + ${dspace.dir} + + + + contextConfigLocation + + /WEB-INF/applicationContext.xml, + /WEB-INF/security-applicationContext.xml + + + + + org.dspace.app.util.DSpaceContextListener + + + + + org.dspace.servicemanager.servlet.DSpaceKernelServletContextListener + + + + + org.springframework.web.context.ContextLoaderListener + + + + + org.dspace.app.util.DSpaceWebappListener + + + + \ No newline at end of file diff --git a/dspace/src/main/docker/test/solr_web.xml b/dspace/src/main/docker/test/solr_web.xml new file mode 100644 index 0000000000..0147612735 --- /dev/null +++ b/dspace/src/main/docker/test/solr_web.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + solr/home + ${dspace.dir}/solr + java.lang.String + + + + + + log4j.configuration + ${dspace.dir}/config/log4j-solr.properties + URL locating a Log4J configuration file (properties or XML). + + + + + LocalHostRestrictionFilter + org.dspace.solr.filters.LocalHostRestrictionFilter + + + + + SolrRequestFilter + org.apache.solr.servlet.SolrDispatchFilter + + + + + + + + + SolrRequestFilter + /* + + + + + + org.dspace.solr.filters.ConfigureLog4jListener + + + + Zookeeper + org.apache.solr.servlet.ZookeeperInfoServlet + + + + LoadAdminUI + org.apache.solr.servlet.LoadAdminUiServlet + + + + + + RedirectOldAdminUI + org.apache.solr.servlet.RedirectServlet + + destination + ${context}/#/ + + + + + RedirectOldZookeeper + org.apache.solr.servlet.RedirectServlet + + destination + ${context}/zookeeper + + + + + RedirectLogging + org.apache.solr.servlet.RedirectServlet + + destination + ${context}/#/~logging + + + + + SolrRestApi + org.restlet.ext.servlet.ServerServlet + + org.restlet.application + org.apache.solr.rest.SolrRestApi + + + + + RedirectOldAdminUI + /admin/ + + + RedirectOldAdminUI + /admin + + + RedirectOldZookeeper + /zookeeper.jsp + + + RedirectLogging + /logging + + + + + Zookeeper + /zookeeper + + + + LoadAdminUI + /admin.html + + + + SolrRestApi + /schema/* + + + + .xsl + + application/xslt+xml + + + + admin.html + + + From 0b991a4d13a43f4e2074ab01cd793b11a1ea2036 Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Thu, 27 Sep 2018 07:15:14 -0700 Subject: [PATCH 056/193] Create default and test image variants --- Dockerfile.jdk8 | 4 +-- Dockerfile.jdk8-test | 64 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 Dockerfile.jdk8-test diff --git a/Dockerfile.jdk8 b/Dockerfile.jdk8 index a2c2e168d3..1f9ade84fc 100644 --- a/Dockerfile.jdk8 +++ b/Dockerfile.jdk8 @@ -5,6 +5,8 @@ # - tomcat:8 # - ANT 1.10.5 # - maven:latest +# - note: +# - default tag for branch: dspace/dspace: dspace/dspace:dspace-7_x-jdk8 # Step 1 - Run Maven Build FROM maven as build @@ -13,8 +15,6 @@ WORKDIR /app # Copy the DSpace source code into the workdir (excluding .dockerignore contents) ADD . /app/ COPY dspace/src/main/docker/local.cfg /app/local.cfg -COPY dspace/src/main/docker/test/solr_web.xml /app/dspace-solr/src/main/webapp/WEB-INF/web.xml -COPY dspace/src/main/docker/test/rest_web.xml /app/dspace-rest/src/main/webapp/WEB-INF/web.xml RUN mvn package diff --git a/Dockerfile.jdk8-test b/Dockerfile.jdk8-test new file mode 100644 index 0000000000..6732567e55 --- /dev/null +++ b/Dockerfile.jdk8-test @@ -0,0 +1,64 @@ +# This image will be published as dspace/dspace +# See https://dspace-labs.github.io/DSpace-Docker-Images/ for usage details +# +# This version is JDK8 compatible +# - tomcat:8 +# - ANT 1.10.5 +# - maven:latest +# - note: expose /solr to any host; provide /rest over http +# - default tag for branch: dspace/dspace: dspace/dspace:dspace-7_x-jdk8-test + +# Step 1 - Run Maven Build +FROM maven as build +WORKDIR /app + +# Copy the DSpace source code into the workdir (excluding .dockerignore contents) +ADD . /app/ +COPY dspace/src/main/docker/local.cfg /app/local.cfg + +# Provide web.xml overrides to make webapps easier to test +COPY dspace/src/main/docker/test/solr_web.xml /app/dspace-solr/src/main/webapp/WEB-INF/web.xml +COPY dspace/src/main/docker/test/rest_web.xml /app/dspace-rest/src/main/webapp/WEB-INF/web.xml + +RUN mvn package + +# Step 2 - Run Ant Deploy +FROM tomcat:8 as ant_build +ARG TARGET_DIR=dspace-installer +COPY --from=build /app /dspace-src +WORKDIR /dspace-src/dspace/target/${TARGET_DIR} + +# Create the initial install deployment using ANT +ENV ANT_VERSION 1.10.5 +ENV ANT_HOME /tmp/ant-$ANT_VERSION +ENV PATH $ANT_HOME/bin:$PATH + +RUN mkdir $ANT_HOME && \ + wget -qO- "https://www.apache.org/dist/ant/binaries/apache-ant-$ANT_VERSION-bin.tar.gz" | tar -zx --strip-components=1 -C $ANT_HOME + +RUN ant update_configs update_code update_webapps update_solr_indexes + +# Step 3 - Run tomcat +# Create a new tomcat image that does not retain the the build directory contents +FROM tomcat:8 +COPY --from=ant_build /dspace /dspace +EXPOSE 8080 8009 + +# Ant will be embedded in the final container to allow additional deployments +ENV ANT_VERSION 1.10.5 +ENV ANT_HOME /tmp/ant-$ANT_VERSION +ENV PATH $ANT_HOME/bin:$PATH + +RUN mkdir $ANT_HOME && \ + wget -qO- "https://www.apache.org/dist/ant/binaries/apache-ant-$ANT_VERSION-bin.tar.gz" | tar -zx --strip-components=1 -C $ANT_HOME + +ENV DSPACE_INSTALL=/dspace +ENV JAVA_OPTS=-Xmx2000m + +RUN ln -s $DSPACE_INSTALL/webapps/solr /usr/local/tomcat/webapps/solr && \ + ln -s $DSPACE_INSTALL/webapps/spring-rest /usr/local/tomcat/webapps/spring-rest && \ + ln -s $DSPACE_INSTALL/webapps/rest /usr/local/tomcat/webapps/rest && \ + ln -s $DSPACE_INSTALL/webapps/oai /usr/local/tomcat/webapps/oai && \ + ln -s $DSPACE_INSTALL/webapps/rdf /usr/local/tomcat/webapps/rdf && \ + ln -s $DSPACE_INSTALL/webapps/sword /usr/local/tomcat/webapps/sword && \ + ln -s $DSPACE_INSTALL/webapps/swordv2 /usr/local/tomcat/webapps/swordv2 From 65c7bbb6f6df9d503827d4b206b20aa88a6f54d4 Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Thu, 27 Sep 2018 13:01:23 -0700 Subject: [PATCH 057/193] Updated respository patch classes and ItemRestRepository. --- .../rest/repository/ItemRestRepository.java | 31 +- .../patch/AbstractResourcePatch.java | 110 ---- .../patch/ItemOperationFactory.java | 51 ++ .../app/rest/repository/patch/ItemPatch.java | 143 ----- .../ItemDiscoverableReplaceOperation.java | 87 +++ .../impl/ItemWithdrawReplaceOperation.java | 121 ++++ .../repository/patch/impl/PatchOperation.java | 54 ++ .../patch/impl/ResourcePatchOperation.java | 23 + .../dspace/app/rest/ItemRestRepositoryIT.java | 588 +++++++++--------- 9 files changed, 649 insertions(+), 559 deletions(-) delete mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java delete mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemDiscoverableReplaceOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ResourcePatchOperation.java diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java index 05af4a4289..c3383d2ef7 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java @@ -21,8 +21,10 @@ import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.exception.UnprocessableEntityException; import org.dspace.app.rest.model.ItemRest; import org.dspace.app.rest.model.hateoas.ItemResource; +import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.model.patch.Patch; -import org.dspace.app.rest.repository.patch.ItemPatch; +import org.dspace.app.rest.repository.patch.ItemOperationFactory; +import org.dspace.app.rest.repository.patch.impl.ResourcePatchOperation; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Item; import org.dspace.content.service.ItemService; @@ -52,11 +54,8 @@ public class ItemRestRepository extends DSpaceRestRepository { @Autowired ItemConverter converter; - /** - * Proposed helper class for Item patches. - */ @Autowired - ItemPatch itemPatch; + ItemOperationFactory patchFactory; public ItemRestRepository() { @@ -99,16 +98,24 @@ public class ItemRestRepository extends DSpaceRestRepository { } @Override - public void patch(Context context, HttpServletRequest request, String apiCategory, String model, UUID uuid, Patch - patch) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException, - ResourceNotFoundException { + public void patch(Context context, HttpServletRequest request, String apiCategory, String model, UUID uuid, + Patch patch) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException, + ResourceNotFoundException { - ItemRest restModel = findOne(context, uuid); - if (restModel == null) { + Item item = is.find(context, uuid); + if (item == null) { throw new ResourceNotFoundException(apiCategory + "." + model + " with id: " + uuid + " not found"); } - itemPatch.patch(restModel, context, patch); + + List operations = patch.getOperations(); + for (Operation operation : operations) { + + ResourcePatchOperation patchOperation = patchFactory.getPatchOperationForPath(operation.getPath()); + patchOperation.perform(context, item, operation); + + } + } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java deleted file mode 100644 index 2ad759d611..0000000000 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java +++ /dev/null @@ -1,110 +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.rest.repository.patch; - -import java.sql.SQLException; -import java.util.List; - -import org.dspace.app.rest.exception.PatchBadRequestException; -import org.dspace.app.rest.exception.UnprocessableEntityException; -import org.dspace.app.rest.model.RestModel; -import org.dspace.app.rest.model.patch.Operation; -import org.dspace.app.rest.model.patch.Patch; -import org.dspace.authorize.AuthorizeException; -import org.dspace.core.Context; - -/** - * The base class for resource PATCH operations. - * - * @author Michael Spalti - */ -public abstract class AbstractResourcePatch { - - /** - * Handles the patch operations, delegating actions to sub-class implementations. If no sub-class method - * is provided, the default method throws a UnprocessableEntityException. - * - * @param restModel the REST resource to patch - * @param context - * @param patch - * @throws UnprocessableEntityException - * @throws PatchBadRequestException - * @throws SQLException - * @throws AuthorizeException - */ - public void patch(R restModel, Context context, Patch patch) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - - List operations = patch.getOperations(); - - // Note: the list of possible operations is taken from JsonPatchConverter class. Does not implement - // test https://tools.ietf.org/html/rfc6902#section-4.6 - ops: for (Operation op : operations) { - switch (op.getOp()) { - case "add": - add(restModel, context, op); - continue ops; - case "replace": - replace(restModel, context, op); - continue ops; - case "remove": - remove(restModel, context, op); - continue ops; - case "copy": - copy(restModel, context, op); - continue ops; - case "move": - move(restModel, context, op); - continue ops; - default: - // JsonPatchConverter should have thrown error before this point. - throw new PatchBadRequestException("Missing or illegal patch operation: " + op.getOp()); - } - } - } - // The default patch methods throw an error when no sub-class implementation is provided. - - protected void add(R restModel, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - throw new UnprocessableEntityException( - "The add operation is not supported." - ); - } - - protected void replace(R restModel, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - // The replace operation is functionally identical to a "remove" operation for - // a value, followed immediately by an "add" operation at the same - // location with the replacement value. https://tools.ietf.org/html/rfc6902#section-4.3 - remove(restModel, context, operation); - add(restModel, context, operation); - } - - protected void remove(R restModel, Context context, Operation operation) - - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - throw new UnprocessableEntityException( - "The remove operation is not supported." - ); - } - - protected void copy(R restModel, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - throw new UnprocessableEntityException( - "The copy operation is not supported." - ); - } - - protected void move(R restModel, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - throw new UnprocessableEntityException( - "The move operation is not supported." - ); - } - -} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java new file mode 100644 index 0000000000..9b8341be36 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java @@ -0,0 +1,51 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.repository.patch.impl.ItemDiscoverableReplaceOperation; +import org.dspace.app.rest.repository.patch.impl.ItemWithdrawReplaceOperation; +import org.dspace.app.rest.repository.patch.impl.ResourcePatchOperation; +import org.dspace.content.Item; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Provides factory method for instances of item PatchOperations. + * + * @author Michael Spalti + */ +@Component +public class ItemOperationFactory { + + @Autowired + ItemDiscoverableReplaceOperation itemDiscoverableReplaceOperation; + + @Autowired + ItemWithdrawReplaceOperation itemWithdrawReplaceOperation; + + private static final String OPERATION_PATH_WITHDRAW = "/withdrawn"; + private static final String OPERATION_PATH_DISCOVERABLE = "/discoverable"; + + /** + * Returns the PatchOperation for the operation. + * @param path + * @return + */ + public ResourcePatchOperation getPatchOperationForPath(String path) { + + switch (path) { + case OPERATION_PATH_DISCOVERABLE: + return itemDiscoverableReplaceOperation; + case OPERATION_PATH_WITHDRAW: + return itemWithdrawReplaceOperation; + default: + throw new PatchBadRequestException("Missing or illegal patch operation for: " + path); + } + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java deleted file mode 100644 index 51a4d3a924..0000000000 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java +++ /dev/null @@ -1,143 +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.rest.repository.patch; - -import java.sql.SQLException; -import java.util.UUID; - -import org.apache.log4j.Logger; -import org.dspace.app.rest.exception.PatchBadRequestException; -import org.dspace.app.rest.exception.UnprocessableEntityException; -import org.dspace.app.rest.model.ItemRest; -import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.content.Item; -import org.dspace.content.service.ItemService; -import org.dspace.core.Context; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * This is the implementation for Item resource patches. - * - * @author Michael Spalti - */ -@Component -public class ItemPatch extends AbstractResourcePatch { - - private static final String OPERATION_PATH_WITHDRAW = "/withdrawn"; - - private static final String OPERATION_PATH_DISCOVERABLE = "/discoverable"; - - private static final Logger log = Logger.getLogger(ItemPatch.class); - - @Autowired - ItemService is; - - /** - * Implementation of the PATCH replace operation. - * - * @param restModel - * @param context - * @param operation - * @throws UnprocessableEntityException - * @throws PatchBadRequestException - * @throws SQLException - * @throws AuthorizeException - */ - @Override - protected void replace(ItemRest restModel, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - - switch (operation.getPath()) { - case OPERATION_PATH_WITHDRAW: - withdraw(restModel, context, (Boolean) operation.getValue()); - break; - case OPERATION_PATH_DISCOVERABLE: - discoverable(restModel, context, (Boolean) operation.getValue()); - break; - default: - throw new UnprocessableEntityException( - "Unrecognized patch operation path: " + operation.getPath() - ); - } - } - - /** - * Withdraws or reinstates the item based on boolean value provided in the patch request. - * - * @param restModel - * @param context - * @param withdrawItem - * @throws PatchBadRequestException - * @throws SQLException - * @throws AuthorizeException - */ - private void withdraw(ItemRest restModel, Context context, Boolean withdrawItem) - throws PatchBadRequestException, SQLException, AuthorizeException { - - try { - if (withdrawItem == null) { - throw new PatchBadRequestException("Boolean value not provided for withdrawal operation."); - } - if (withdrawItem) { - // Item is not withdrawn but is also NOT archived. Is this a possible situation? - if (!restModel.getWithdrawn() && !restModel.getInArchive()) { - throw new UnprocessableEntityException("Cannot withdraw item because it is not archived."); - } - // Item is already withdrawn. No-op, 200 response. - // (The operation is not idempotent since it results in a provenance note in the record.) - if (restModel.getWithdrawn()) { - return; - } - Item item = is.find(context, UUID.fromString(restModel.getUuid())); - is.withdraw(context, item); - } else { - // No need to reinstate item if it has not previously been not withdrawn. - // No-op, 200 response. (The operation is not idempotent since it results - // in a provenance note in the record.) - if (!restModel.getWithdrawn()) { - return; - } - Item item = is.find(context, UUID.fromString(restModel.getUuid())); - is.reinstate(context, item); - } - - } catch (SQLException | AuthorizeException e) { - log.error(e.getMessage(), e); - throw e; - } - } - - /** - * Sets discoverable field on the item. - * - * @param restModel - * @param context - * @param isDiscoverable - * @throws SQLException - * @throws AuthorizeException - */ - private void discoverable(ItemRest restModel, Context context, Boolean isDiscoverable) - throws SQLException, AuthorizeException { - - if (isDiscoverable == null) { - throw new PatchBadRequestException("Boolean value not provided for discoverable operation."); - } - try { - Item item = is.find(context, UUID.fromString(restModel.getUuid())); - item.setDiscoverable(isDiscoverable); - is.update(context, item); - } catch (SQLException | AuthorizeException e) { - log.error(e.getMessage(), e); - throw e; - } - - } - -} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemDiscoverableReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemDiscoverableReplaceOperation.java new file mode 100644 index 0000000000..87076d9be4 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemDiscoverableReplaceOperation.java @@ -0,0 +1,87 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.impl; + +import java.sql.SQLException; + +import org.apache.commons.lang.BooleanUtils; +import org.apache.log4j.Logger; +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.content.Item; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * This is the implementation for Item resource patches. + * + * Example: + * curl -X PATCH http://${dspace.url}/api/item/<:id-item> -H " + * Content-Type: application/json" -d '[{ "op": "replace", "path": " + * /discoverable", "value": "true|false"]' + * + * + * @author Michael Spalti + */ +@Component +public class ItemDiscoverableReplaceOperation extends PatchOperation + implements ResourcePatchOperation { + + @Autowired + ItemService is; + + private static final Logger log = Logger.getLogger(ItemDiscoverableReplaceOperation.class); + + /** + * Sets discoverable field on the item. + * + * @param item + * @param context + + * @throws SQLException + * @throws AuthorizeException + */ + public void perform(Context context, Item item, Operation operation) + throws SQLException, AuthorizeException, PatchBadRequestException { + + replace(context, item, operation.getValue()); + + } + + private void replace(Context context, Item item, Object value) + throws SQLException, AuthorizeException { + + Boolean discoverable = BooleanUtils.toBooleanObject((String) value); + + if (discoverable == null) { + throw new PatchBadRequestException( + "Value is not a valid boolean expression"); + } + + try { + item.setDiscoverable(discoverable); + is.update(context, item); + } catch (SQLException | AuthorizeException e) { + log.error(e.getMessage(), e); + throw e; + } + + } + + protected Class getArrayClassForEvaluation() { + return String[].class; + } + + protected Class getClassForEvaluation() { + return String.class; + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java new file mode 100644 index 0000000000..8aadc738a7 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java @@ -0,0 +1,121 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.impl; + +import java.sql.SQLException; + +import org.apache.commons.lang.BooleanUtils; +import org.apache.log4j.Logger; +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.content.Item; +import org.dspace.content.service.ItemService; +import org.dspace.core.Context; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + + +/** + * This is the implementation for Item resource patches. + * + * Example: + * curl -X PATCH http://${dspace.url}/api/item/<:id-item> -H " + * Content-Type: application/json" -d '[{ "op": "replace", "path": " + * /withdrawn", "value": "true|false"]' + * + * + * @author Michael Spalti + */ +@Component +public class ItemWithdrawReplaceOperation extends PatchOperation { + + private static final Logger log = Logger.getLogger(ItemWithdrawReplaceOperation.class); + + @Autowired + ItemService is; + + /** + * Implementation of the PATCH replace operation. + * + * @param item + * @param context + * @param operation + * @throws UnprocessableEntityException + * @throws PatchBadRequestException + * @throws SQLException + * @throws AuthorizeException + */ + @Override + public void perform(Context context, Item item, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + + replace(item, context, (String) operation.getValue()); + + } + + /** + * Withdraws or reinstates the item based on boolean value provided in the patch request. + * + * @param item + * @param context + * @param value + + * @throws PatchBadRequestException + * @throws SQLException + * @throws AuthorizeException + */ + private void replace(Item item, Context context, Object value) + throws PatchBadRequestException, SQLException, AuthorizeException { + + Boolean withdraw = BooleanUtils.toBooleanObject((String) value); + + if (withdraw == null) { + throw new PatchBadRequestException( + "Value is not a valid boolean expression"); + } + + try { + // This is a request to withdraw the item. + if (withdraw) { + // The DSO is currently not withdrawn and also not archived. Is this a possible situation? + if (!item.isWithdrawn() && !item.isArchived()) { + throw new UnprocessableEntityException("Cannot withdraw item when it is not in archive."); + } + // Item is already withdrawn. No-op, 200 response. + // (The operation is not idempotent since it results in a provenance note in the record.) + if (item.isWithdrawn()) { + return; + } + is.withdraw(context, item); + } else { + // No need to reinstate item if it has not previously been not withdrawn. + // No-op, 200 response. (The operation is not idempotent since it results + // in a provenance note in the record.) + if (!item.isWithdrawn()) { + return; + } + is.reinstate(context, item); + } + + } catch (SQLException | AuthorizeException e) { + log.error(e.getMessage(), e); + throw e; + } + } + + protected Class getArrayClassForEvaluation() { + return String[].class; + } + + protected Class getClassForEvaluation() { + return String.class; + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java new file mode 100644 index 0000000000..1236db1d7b --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java @@ -0,0 +1,54 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.impl; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.content.DSpaceObject; +import org.dspace.core.Context; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +public abstract class PatchOperation + implements ResourcePatchOperation { + + public abstract void perform(Context context, DSO resource, Operation operation) + throws SQLException, AuthorizeException, PatchBadRequestException; + + public List evaluateArrayObject(LateObjectEvaluator value) { + List results = new ArrayList(); + T[] list = null; + if (value != null) { + LateObjectEvaluator object = (LateObjectEvaluator) value; + list = (T[]) object.evaluate(getArrayClassForEvaluation()); + } + + for (T t : list) { + results.add(t); + } + return results; + } + + public T evaluateSingleObject(LateObjectEvaluator value) { + T single = null; + if (value != null) { + LateObjectEvaluator object = (LateObjectEvaluator) value; + single = (T) object.evaluate(getClassForEvaluation()); + } + return single; + } + + protected abstract Class getArrayClassForEvaluation(); + + protected abstract Class getClassForEvaluation(); + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ResourcePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ResourcePatchOperation.java new file mode 100644 index 0000000000..e62d9085db --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ResourcePatchOperation.java @@ -0,0 +1,23 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.impl; + +import java.sql.SQLException; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.content.DSpaceObject; +import org.dspace.core.Context; + +public interface ResourcePatchOperation { + + void perform(Context context, DSO resource, Operation operation) + throws SQLException, AuthorizeException, PatchBadRequestException; + +} diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java index cf0cbfc429..30cecd98a3 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java @@ -335,55 +335,55 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); // A token must be provided for withdraw operation. The person // is used in the provenance note. String token = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", true); + ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", "true"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // withdraw item getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); // item already withdrawn, no-op, 200 response getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); } @Test @@ -393,42 +393,42 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", true); + ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", "true"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // withdraw item getClient().perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); // use the admin to be sure to get the item status String tokenAdmin = getAuthToken(eperson.getEmail(), password); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); } @Test @@ -438,45 +438,45 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); // try to use an unauthorized user String token = getAuthToken(eperson.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", true); + ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", "true"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // withdraw item getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); // use the admin to be sure to get the item status String tokenAdmin = getAuthToken(eperson.getEmail(), password); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); } @Test @@ -486,64 +486,64 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); // we need to set a current user as the withdrawn operation use it to add provenance information context.setCurrentUser(admin); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); //2. One withdrawn item Item item2 = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .withdrawn() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .withdrawn() + .build(); String token = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", null); + ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", ""); ops.add(replaceOperation); String patchBody = getPatchContent(ops); getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item2.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item2.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item2.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); } @Test @@ -553,58 +553,58 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); // we need to set a current user as the withdrawn operation use it to add provenance information context.setCurrentUser(admin); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .withdrawn() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .withdrawn() + .build(); // A token must be provided for reinstate operation. The person // is used in the provenance note. String token = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", false); + ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", "false"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); // reinstate an already installed item is a no-op getClient(token).perform(patch("/api/core/items/" + item.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); } @Test @@ -614,45 +614,45 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); // we need to set a current user as the withdrawn operation use it to add provenance information context.setCurrentUser(admin); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .withdrawn() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .withdrawn() + .build(); String tokenAdmin = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", false); + ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", "false"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // make an anonymous request getClient().perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); } @Test @@ -662,46 +662,46 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); // we need to set a current user as the withdrawn operation use it to add provenance information context.setCurrentUser(admin); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .withdrawn() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .withdrawn() + .build(); String token = getAuthToken(eperson.getEmail(), password); String tokenAdmin = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", false); + ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", "false"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // make a request with an unauthorized user getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); } @Test @@ -711,50 +711,50 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One private item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .makeUnDiscoverable() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .makeUnDiscoverable() + .build(); String token = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", true); + ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", "true"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // make discoverable getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); // make discoverable an already discoverable item is a no-op getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); } @Test @@ -764,40 +764,40 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One private item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .makeUnDiscoverable() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .makeUnDiscoverable() + .build(); String token = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", true); + ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", "true"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // make discoverable with anonymous user getClient().perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); } @Test @@ -807,41 +807,41 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One private item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .makeUnDiscoverable() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .makeUnDiscoverable() + .build(); String token = getAuthToken(eperson.getEmail(), password); String tokenAdmin = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", true); + ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", "true"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // make discoverable with anonymous user getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); // check item status after the patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); } @Test @@ -851,41 +851,41 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); String token = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", false); + ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", "false"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // make private getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); } @@ -896,39 +896,39 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); String token = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", false); + ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", "false"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // make private with an anonymous user getClient().perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); // check item status after the failed patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); } @@ -939,40 +939,40 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); String token = getAuthToken(eperson.getEmail(), password); String tokenAdmin = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", false); + ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", "false"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); // make private getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); } @@ -983,30 +983,30 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); //3. One private item Item item2 = ItemBuilder.createItem(context, col1) - .withTitle("Not discoverable item 2") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .makeUnDiscoverable() - .build(); + .withTitle("Not discoverable item 2") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .makeUnDiscoverable() + .build(); String token = getAuthToken(admin.getEmail(), password); @@ -1016,15 +1016,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { String patchBody = getPatchContent(ops); getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); List ops2 = new ArrayList(); ReplaceOperation replaceOperation2 = new ReplaceOperation("/discoverable", null); @@ -1032,15 +1032,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { String patchBody2 = getPatchContent(ops); getClient(token).perform(patch("/api/core/items/" + item2.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item2.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item2.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item2.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); } From d51493a1a347c97a2e3bc6ca6f6047b0bf269373 Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Thu, 27 Sep 2018 15:35:36 -0700 Subject: [PATCH 058/193] Rolling back indentation changes in ItemRestRepositoryIT. Reverting indentation changes in ItemRestRepositoryIT. More updates to indentation. Corrected line length errors in ItemRestRepositoryIT. Final formatting updates for ItemRestRepositoryIT. --- .../dspace/app/rest/ItemRestRepositoryIT.java | 646 +++++++++--------- 1 file changed, 334 insertions(+), 312 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java index 30cecd98a3..ea661cd266 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java @@ -89,11 +89,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(token).perform(get("/api/core/items")) .andExpect(status().isOk()) .andExpect(jsonPath("$._embedded.items", Matchers.containsInAnyOrder( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17"), - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13"), - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, "Public item 3", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17"), + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13"), + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, + "Public item 3", "2016-02-13") ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) .andExpect(jsonPath("$.page.size", is(20))) .andExpect(jsonPath("$.page.totalElements", is(3))) ; @@ -143,15 +147,19 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .param("size", "2")) .andExpect(status().isOk()) .andExpect(jsonPath("$._embedded.items", Matchers.containsInAnyOrder( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17"), - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17"), + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13") ))) .andExpect(jsonPath("$._embedded.items", Matchers.not( - Matchers.contains( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, "Public item 3", "2016-02-13") - ) + Matchers.contains( + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, + "Public item 3", "2016-02-13") + ) ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) ; getClient(token).perform(get("/api/core/items") @@ -159,15 +167,19 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .param("page", "1")) .andExpect(status().isOk()) .andExpect(jsonPath("$._embedded.items", Matchers.contains( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, "Public item 3", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, + "Public item 3", "2016-02-13") ))) .andExpect(jsonPath("$._embedded.items", Matchers.not( Matchers.contains( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17"), - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17"), + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13") ) ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) .andExpect(jsonPath("$.page.size", is(2))) .andExpect(jsonPath("$.page.totalElements", is(3))) ; @@ -214,14 +226,17 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient().perform(get("/api/core/items/" + publicItem1.getID())) .andExpect(status().isOk()) .andExpect(jsonPath("$", Matchers.is( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17") ))) .andExpect(jsonPath("$", Matchers.not( Matchers.is( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13") ) ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) ; } @@ -277,14 +292,18 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient().perform(get("/api/core/items/" + publicItem1.getID())) .andExpect(status().isOk()) .andExpect(jsonPath("$", Matchers.is( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17") + ItemMatcher + .matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17") ))) .andExpect(jsonPath("$", Matchers.not( Matchers.is( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13") ) ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) ; getClient().perform(get("/api/core/items/" + publicItem1.getID() + "/bitstreams")) @@ -297,7 +316,8 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient().perform(get("/api/core/items/" + publicItem1.getID() + "/owningCollection")) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/collections"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/collections"))) ; getClient().perform(get("/api/core/items/" + publicItem1.getID() + "/templateItemOf")) @@ -335,21 +355,21 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); // A token must be provided for withdraw operation. The person // is used in the provenance note. @@ -362,28 +382,28 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // withdraw item getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); // item already withdrawn, no-op, 200 response getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); } @Test @@ -393,21 +413,21 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); List ops = new ArrayList(); ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", "true"); @@ -416,19 +436,19 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // withdraw item getClient().perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); // use the admin to be sure to get the item status String tokenAdmin = getAuthToken(eperson.getEmail(), password); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); } @Test @@ -438,21 +458,21 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); // try to use an unauthorized user String token = getAuthToken(eperson.getEmail(), password); @@ -464,19 +484,19 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // withdraw item getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); // use the admin to be sure to get the item status String tokenAdmin = getAuthToken(eperson.getEmail(), password); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); } @Test @@ -486,64 +506,64 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); // we need to set a current user as the withdrawn operation use it to add provenance information context.setCurrentUser(admin); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); //2. One withdrawn item Item item2 = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .withdrawn() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .withdrawn() + .build(); String token = getAuthToken(admin.getEmail(), password); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", ""); + ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", null); ops.add(replaceOperation); String patchBody = getPatchContent(ops); getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item2.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item2.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item2.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); } @Test @@ -553,25 +573,25 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); // we need to set a current user as the withdrawn operation use it to add provenance information context.setCurrentUser(admin); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .withdrawn() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .withdrawn() + .build(); // A token must be provided for reinstate operation. The person // is used in the provenance note. @@ -583,28 +603,28 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { String patchBody = getPatchContent(ops); getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); // reinstate an already installed item is a no-op getClient(token).perform(patch("/api/core/items/" + item.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) - .andExpect(jsonPath("$.inArchive", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(false))) + .andExpect(jsonPath("$.inArchive", Matchers.is(true))); } @Test @@ -614,25 +634,25 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); // we need to set a current user as the withdrawn operation use it to add provenance information context.setCurrentUser(admin); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .withdrawn() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .withdrawn() + .build(); String tokenAdmin = getAuthToken(admin.getEmail(), password); @@ -643,16 +663,16 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make an anonymous request getClient().perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); } @Test @@ -662,25 +682,25 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); // we need to set a current user as the withdrawn operation use it to add provenance information context.setCurrentUser(admin); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .withdrawn() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .withdrawn() + .build(); String token = getAuthToken(eperson.getEmail(), password); String tokenAdmin = getAuthToken(admin.getEmail(), password); @@ -692,16 +712,16 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make a request with an unauthorized user getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) - .andExpect(jsonPath("$.inArchive", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.withdrawn", Matchers.is(true))) + .andExpect(jsonPath("$.inArchive", Matchers.is(false))); } @Test @@ -711,21 +731,21 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One private item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .makeUnDiscoverable() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .makeUnDiscoverable() + .build(); String token = getAuthToken(admin.getEmail(), password); @@ -736,25 +756,25 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make discoverable getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); // make discoverable an already discoverable item is a no-op getClient(token).perform(patch("/api/core/items/" + item.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); } @Test @@ -764,21 +784,21 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One private item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .makeUnDiscoverable() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .makeUnDiscoverable() + .build(); String token = getAuthToken(admin.getEmail(), password); @@ -789,15 +809,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make discoverable with anonymous user getClient().perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); } @Test @@ -807,21 +827,21 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One private item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .makeUnDiscoverable() - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .makeUnDiscoverable() + .build(); String token = getAuthToken(eperson.getEmail(), password); String tokenAdmin = getAuthToken(admin.getEmail(), password); @@ -833,15 +853,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make discoverable with anonymous user getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); // check item status after the patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); } @Test @@ -851,20 +871,20 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); String token = getAuthToken(admin.getEmail(), password); @@ -875,17 +895,17 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make private getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); } @@ -896,20 +916,20 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); String token = getAuthToken(admin.getEmail(), password); @@ -920,15 +940,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make private with an anonymous user getClient().perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); // check item status after the failed patch getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); } @@ -939,20 +959,20 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); String token = getAuthToken(eperson.getEmail(), password); String tokenAdmin = getAuthToken(admin.getEmail(), password); @@ -964,15 +984,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make private getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); } @@ -983,30 +1003,30 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //** GIVEN ** //1. A community-collection structure with one parent community with sub-community and one collection. parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); + .withName("Parent Community") + .build(); Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); + .withName("Sub Community") + .build(); Collection col1 = CollectionBuilder.createCollection(context, child1) - .withName("Collection 1").build(); + .withName("Collection 1").build(); //2. One public item Item item = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); //3. One private item Item item2 = ItemBuilder.createItem(context, col1) - .withTitle("Not discoverable item 2") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .makeUnDiscoverable() - .build(); + .withTitle("Not discoverable item 2") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .makeUnDiscoverable() + .build(); String token = getAuthToken(admin.getEmail(), password); @@ -1016,15 +1036,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { String patchBody = getPatchContent(ops); getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(true))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(true))); List ops2 = new ArrayList(); ReplaceOperation replaceOperation2 = new ReplaceOperation("/discoverable", null); @@ -1032,15 +1052,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { String patchBody2 = getPatchContent(ops); getClient(token).perform(patch("/api/core/items/" + item2.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item2.getID())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item2.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item2.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); } @@ -1053,15 +1073,16 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { parentCommunity = CommunityBuilder.createCommunity(context) .withName("Parent Community") .build(); - Collection col1 = CollectionBuilder.createCollection(context, parentCommunity).withName("Collection 1").build(); + Collection col1 = CollectionBuilder + .createCollection(context, parentCommunity).withName("Collection 1").build(); //2. One public item, one workspace item and one template item. Item publicItem = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); //Add a bitstream to an item String bitstreamContent = "ThisIsSomeDummyText"; @@ -1083,13 +1104,13 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$._links.self.href", Matchers - .containsString("/api/core/items/" + publicItem.getID() + "/bitstreams"))); + .containsString("/api/core/items/" + publicItem.getID() + "/bitstreams"))); String token = getAuthToken(admin.getEmail(), password); //Delete public item getClient(token).perform(delete("/api/core/items/" + publicItem.getID())) - .andExpect(status().is(204)); + .andExpect(status().is(204)); //Trying to get deleted item should fail with 404 getClient().perform(get("/api/core/items/" + publicItem.getID())) @@ -1139,7 +1160,8 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .withName("Parent Community") .build(); - Collection col1 = CollectionBuilder.createCollection(context, parentCommunity).withName("Collection 1").build(); + Collection col1 = CollectionBuilder + .createCollection(context, parentCommunity).withName("Collection 1").build(); //2. One workspace item. WorkspaceItem workspaceItem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) @@ -1153,7 +1175,7 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //Check workspaceItem is available after failed deletion getClient(token).perform(get("/api/core/items/" + workspaceItem.getItem().getID())) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test @@ -1345,4 +1367,4 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { Matchers.containsString("/api/core/items"))); } -} +} \ No newline at end of file From 06b4e5d12a1895757d86750255ab8c5b8f461506 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Mon, 1 Oct 2018 13:59:29 +0200 Subject: [PATCH 059/193] [DS-4010] added IT tests for the query functionality on the discover endpoint --- .../app/rest/DiscoveryRestControllerIT.java | 186 +++++++++++++++++- 1 file changed, 185 insertions(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java index 7b3a8392e0..8aafbc915b 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java @@ -2680,7 +2680,7 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest } @Test - public void discoverSearchObjectsTestWithDateIssuedQuery() throws Exception { + public void discoverSearchObjectsTestWithDateIssuedQueryTest() throws Exception { //We turn off the authorization system in order to create the structure as defined below context.turnOffAuthorisationSystem(); @@ -2773,4 +2773,188 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest ; } + + @Test + public void discoverSearchObjectsTestWithLuceneSyntaxQueryTest() throws Exception { + //We turn off the authorization system in order to create the structure as defined below + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Test") + .withIssueDate("2010-10-17") + .withAuthor("Smith, Donald") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("TestItem2") + .withIssueDate("1990-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("azeazeazeazeazeaze") + .withIssueDate("2010-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane").withAuthor("test,test") + .withAuthor("test2, test2").withAuthor("Maybe, Maybe") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "((dc.date.issued:2010 OR dc.date.issued:1990-02-13)" + + " AND (dc.title:Test OR dc.title:TestItem2))")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + //The page object needs to look like this + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 2) + ))) + //This is the only item that should be returned with the query given + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.containsInAnyOrder( + SearchResultMatcher.matchOnItemName("item", "items", "Test"), + SearchResultMatcher.matchOnItemName("item", "items", "TestItem2") + ))) + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.not(Matchers.contains( + SearchResultMatcher.matchOnItemName("item", "items", "azeazeazeazeazeaze") + )))) + + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) + ; + + } + + @Test + public void discoverSearchObjectsTestWithEscapedLuceneCharactersTest() throws Exception { + //We turn off the authorization system in order to create the structure as defined below + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Faithful Infidel: Exploring Conformity (2nd edition)") + .withIssueDate("2010-10-17") + .withAuthor("Smith, Donald") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("Test") + .withIssueDate("1990-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("NotAProperTestTitle") + .withIssueDate("2010-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane").withAuthor("test,test") + .withAuthor("test2, test2").withAuthor("Maybe, Maybe") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "Faithful Infidel\\: Exploring Conformity \\(2nd edition\\)")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + //The page object needs to look like this + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 1) + ))) + //This is the only item that should be returned with the query given + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.contains( + SearchResultMatcher.matchOnItemName + ("item", "items", "Faithful Infidel: Exploring Conformity (2nd edition)") + ))) + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", + Matchers.not(Matchers.containsInAnyOrder( + SearchResultMatcher.matchOnItemName("item", "items", "Test"), + SearchResultMatcher.matchOnItemName("item", "items", "NotAProperTestTitle") + )))) + + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) + ; + + } + @Test + public void discoverSearchObjectsTestWithUnEscapedLuceneCharactersTest() throws Exception { + //We turn off the authorization system in order to create the structure as defined below + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Faithful Infidel: Exploring Conformity (2nd edition)") + .withIssueDate("2010-10-17") + .withAuthor("Smith, Donald") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("Test") + .withIssueDate("1990-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("NotAProperTestTitle") + .withIssueDate("2010-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane").withAuthor("test,test") + .withAuthor("test2, test2").withAuthor("Maybe, Maybe") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "OR")) + + .andExpect(status().isBadRequest()) + ; + + } } From 7e1ca49bcf31addbecedb432ed7185572056a5f7 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Mon, 1 Oct 2018 15:15:31 +0200 Subject: [PATCH 060/193] [DS-4010] fixed test case --- .../org/dspace/app/rest/DiscoveryRestControllerIT.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java index 8aafbc915b..f09663f4be 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java @@ -2881,9 +2881,8 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest .withSubject("AnotherTest").withSubject("TestingForMore") .withSubject("ExtraEntry") .build(); - //** WHEN ** getClient().perform(get("/api/discover/search/objects") - .param("query", "Faithful Infidel\\: Exploring Conformity \\(2nd edition\\)")) + .param("query", "\"Faithful Infidel: Exploring Conformity (2nd edition)\"")) //** THEN ** //The status has to be 200 OK @@ -2901,9 +2900,9 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest ))) .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.not(Matchers.containsInAnyOrder( - SearchResultMatcher.matchOnItemName("item", "items", "Test"), - SearchResultMatcher.matchOnItemName("item", "items", "NotAProperTestTitle") - )))) + SearchResultMatcher.matchOnItemName("item", "items", "Test"), + SearchResultMatcher.matchOnItemName("item", "items", "NotAProperTestTitle") + )))) //There always needs to be a self link available .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) From ca697e806475491e792ab9f98defcf4f794ce4b0 Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Mon, 1 Oct 2018 14:04:59 -0700 Subject: [PATCH 061/193] [DS-4021] Added patch method for EPerson. Implements patch operations for password, canLogin, requireCertificate and netid. Includes integration tests. --- .../repository/EPersonRestRepository.java | 30 + .../patch/EPersonOperationFactory.java | 68 +++ .../patch/ItemOperationFactory.java | 3 +- .../EPersonCertificateReplaceOperation.java | 64 +++ .../impl/EPersonLoginReplaceOperation.java | 68 +++ .../impl/EPersonNetidReplaceOperation.java | 57 ++ .../impl/EPersonPasswordReplaceOperation.java | 60 ++ .../impl/ItemWithdrawReplaceOperation.java | 4 +- .../repository/patch/impl/PatchOperation.java | 10 + .../app/rest/EPersonRestRepositoryIT.java | 522 +++++++++++++----- 10 files changed, 732 insertions(+), 154 deletions(-) create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonOperationFactory.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonCertificateReplaceOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonLoginReplaceOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonNetidReplaceOperation.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonPasswordReplaceOperation.java diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java index 325965458b..694e09b77a 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java @@ -19,11 +19,16 @@ import org.apache.commons.lang.StringUtils; import org.dspace.app.rest.Parameter; import org.dspace.app.rest.SearchRestMethod; import org.dspace.app.rest.converter.EPersonConverter; +import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.exception.RESTAuthorizationException; import org.dspace.app.rest.exception.UnprocessableEntityException; import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.MetadataEntryRest; import org.dspace.app.rest.model.hateoas.EPersonResource; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.app.rest.model.patch.Patch; +import org.dspace.app.rest.repository.patch.EPersonOperationFactory; +import org.dspace.app.rest.repository.patch.impl.ResourcePatchOperation; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.core.Context; @@ -34,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.data.rest.webmvc.ResourceNotFoundException; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Component; @@ -54,6 +60,9 @@ public class EPersonRestRepository extends DSpaceRestRepository operations = patch.getOperations(); + for (Operation operation : operations) { + + ResourcePatchOperation patchOperation = patchFactory.getPatchOperationForPath(operation.getPath()); + patchOperation.perform(context, eperson, operation); + + } + + } + @Override protected void delete(Context context, UUID id) throws AuthorizeException { EPerson eperson = null; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonOperationFactory.java new file mode 100644 index 0000000000..e3e0a02050 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonOperationFactory.java @@ -0,0 +1,68 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.repository.patch.impl.EPersonCertificateReplaceOperation; +import org.dspace.app.rest.repository.patch.impl.EPersonLoginReplaceOperation; +import org.dspace.app.rest.repository.patch.impl.EPersonNetidReplaceOperation; +import org.dspace.app.rest.repository.patch.impl.EPersonPasswordReplaceOperation; +import org.dspace.app.rest.repository.patch.impl.ResourcePatchOperation; +import org.dspace.eperson.EPerson; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Provides factory method for retrieving instances of eperson PatchOperations. + * + * @author Michael Spalti + */ +@Component +public class EPersonOperationFactory { + + @Autowired + EPersonPasswordReplaceOperation passwordReplaceOperation; + + @Autowired + EPersonLoginReplaceOperation loginReplaceOperation; + + @Autowired + EPersonCertificateReplaceOperation certificateReplaceOperation; + + @Autowired + EPersonNetidReplaceOperation netidReplaceOperation; + + private static final String OPERATION_PASSWORD_CHANGE = "/password"; + private static final String OPERATION_CAN_LOGIN = "/canLogin"; + private static final String OPERATION_REQUIRE_CERTIFICATE = "/certificate"; + private static final String OPERATION_SET_NETID = "/netid"; + + /** + * Returns the PatchOperation instance for the operation based on + * the operation path. + * + * @param path the operation path + * @return + */ + public ResourcePatchOperation getPatchOperationForPath(String path) { + + switch (path) { + case OPERATION_PASSWORD_CHANGE: + return passwordReplaceOperation; + case OPERATION_CAN_LOGIN: + return loginReplaceOperation; + case OPERATION_REQUIRE_CERTIFICATE: + return certificateReplaceOperation; + case OPERATION_SET_NETID: + return netidReplaceOperation; + default: + throw new PatchBadRequestException("Missing or illegal patch operation for: " + path); + } + } + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java index 9b8341be36..e3bd071971 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java @@ -33,7 +33,8 @@ public class ItemOperationFactory { private static final String OPERATION_PATH_DISCOVERABLE = "/discoverable"; /** - * Returns the PatchOperation for the operation. + * Returns the PatchOperation instance for the operation based on the + * operation path. * @param path * @return */ diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonCertificateReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonCertificateReplaceOperation.java new file mode 100644 index 0000000000..7329266339 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonCertificateReplaceOperation.java @@ -0,0 +1,64 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.impl; + +import java.sql.SQLException; + +import org.apache.commons.lang.BooleanUtils; +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.springframework.stereotype.Component; + +/** + * Implementation for EPerson requres certificate patches. + * + * Example: + * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H " + * Content-Type: application/json" -d '[{ "op": "replace", "path": " + * /certificate", "value": "true|false"]' + * + * + * @author Michael Spalti + */ +@Component +public class EPersonCertificateReplaceOperation extends PatchOperation + implements ResourcePatchOperation { + @Override + public void perform(Context context, EPerson resource, Operation operation) + throws SQLException, AuthorizeException, PatchBadRequestException { + + replace(context, resource, operation); + } + + private void replace(Context context, EPerson eperson, Operation operation) + throws PatchBadRequestException, SQLException, AuthorizeException { + + Boolean requireCert = BooleanUtils.toBooleanObject((String) operation.getValue()); + + if (requireCert == null) { + // this check can be probably moved in the AbstractResourcePatch class as it is mandate by the json+patch + // specification + throw new PatchBadRequestException("Boolean value not provided for certificate operation."); + } + eperson.setRequireCertificate(requireCert); + + } + + @Override + protected Class getArrayClassForEvaluation() { + return null; + } + + @Override + protected Class getClassForEvaluation() { + return null; + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonLoginReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonLoginReplaceOperation.java new file mode 100644 index 0000000000..a9f89eb2ef --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonLoginReplaceOperation.java @@ -0,0 +1,68 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.impl; + +import java.sql.SQLException; + +import org.apache.commons.lang.BooleanUtils; +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.eperson.service.EPersonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Implementation for EPerson canLogin patches. + * + * Example: + * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H " + * Content-Type: application/json" -d '[{ "op": "replace", "path": " + * /canLogin", "value": "true|false"]' + * + * + * @author Michael Spalti + */ +@Component +public class EPersonLoginReplaceOperation extends PatchOperation + implements ResourcePatchOperation { + + @Autowired + EPersonService epersonService; + + @Override + public void perform(Context context, EPerson resource, Operation operation) + throws PatchBadRequestException, SQLException, AuthorizeException { + + replace(context, resource, operation); + } + + private void replace(Context context, EPerson eperson, Operation operation) + throws PatchBadRequestException, SQLException, AuthorizeException { + + Boolean canLogin = BooleanUtils.toBooleanObject((String) operation.getValue()); + + if (canLogin == null) { + throw new PatchBadRequestException("Boolean value not provided for canLogin operation."); + } + eperson.setCanLogIn(canLogin); + + } + + @Override + protected Class getArrayClassForEvaluation() { + return String[].class; + } + + @Override + protected Class getClassForEvaluation() { + return String.class; + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonNetidReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonNetidReplaceOperation.java new file mode 100644 index 0000000000..2eb9d88b71 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonNetidReplaceOperation.java @@ -0,0 +1,57 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.impl; + +import java.sql.SQLException; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.springframework.stereotype.Component; + +/** + * Implementation for EPerson netid patches. + * + * Example: + * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H " + * Content-Type: application/json" -d '[{ "op": "replace", "path": " + * /netid", "value": "newNetId"]' + * + * + * @author Michael Spalti + */ +@Component +public class EPersonNetidReplaceOperation extends PatchOperation + implements ResourcePatchOperation { + + @Override + public void perform(Context context, EPerson resource, Operation operation) + throws SQLException, AuthorizeException, PatchBadRequestException { + + replace(context, resource, operation); + } + + private void replace(Context context, EPerson eperson, Operation operation) + throws PatchBadRequestException, SQLException, AuthorizeException { + + checkOperationValue((String) operation.getValue()); + eperson.setNetid((String) operation.getValue()); + } + + @Override + protected Class getArrayClassForEvaluation() { + return String[].class; + } + + @Override + protected Class getClassForEvaluation() { + return String.class; + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonPasswordReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonPasswordReplaceOperation.java new file mode 100644 index 0000000000..88d60ea48c --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonPasswordReplaceOperation.java @@ -0,0 +1,60 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.impl; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.eperson.service.EPersonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Implementation for EPerson password patches. + * + * Example: + * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H " + * Content-Type: application/json" -d '[{ "op": "replace", "path": " + * /password", "value": "newpassword"]' + * + * + * @author Michael Spalti + */ +@Component +public class EPersonPasswordReplaceOperation extends PatchOperation + implements ResourcePatchOperation { + + @Autowired + EPersonService epersonService; + + @Override + public void perform(Context context, EPerson resource, Operation operation) + throws PatchBadRequestException { + + replace(context, resource, operation); + } + + private void replace(Context context, EPerson ePerson, Operation operation) throws PatchBadRequestException { + + checkOperationValue((String) operation.getValue()); + + epersonService.setPassword(ePerson, (String) operation.getValue()); + + } + + @Override + protected Class getArrayClassForEvaluation() { + return String[].class; + } + + @Override + protected Class getClassForEvaluation() { + return String.class; + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java index 8aadc738a7..927702dd33 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java @@ -56,7 +56,7 @@ public class ItemWithdrawReplaceOperation extends PatchOperation { public void perform(Context context, Item item, Operation operation) throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - replace(item, context, (String) operation.getValue()); + replace(context, item, (String) operation.getValue()); } @@ -71,7 +71,7 @@ public class ItemWithdrawReplaceOperation extends PatchOperation { * @throws SQLException * @throws AuthorizeException */ - private void replace(Item item, Context context, Object value) + private void replace(Context context, Item item, Object value) throws PatchBadRequestException, SQLException, AuthorizeException { Boolean withdraw = BooleanUtils.toBooleanObject((String) value); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java index 1236db1d7b..d3eff10711 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java @@ -47,6 +47,16 @@ public abstract class PatchOperation return single; } + /** + * Throws PatchBadRequestException for missing operation value. + * @param value the value to check + */ + public void checkOperationValue(T value) { + if (value == null) { + throw new PatchBadRequestException("No value provided for the operation."); + } + } + protected abstract Class getArrayClassForEvaluation(); protected abstract Class getClassForEvaluation(); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index 12eb895ce3..3f6446573b 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -13,13 +13,17 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.UUID; +import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.databind.ObjectMapper; import org.dspace.app.rest.builder.CollectionBuilder; @@ -30,6 +34,8 @@ import org.dspace.app.rest.matcher.EPersonMatcher; import org.dspace.app.rest.matcher.EPersonMetadataMatcher; import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.MetadataEntryRest; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.app.rest.model.patch.ReplaceOperation; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.content.Collection; import org.dspace.content.Item; @@ -39,7 +45,6 @@ import org.junit.Ignore; import org.junit.Test; - public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { @Test @@ -60,23 +65,23 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(post("/api/eperson/epersons") - .content(mapper.writeValueAsBytes(data)) - .contentType(contentType)) - .andExpect(status().isCreated()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", Matchers.allOf( - hasJsonPath("$.uuid", not(empty())), - // is it what you expect? EPerson.getName() returns the email... - //hasJsonPath("$.name", is("Doe John")), - hasJsonPath("$.email", is("createtest@fake-email.com")), - hasJsonPath("$.type", is("eperson")), - hasJsonPath("$.canLogIn", is(true)), - hasJsonPath("$.requireCertificate", is(false)), - hasJsonPath("$._links.self.href", not(empty())), - hasJsonPath("$.metadata", Matchers.containsInAnyOrder( - EPersonMetadataMatcher.matchFirstName("John"), - EPersonMetadataMatcher.matchLastName("Doe") - ))))); + .content(mapper.writeValueAsBytes(data)) + .contentType(contentType)) + .andExpect(status().isCreated()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", Matchers.allOf( + hasJsonPath("$.uuid", not(empty())), + // is it what you expect? EPerson.getName() returns the email... + //hasJsonPath("$.name", is("Doe John")), + hasJsonPath("$.email", is("createtest@fake-email.com")), + hasJsonPath("$.type", is("eperson")), + hasJsonPath("$.canLogIn", is(true)), + hasJsonPath("$.requireCertificate", is(false)), + hasJsonPath("$._links.self.href", not(empty())), + hasJsonPath("$.metadata", Matchers.containsInAnyOrder( + EPersonMetadataMatcher.matchFirstName("John"), + EPersonMetadataMatcher.matchLastName("Doe") + ))))); // TODO cleanup the context!!! } @@ -91,15 +96,15 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/eperson")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( - EPersonMatcher.matchEPersonEntry(newUser), - EPersonMatcher.matchEPersonOnEmail(admin.getEmail()), - EPersonMatcher.matchEPersonOnEmail(eperson.getEmail()) - ))) - .andExpect(jsonPath("$.page.size", is(20))) - .andExpect(jsonPath("$.page.totalElements", is(3))) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( + EPersonMatcher.matchEPersonEntry(newUser), + EPersonMatcher.matchEPersonOnEmail(admin.getEmail()), + EPersonMatcher.matchEPersonOnEmail(eperson.getEmail()) + ))) + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(3))) ; getClient().perform(get("/api/eperson/epersons")) @@ -139,41 +144,41 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { context.turnOffAuthorisationSystem(); EPerson testEPerson = EPersonBuilder.createEPerson(context) - .withNameInMetadata("John", "Doe") - .withEmail("Johndoe@fake-email.com") - .build(); + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); String authToken = getAuthToken(admin.getEmail(), password); // using size = 2 the first page will contains our test user and admin getClient(authToken).perform(get("/api/eperson/epersons") - .param("size", "2")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( - EPersonMatcher.matchEPersonEntry(admin), - EPersonMatcher.matchEPersonEntry(testEPerson) - ))) - .andExpect(jsonPath("$._embedded.epersons", Matchers.not( - Matchers.contains( - EPersonMatcher.matchEPersonEntry(admin) - ) - ))) - .andExpect(jsonPath("$.page.size", is(2))) - .andExpect(jsonPath("$.page.totalElements", is(3))) + .param("size", "2")) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( + EPersonMatcher.matchEPersonEntry(admin), + EPersonMatcher.matchEPersonEntry(testEPerson) + ))) + .andExpect(jsonPath("$._embedded.epersons", Matchers.not( + Matchers.contains( + EPersonMatcher.matchEPersonEntry(admin) + ) + ))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$.page.totalElements", is(3))) ; // using size = 2 the first page will contains our test user and admin getClient(authToken).perform(get("/api/eperson/epersons") - .param("size", "2") - .param("page", "1")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.contains( - EPersonMatcher.matchEPersonEntry(eperson) - ))) - .andExpect(jsonPath("$._embedded.epersons", Matchers.hasSize(1))) - .andExpect(jsonPath("$.page.size", is(2))) - .andExpect(jsonPath("$.page.totalElements", is(3))) + .param("size", "2") + .param("page", "1")) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.contains( + EPersonMatcher.matchEPersonEntry(eperson) + ))) + .andExpect(jsonPath("$._embedded.epersons", Matchers.hasSize(1))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$.page.totalElements", is(3))) ; getClient().perform(get("/api/eperson/epersons")) @@ -198,16 +203,16 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/" + ePerson2.getID())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonEntry(ePerson2) - ))) - .andExpect(jsonPath("$", Matchers.not( - is( - EPersonMatcher.matchEPersonEntry(ePerson) - ) - ))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonEntry(ePerson2) + ))) + .andExpect(jsonPath("$", Matchers.not( + is( + EPersonMatcher.matchEPersonEntry(ePerson) + ) + ))); } @@ -227,18 +232,18 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/" + ePerson2.getID())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonEntry(ePerson2) - ))) - .andExpect(jsonPath("$", Matchers.not( - is( - EPersonMatcher.matchEPersonEntry(eperson) - ) - ))) - .andExpect(jsonPath("$._links.self.href", - Matchers.containsString("/api/eperson/epersons/" + ePerson2.getID()))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonEntry(ePerson2) + ))) + .andExpect(jsonPath("$", Matchers.not( + is( + EPersonMatcher.matchEPersonEntry(eperson) + ) + ))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/eperson/epersons/" + ePerson2.getID()))); //EPerson can only access himself @@ -249,13 +254,13 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(epersonToken).perform(get("/api/eperson/epersons/" + eperson.getID())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonOnEmail(eperson.getEmail()) - ))) - .andExpect(jsonPath("$._links.self.href", - Matchers.containsString("/api/eperson/epersons/" + eperson.getID()))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonOnEmail(eperson.getEmail()) + ))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/eperson/epersons/" + eperson.getID()))); } @@ -264,18 +269,18 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { context.turnOffAuthorisationSystem(); EPerson testEPerson1 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("John", "Doe") - .withEmail("Johndoe@fake-email.com") - .build(); + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); EPerson testEPerson2 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Jane", "Smith") - .withEmail("janesmith@fake-email.com") - .build(); + .withNameInMetadata("Jane", "Smith") + .withEmail("janesmith@fake-email.com") + .build(); String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/" + UUID.randomUUID())) - .andExpect(status().isNotFound()); + .andExpect(status().isNotFound()); } @@ -283,13 +288,13 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { public void searchMethodsExist() throws Exception { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons")) - .andExpect(jsonPath("$._links.search.href", Matchers.notNullValue())); + .andExpect(jsonPath("$._links.search.href", Matchers.notNullValue())); getClient(authToken).perform(get("/api/eperson/epersons/search")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._links.byEmail", Matchers.notNullValue())) - .andExpect(jsonPath("$._links.byName", Matchers.notNullValue())); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._links.byEmail", Matchers.notNullValue())) + .andExpect(jsonPath("$._links.byName", Matchers.notNullValue())); } @Test @@ -310,21 +315,21 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail") - .param("email", ePerson.getEmail())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonEntry(ePerson) - ))); + .param("email", ePerson.getEmail())) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonEntry(ePerson) + ))); // it must be case-insensitive getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail") .param("email", ePerson.getEmail().toUpperCase())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonEntry(ePerson) - ))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonEntry(ePerson) + ))); } @Test @@ -332,14 +337,14 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail") .param("email", "undefined@undefined.com")) - .andExpect(status().isNotFound()); + .andExpect(status().isNotFound()); } @Test public void findByEmailUnprocessable() throws Exception { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail")) - .andExpect(status().isUnprocessableEntity()); + .andExpect(status().isUnprocessableEntity()); } @Test @@ -356,45 +361,45 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .build(); EPerson ePerson3 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Tom", "Doe") - .withEmail("tomdoe@fake-email.com") - .build(); + .withNameInMetadata("Tom", "Doe") + .withEmail("tomdoe@fake-email.com") + .build(); EPerson ePerson4 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Dirk", "Doe-Postfix") - .withEmail("dirkdoepostfix@fake-email.com") - .build(); + .withNameInMetadata("Dirk", "Doe-Postfix") + .withEmail("dirkdoepostfix@fake-email.com") + .build(); EPerson ePerson5 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Harry", "Prefix-Doe") - .withEmail("harrydoeprefix@fake-email.com") - .build(); + .withNameInMetadata("Harry", "Prefix-Doe") + .withEmail("harrydoeprefix@fake-email.com") + .build(); String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byName") - .param("q", ePerson.getLastName())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( - EPersonMatcher.matchEPersonEntry(ePerson), - EPersonMatcher.matchEPersonEntry(ePerson3), - EPersonMatcher.matchEPersonEntry(ePerson4), - EPersonMatcher.matchEPersonEntry(ePerson5) - ))) - .andExpect(jsonPath("$.page.totalElements", is(4))); + .param("q", ePerson.getLastName())) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( + EPersonMatcher.matchEPersonEntry(ePerson), + EPersonMatcher.matchEPersonEntry(ePerson3), + EPersonMatcher.matchEPersonEntry(ePerson4), + EPersonMatcher.matchEPersonEntry(ePerson5) + ))) + .andExpect(jsonPath("$.page.totalElements", is(4))); // it must be case insensitive getClient(authToken).perform(get("/api/eperson/epersons/search/byName") .param("q", ePerson.getLastName().toLowerCase())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( - EPersonMatcher.matchEPersonEntry(ePerson), - EPersonMatcher.matchEPersonEntry(ePerson3), - EPersonMatcher.matchEPersonEntry(ePerson4), - EPersonMatcher.matchEPersonEntry(ePerson5) - ))) - .andExpect(jsonPath("$.page.totalElements", is(4))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( + EPersonMatcher.matchEPersonEntry(ePerson), + EPersonMatcher.matchEPersonEntry(ePerson3), + EPersonMatcher.matchEPersonEntry(ePerson4), + EPersonMatcher.matchEPersonEntry(ePerson5) + ))) + .andExpect(jsonPath("$.page.totalElements", is(4))); } @Test @@ -402,16 +407,16 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byName") .param("q", "Doe, John")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$.page.totalElements", is(0))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test public void findByNameUnprocessable() throws Exception { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byName")) - .andExpect(status().isUnprocessableEntity()); + .andExpect(status().isUnprocessableEntity()); } @Test @@ -426,11 +431,11 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { // Delete getClient(token).perform(delete("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().is(204)); + .andExpect(status().is(204)); // Verify 404 after delete getClient().perform(get("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isNotFound()); + .andExpect(status().isNotFound()); } @Test @@ -446,14 +451,14 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { // Delete using an unauthorized user getClient(token).perform(delete("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isForbidden()); + .andExpect(status().isForbidden()); // login as admin String adminToken = getAuthToken(admin.getEmail(), password); // Verify the eperson is still here getClient(adminToken).perform(get("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test @@ -466,14 +471,14 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { // Delete as anonymous user getClient().perform(delete("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); // login as admin String adminToken = getAuthToken(admin.getEmail(), password); // Verify the eperson is still here getClient(adminToken).perform(get("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Ignore @@ -483,9 +488,9 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { context.turnOffAuthorisationSystem(); EPerson ePerson = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Sample", "Submitter") - .withEmail("submitter@fake-email.com") - .build(); + .withNameInMetadata("Sample", "Submitter") + .withEmail("submitter@fake-email.com") + .build(); // force the use of the new user for subsequent operation context.setCurrentUser(ePerson); @@ -507,11 +512,226 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { // 422 error when trying to DELETE the eperson=submitter getClient(token).perform(delete("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().is(422)); + .andExpect(status().is(422)); // Verify the eperson is still here getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isOk()); + .andExpect(status().isOk()); + } + + @Test + public void patchNetId() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // update net id + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is("newNetId"))); + + } + + + @Test + public void patchNetIdMissingValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", null); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // should return bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + } + + @Test + public void patchCanLogin() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/canLogin", "true"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // updates canLogIn to true + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))); + + } + + @Test + public void patchCanLoginMissingValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/canLogin", null); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // should return bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + + } + + @Test + public void patchRequireCertificate() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/certificate", "false"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // updates requireCertificate to false + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(false))); + + } + + @Test + public void patchRequireCertificateMissingValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/certificate", null); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // should return bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + } + + @Test + public void patchPassword() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + String newPassword = "newpassword"; + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/password", newPassword); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // updates password + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()); + + // login with new password + // TODO is this a valid test? + token = getAuthToken(ePerson.getEmail(), newPassword); + getClient(token).perform(get("/api/")) + .andExpect(status().isOk()); + + } + + @Test + public void patchPasswordMissingValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/password", null); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // should return bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + } } From aacb7b0ee38bc2f3e9b623fa1b883b4f804d1dd4 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Tue, 2 Oct 2018 08:09:02 +0200 Subject: [PATCH 062/193] [DS-3991] changed the default name of a downloaded file to content in the client.js --- dspace-spring-rest/src/main/webapp/js/hal/http/client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/main/webapp/js/hal/http/client.js b/dspace-spring-rest/src/main/webapp/js/hal/http/client.js index f4120f230c..20f80156aa 100644 --- a/dspace-spring-rest/src/main/webapp/js/hal/http/client.js +++ b/dspace-spring-rest/src/main/webapp/js/hal/http/client.js @@ -36,7 +36,7 @@ function downloadFile(url) { // Try to find out the filename from the content disposition `filename` value var disposition = request.getResponseHeader('content-disposition'); var matches = /"([^"]*)"/.exec(disposition); - var filename = (matches != null && matches[1] ? matches[1] : 'file.pdf'); + var filename = (matches != null && matches[1] ? matches[1] : 'content'); // The actual download var contentTypeHeader = request.getResponseHeader("content-type"); if (contentTypeHeader === undefined || contentTypeHeader === "") { From 1f091bd6bd76659aa599c143ab77fe5bbcc9bb3e Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Mon, 1 Oct 2018 23:16:05 -0700 Subject: [PATCH 063/193] DS-4021 Reintroduce abstract and implementation classes for patch operations. Prior to this commit, the factory implementations used only path and value, ignoring the operation name. This commit reintroduces default implementations operations (add, move, remove, replace) and working implementations for eperson and item replace operations. The factory methods are now designed to be used specifically for replace operations. As needed, new factory methods can be added. --- .../repository/EPersonRestRepository.java | 12 +- .../rest/repository/ItemRestRepository.java | 12 +- .../patch/AbstractResourcePatch.java | 109 ++++++++++++++++++ .../rest/repository/patch/EPersonPatch.java | 39 +++++++ .../app/rest/repository/patch/ItemPatch.java | 39 +++++++ .../EPersonOperationFactory.java | 18 +-- .../{ => factories}/ItemOperationFactory.java | 14 +-- .../EPersonCertificateReplaceOperation.java | 2 +- .../impl/EPersonLoginReplaceOperation.java | 2 +- .../impl/EPersonNetidReplaceOperation.java | 2 +- .../impl/EPersonPasswordReplaceOperation.java | 2 +- .../ItemDiscoverableReplaceOperation.java | 2 +- .../impl/ItemWithdrawReplaceOperation.java | 2 +- .../{ => factories}/impl/PatchOperation.java | 2 +- .../impl/ResourcePatchOperation.java | 2 +- 15 files changed, 217 insertions(+), 42 deletions(-) create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/EPersonOperationFactory.java (69%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/ItemOperationFactory.java (68%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/impl/EPersonCertificateReplaceOperation.java (97%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/impl/EPersonLoginReplaceOperation.java (97%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/impl/EPersonNetidReplaceOperation.java (96%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/impl/EPersonPasswordReplaceOperation.java (96%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/impl/ItemDiscoverableReplaceOperation.java (97%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/impl/ItemWithdrawReplaceOperation.java (98%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/impl/PatchOperation.java (97%) rename dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/{ => factories}/impl/ResourcePatchOperation.java (92%) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java index 694e09b77a..5da7479903 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java @@ -27,8 +27,7 @@ import org.dspace.app.rest.model.MetadataEntryRest; import org.dspace.app.rest.model.hateoas.EPersonResource; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.model.patch.Patch; -import org.dspace.app.rest.repository.patch.EPersonOperationFactory; -import org.dspace.app.rest.repository.patch.impl.ResourcePatchOperation; +import org.dspace.app.rest.repository.patch.EPersonPatch; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.core.Context; @@ -61,7 +60,7 @@ public class EPersonRestRepository extends DSpaceRestRepository operations = patch.getOperations(); - for (Operation operation : operations) { - - ResourcePatchOperation patchOperation = patchFactory.getPatchOperationForPath(operation.getPath()); - patchOperation.perform(context, eperson, operation); - - } + epersonPatch.patch(eperson, context, operations); } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java index c3383d2ef7..48785953f9 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java @@ -23,8 +23,7 @@ import org.dspace.app.rest.model.ItemRest; import org.dspace.app.rest.model.hateoas.ItemResource; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.model.patch.Patch; -import org.dspace.app.rest.repository.patch.ItemOperationFactory; -import org.dspace.app.rest.repository.patch.impl.ResourcePatchOperation; +import org.dspace.app.rest.repository.patch.ItemPatch; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Item; import org.dspace.content.service.ItemService; @@ -55,7 +54,7 @@ public class ItemRestRepository extends DSpaceRestRepository { ItemConverter converter; @Autowired - ItemOperationFactory patchFactory; + ItemPatch itemPatch; public ItemRestRepository() { @@ -109,12 +108,7 @@ public class ItemRestRepository extends DSpaceRestRepository { } List operations = patch.getOperations(); - for (Operation operation : operations) { - - ResourcePatchOperation patchOperation = patchFactory.getPatchOperationForPath(operation.getPath()); - patchOperation.perform(context, item, operation); - - } + itemPatch.patch(item, context, operations); } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java new file mode 100644 index 0000000000..15684006f7 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java @@ -0,0 +1,109 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch; + +import java.sql.SQLException; +import java.util.List; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.content.DSpaceObject; +import org.dspace.core.Context; + +/** + * The base class for resource PATCH operations. + * + * @author Michael Spalti + */ +public abstract class AbstractResourcePatch { + + /** + * Handles the patch operations, delegating actions to sub-class implementations. If no sub-class method + * is provided, the default method throws a UnprocessableEntityException. + * + * @param dspaceObject the DSO to patch + * @param context + * @param operations + * @throws UnprocessableEntityException + * @throws PatchBadRequestException + * @throws SQLException + * @throws AuthorizeException + */ + public void patch(DSO dspaceObject, Context context, List operations) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + + // List operations = patch.getOperations(); + + // Note: the list of possible operations is taken from JsonPatchConverter class. Does not implement + // test https://tools.ietf.org/html/rfc6902#section-4.6 + ops: for (Operation op : operations) { + switch (op.getOp()) { + case "add": + add(dspaceObject, context, op); + continue ops; + case "replace": + replace(dspaceObject, context, op); + continue ops; + case "remove": + remove(dspaceObject, context, op); + continue ops; + case "copy": + copy(dspaceObject, context, op); + continue ops; + case "move": + move(dspaceObject, context, op); + continue ops; + default: + // JsonPatchConverter should have thrown error before this point. + throw new PatchBadRequestException("Missing or illegal patch operation: " + op.getOp()); + } + } + } + // The default patch methods throw an error when no sub-class implementation is provided. + + protected void add(DSO dspaceObject, Context context, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + throw new UnprocessableEntityException( + "The add operation is not supported." + ); + } + + protected void replace(DSO dspaceObject, Context context, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + // The replace operation is functionally identical to a "remove" operation for + // a value, followed immediately by an "add" operation at the same + // location with the replacement value. https://tools.ietf.org/html/rfc6902#section-4.3 + remove(dspaceObject, context, operation); + add(dspaceObject, context, operation); + } + + protected void remove(DSO dspaceObject, Context context, Operation operation) + + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + throw new UnprocessableEntityException( + "The remove operation is not supported." + ); + } + + protected void copy(DSO dspaceObject, Context context, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + throw new UnprocessableEntityException( + "The copy operation is not supported." + ); + } + + protected void move(DSO dspaceObject, Context context, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + throw new UnprocessableEntityException( + "The move operation is not supported." + ); + } + +} \ No newline at end of file diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java new file mode 100644 index 0000000000..6297671555 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java @@ -0,0 +1,39 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch; + +import java.sql.SQLException; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.app.rest.repository.patch.factories.EPersonOperationFactory; +import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Provides PATCH operation implementations for Items. + */ +@Component +public class EPersonPatch extends AbstractResourcePatch { + + @Autowired + EPersonOperationFactory patchFactory; + + protected void replace(EPerson eperson, Context context, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + + ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); + patchOperation.perform(context, eperson, operation); + + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java new file mode 100644 index 0000000000..dfa8ec9c56 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java @@ -0,0 +1,39 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch; + +import java.sql.SQLException; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.app.rest.repository.patch.factories.ItemOperationFactory; +import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation; +import org.dspace.authorize.AuthorizeException; +import org.dspace.content.Item; +import org.dspace.core.Context; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Provides PATCH operation implementations for Items. + */ +@Component +public class ItemPatch extends AbstractResourcePatch { + + @Autowired + ItemOperationFactory patchFactory; + + protected void replace(Item item, Context context, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + + ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); + patchOperation.perform(context, item, operation); + + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java similarity index 69% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonOperationFactory.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java index e3e0a02050..837e440a93 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonOperationFactory.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java @@ -5,14 +5,14 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch; +package org.dspace.app.rest.repository.patch.factories; import org.dspace.app.rest.exception.PatchBadRequestException; -import org.dspace.app.rest.repository.patch.impl.EPersonCertificateReplaceOperation; -import org.dspace.app.rest.repository.patch.impl.EPersonLoginReplaceOperation; -import org.dspace.app.rest.repository.patch.impl.EPersonNetidReplaceOperation; -import org.dspace.app.rest.repository.patch.impl.EPersonPasswordReplaceOperation; -import org.dspace.app.rest.repository.patch.impl.ResourcePatchOperation; +import org.dspace.app.rest.repository.patch.factories.impl.EPersonCertificateReplaceOperation; +import org.dspace.app.rest.repository.patch.factories.impl.EPersonLoginReplaceOperation; +import org.dspace.app.rest.repository.patch.factories.impl.EPersonNetidReplaceOperation; +import org.dspace.app.rest.repository.patch.factories.impl.EPersonPasswordReplaceOperation; +import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation; import org.dspace.eperson.EPerson; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -43,13 +43,13 @@ public class EPersonOperationFactory { private static final String OPERATION_SET_NETID = "/netid"; /** - * Returns the PatchOperation instance for the operation based on + * Returns the PatchOperation instance for the replace operation, based on * the operation path. * * @param path the operation path * @return */ - public ResourcePatchOperation getPatchOperationForPath(String path) { + public ResourcePatchOperation getReplaceOperationForPath(String path) { switch (path) { case OPERATION_PASSWORD_CHANGE: @@ -61,7 +61,7 @@ public class EPersonOperationFactory { case OPERATION_SET_NETID: return netidReplaceOperation; default: - throw new PatchBadRequestException("Missing or illegal patch operation for: " + path); + throw new PatchBadRequestException("Missing patch operation for: " + path); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java similarity index 68% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java index e3bd071971..3596f01c2a 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemOperationFactory.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java @@ -5,12 +5,12 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch; +package org.dspace.app.rest.repository.patch.factories; import org.dspace.app.rest.exception.PatchBadRequestException; -import org.dspace.app.rest.repository.patch.impl.ItemDiscoverableReplaceOperation; -import org.dspace.app.rest.repository.patch.impl.ItemWithdrawReplaceOperation; -import org.dspace.app.rest.repository.patch.impl.ResourcePatchOperation; +import org.dspace.app.rest.repository.patch.factories.impl.ItemDiscoverableReplaceOperation; +import org.dspace.app.rest.repository.patch.factories.impl.ItemWithdrawReplaceOperation; +import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation; import org.dspace.content.Item; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -33,12 +33,12 @@ public class ItemOperationFactory { private static final String OPERATION_PATH_DISCOVERABLE = "/discoverable"; /** - * Returns the PatchOperation instance for the operation based on the + * Returns the PatchOperation instance for the replace operation, based on the * operation path. * @param path * @return */ - public ResourcePatchOperation getPatchOperationForPath(String path) { + public ResourcePatchOperation getReplaceOperationForPath(String path) { switch (path) { case OPERATION_PATH_DISCOVERABLE: @@ -46,7 +46,7 @@ public class ItemOperationFactory { case OPERATION_PATH_WITHDRAW: return itemWithdrawReplaceOperation; default: - throw new PatchBadRequestException("Missing or illegal patch operation for: " + path); + throw new PatchBadRequestException("Missing patch operation for: " + path); } } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonCertificateReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java similarity index 97% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonCertificateReplaceOperation.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java index 7329266339..46a52e0c97 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonCertificateReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch.impl; +package org.dspace.app.rest.repository.patch.factories.impl; import java.sql.SQLException; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonLoginReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java similarity index 97% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonLoginReplaceOperation.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java index a9f89eb2ef..62dd5f5cdd 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonLoginReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch.impl; +package org.dspace.app.rest.repository.patch.factories.impl; import java.sql.SQLException; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonNetidReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java similarity index 96% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonNetidReplaceOperation.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java index 2eb9d88b71..3e97b37cea 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonNetidReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch.impl; +package org.dspace.app.rest.repository.patch.factories.impl; import java.sql.SQLException; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonPasswordReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java similarity index 96% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonPasswordReplaceOperation.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java index 88d60ea48c..dbeed653a6 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/EPersonPasswordReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch.impl; +package org.dspace.app.rest.repository.patch.factories.impl; import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.model.patch.Operation; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemDiscoverableReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java similarity index 97% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemDiscoverableReplaceOperation.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java index 87076d9be4..b64d2654ac 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemDiscoverableReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch.impl; +package org.dspace.app.rest.repository.patch.factories.impl; import java.sql.SQLException; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java similarity index 98% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java index 927702dd33..e9cda8cbdd 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ItemWithdrawReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch.impl; +package org.dspace.app.rest.repository.patch.factories.impl; import java.sql.SQLException; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java similarity index 97% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java index d3eff10711..c435a7d0c0 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/PatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch.impl; +package org.dspace.app.rest.repository.patch.factories.impl; import java.sql.SQLException; import java.util.ArrayList; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ResourcePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java similarity index 92% rename from dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ResourcePatchOperation.java rename to dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java index e62d9085db..775bf45d90 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/impl/ResourcePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.repository.patch.impl; +package org.dspace.app.rest.repository.patch.factories.impl; import java.sql.SQLException; From ef8b0c642dd1bcfeb153904585ee146c7742aa7e Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Tue, 2 Oct 2018 10:43:28 -0700 Subject: [PATCH 064/193] [DS-4021] This commit includes code formatting and comment changes. Also a few minor modifications to patch operations. Minor code format changes. Final code formatting changes for EPersonRestRepositoryIT. --- .../rest/repository/patch/EPersonPatch.java | 13 +- .../app/rest/repository/patch/ItemPatch.java | 11 + .../factories/EPersonOperationFactory.java | 2 +- .../EPersonCertificateReplaceOperation.java | 5 +- .../impl/EPersonLoginReplaceOperation.java | 2 + .../ItemDiscoverableReplaceOperation.java | 4 +- .../impl/ItemWithdrawReplaceOperation.java | 4 +- .../app/rest/EPersonRestRepositoryIT.java | 300 +++++++++--------- 8 files changed, 185 insertions(+), 156 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java index 6297671555..71c27ef508 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java @@ -21,7 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** - * Provides PATCH operation implementations for Items. + * Provides PATCH operation implementations for EPerson updates. */ @Component public class EPersonPatch extends AbstractResourcePatch { @@ -29,9 +29,20 @@ public class EPersonPatch extends AbstractResourcePatch { @Autowired EPersonOperationFactory patchFactory; + /** + * Performs the replace operation. + * @param eperson dspace object + * @param context dspace context + * @param operation the replace operation + * @throws UnprocessableEntityException + * @throws PatchBadRequestException + * @throws SQLException + * @throws AuthorizeException + */ protected void replace(EPerson eperson, Context context, Operation operation) throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + // Get the patch operation via the EPerson replace operation factory. ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); patchOperation.perform(context, eperson, operation); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java index dfa8ec9c56..77203102bb 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java @@ -29,9 +29,20 @@ public class ItemPatch extends AbstractResourcePatch { @Autowired ItemOperationFactory patchFactory; + /** + * Peforms the replace operation. + * @param item dspace object + * @param context dspace context + * @param operation the replace operation + * @throws UnprocessableEntityException + * @throws PatchBadRequestException + * @throws SQLException + * @throws AuthorizeException + */ protected void replace(Item item, Context context, Operation operation) throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + // Get the patch operation via the Item replace operation factory. ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); patchOperation.perform(context, item, operation); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java index 837e440a93..39e55c8a57 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java @@ -18,7 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** - * Provides factory method for retrieving instances of eperson PatchOperations. + * Provides factory method for retrieving instances of EPerson PatchOperations. * * @author Michael Spalti */ diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java index 46a52e0c97..9ce97ec984 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java @@ -41,13 +41,14 @@ public class EPersonCertificateReplaceOperation extends PatchOperation { private void replace(Context context, Item item, Object value) throws PatchBadRequestException, SQLException, AuthorizeException { + checkOperationValue((String) value); Boolean withdraw = BooleanUtils.toBooleanObject((String) value); if (withdraw == null) { + // make sure string was converted to boolean. throw new PatchBadRequestException( - "Value is not a valid boolean expression"); + "Boolean value not provided for withdrawn operation.."); } try { diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index 3f6446573b..cbdeb6394b 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -65,23 +65,23 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(post("/api/eperson/epersons") - .content(mapper.writeValueAsBytes(data)) - .contentType(contentType)) - .andExpect(status().isCreated()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", Matchers.allOf( - hasJsonPath("$.uuid", not(empty())), - // is it what you expect? EPerson.getName() returns the email... - //hasJsonPath("$.name", is("Doe John")), - hasJsonPath("$.email", is("createtest@fake-email.com")), - hasJsonPath("$.type", is("eperson")), - hasJsonPath("$.canLogIn", is(true)), - hasJsonPath("$.requireCertificate", is(false)), - hasJsonPath("$._links.self.href", not(empty())), - hasJsonPath("$.metadata", Matchers.containsInAnyOrder( - EPersonMetadataMatcher.matchFirstName("John"), - EPersonMetadataMatcher.matchLastName("Doe") - ))))); + .content(mapper.writeValueAsBytes(data)) + .contentType(contentType)) + .andExpect(status().isCreated()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", Matchers.allOf( + hasJsonPath("$.uuid", not(empty())), + // is it what you expect? EPerson.getName() returns the email... + //hasJsonPath("$.name", is("Doe John")), + hasJsonPath("$.email", is("createtest@fake-email.com")), + hasJsonPath("$.type", is("eperson")), + hasJsonPath("$.canLogIn", is(true)), + hasJsonPath("$.requireCertificate", is(false)), + hasJsonPath("$._links.self.href", not(empty())), + hasJsonPath("$.metadata", Matchers.containsInAnyOrder( + EPersonMetadataMatcher.matchFirstName("John"), + EPersonMetadataMatcher.matchLastName("Doe") + ))))); // TODO cleanup the context!!! } @@ -96,15 +96,15 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/eperson")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( - EPersonMatcher.matchEPersonEntry(newUser), - EPersonMatcher.matchEPersonOnEmail(admin.getEmail()), - EPersonMatcher.matchEPersonOnEmail(eperson.getEmail()) - ))) - .andExpect(jsonPath("$.page.size", is(20))) - .andExpect(jsonPath("$.page.totalElements", is(3))) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( + EPersonMatcher.matchEPersonEntry(newUser), + EPersonMatcher.matchEPersonOnEmail(admin.getEmail()), + EPersonMatcher.matchEPersonOnEmail(eperson.getEmail()) + ))) + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(3))) ; getClient().perform(get("/api/eperson/epersons")) @@ -144,41 +144,41 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { context.turnOffAuthorisationSystem(); EPerson testEPerson = EPersonBuilder.createEPerson(context) - .withNameInMetadata("John", "Doe") - .withEmail("Johndoe@fake-email.com") - .build(); + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); String authToken = getAuthToken(admin.getEmail(), password); // using size = 2 the first page will contains our test user and admin getClient(authToken).perform(get("/api/eperson/epersons") - .param("size", "2")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( - EPersonMatcher.matchEPersonEntry(admin), - EPersonMatcher.matchEPersonEntry(testEPerson) - ))) - .andExpect(jsonPath("$._embedded.epersons", Matchers.not( - Matchers.contains( - EPersonMatcher.matchEPersonEntry(admin) - ) - ))) - .andExpect(jsonPath("$.page.size", is(2))) - .andExpect(jsonPath("$.page.totalElements", is(3))) + .param("size", "2")) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( + EPersonMatcher.matchEPersonEntry(admin), + EPersonMatcher.matchEPersonEntry(testEPerson) + ))) + .andExpect(jsonPath("$._embedded.epersons", Matchers.not( + Matchers.contains( + EPersonMatcher.matchEPersonEntry(admin) + ) + ))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$.page.totalElements", is(3))) ; // using size = 2 the first page will contains our test user and admin getClient(authToken).perform(get("/api/eperson/epersons") - .param("size", "2") - .param("page", "1")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.contains( - EPersonMatcher.matchEPersonEntry(eperson) - ))) - .andExpect(jsonPath("$._embedded.epersons", Matchers.hasSize(1))) - .andExpect(jsonPath("$.page.size", is(2))) - .andExpect(jsonPath("$.page.totalElements", is(3))) + .param("size", "2") + .param("page", "1")) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.contains( + EPersonMatcher.matchEPersonEntry(eperson) + ))) + .andExpect(jsonPath("$._embedded.epersons", Matchers.hasSize(1))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$.page.totalElements", is(3))) ; getClient().perform(get("/api/eperson/epersons")) @@ -203,16 +203,16 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/" + ePerson2.getID())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonEntry(ePerson2) - ))) - .andExpect(jsonPath("$", Matchers.not( - is( - EPersonMatcher.matchEPersonEntry(ePerson) - ) - ))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonEntry(ePerson2) + ))) + .andExpect(jsonPath("$", Matchers.not( + is( + EPersonMatcher.matchEPersonEntry(ePerson) + ) + ))); } @@ -232,18 +232,18 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/" + ePerson2.getID())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonEntry(ePerson2) - ))) - .andExpect(jsonPath("$", Matchers.not( - is( - EPersonMatcher.matchEPersonEntry(eperson) - ) - ))) - .andExpect(jsonPath("$._links.self.href", - Matchers.containsString("/api/eperson/epersons/" + ePerson2.getID()))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonEntry(ePerson2) + ))) + .andExpect(jsonPath("$", Matchers.not( + is( + EPersonMatcher.matchEPersonEntry(eperson) + ) + ))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/eperson/epersons/" + ePerson2.getID()))); //EPerson can only access himself @@ -254,13 +254,13 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(epersonToken).perform(get("/api/eperson/epersons/" + eperson.getID())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonOnEmail(eperson.getEmail()) - ))) - .andExpect(jsonPath("$._links.self.href", - Matchers.containsString("/api/eperson/epersons/" + eperson.getID()))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonOnEmail(eperson.getEmail()) + ))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/eperson/epersons/" + eperson.getID()))); } @@ -269,18 +269,18 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { context.turnOffAuthorisationSystem(); EPerson testEPerson1 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("John", "Doe") - .withEmail("Johndoe@fake-email.com") - .build(); + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); EPerson testEPerson2 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Jane", "Smith") - .withEmail("janesmith@fake-email.com") - .build(); + .withNameInMetadata("Jane", "Smith") + .withEmail("janesmith@fake-email.com") + .build(); String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/" + UUID.randomUUID())) - .andExpect(status().isNotFound()); + .andExpect(status().isNotFound()); } @@ -288,13 +288,13 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { public void searchMethodsExist() throws Exception { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons")) - .andExpect(jsonPath("$._links.search.href", Matchers.notNullValue())); + .andExpect(jsonPath("$._links.search.href", Matchers.notNullValue())); getClient(authToken).perform(get("/api/eperson/epersons/search")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._links.byEmail", Matchers.notNullValue())) - .andExpect(jsonPath("$._links.byName", Matchers.notNullValue())); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._links.byEmail", Matchers.notNullValue())) + .andExpect(jsonPath("$._links.byName", Matchers.notNullValue())); } @Test @@ -315,21 +315,21 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail") - .param("email", ePerson.getEmail())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonEntry(ePerson) - ))); + .param("email", ePerson.getEmail())) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonEntry(ePerson) + ))); // it must be case-insensitive getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail") .param("email", ePerson.getEmail().toUpperCase())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$", is( - EPersonMatcher.matchEPersonEntry(ePerson) - ))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", is( + EPersonMatcher.matchEPersonEntry(ePerson) + ))); } @Test @@ -337,14 +337,14 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail") .param("email", "undefined@undefined.com")) - .andExpect(status().isNotFound()); + .andExpect(status().isNotFound()); } @Test public void findByEmailUnprocessable() throws Exception { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail")) - .andExpect(status().isUnprocessableEntity()); + .andExpect(status().isUnprocessableEntity()); } @Test @@ -361,45 +361,45 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .build(); EPerson ePerson3 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Tom", "Doe") - .withEmail("tomdoe@fake-email.com") - .build(); + .withNameInMetadata("Tom", "Doe") + .withEmail("tomdoe@fake-email.com") + .build(); EPerson ePerson4 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Dirk", "Doe-Postfix") - .withEmail("dirkdoepostfix@fake-email.com") - .build(); + .withNameInMetadata("Dirk", "Doe-Postfix") + .withEmail("dirkdoepostfix@fake-email.com") + .build(); EPerson ePerson5 = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Harry", "Prefix-Doe") - .withEmail("harrydoeprefix@fake-email.com") - .build(); + .withNameInMetadata("Harry", "Prefix-Doe") + .withEmail("harrydoeprefix@fake-email.com") + .build(); String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byName") - .param("q", ePerson.getLastName())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( - EPersonMatcher.matchEPersonEntry(ePerson), - EPersonMatcher.matchEPersonEntry(ePerson3), - EPersonMatcher.matchEPersonEntry(ePerson4), - EPersonMatcher.matchEPersonEntry(ePerson5) - ))) - .andExpect(jsonPath("$.page.totalElements", is(4))); + .param("q", ePerson.getLastName())) + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( + EPersonMatcher.matchEPersonEntry(ePerson), + EPersonMatcher.matchEPersonEntry(ePerson3), + EPersonMatcher.matchEPersonEntry(ePerson4), + EPersonMatcher.matchEPersonEntry(ePerson5) + ))) + .andExpect(jsonPath("$.page.totalElements", is(4))); // it must be case insensitive getClient(authToken).perform(get("/api/eperson/epersons/search/byName") .param("q", ePerson.getLastName().toLowerCase())) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( - EPersonMatcher.matchEPersonEntry(ePerson), - EPersonMatcher.matchEPersonEntry(ePerson3), - EPersonMatcher.matchEPersonEntry(ePerson4), - EPersonMatcher.matchEPersonEntry(ePerson5) - ))) - .andExpect(jsonPath("$.page.totalElements", is(4))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.epersons", Matchers.containsInAnyOrder( + EPersonMatcher.matchEPersonEntry(ePerson), + EPersonMatcher.matchEPersonEntry(ePerson3), + EPersonMatcher.matchEPersonEntry(ePerson4), + EPersonMatcher.matchEPersonEntry(ePerson5) + ))) + .andExpect(jsonPath("$.page.totalElements", is(4))); } @Test @@ -407,16 +407,16 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byName") .param("q", "Doe, John")) - .andExpect(status().isOk()) - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$.page.totalElements", is(0))); + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test public void findByNameUnprocessable() throws Exception { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byName")) - .andExpect(status().isUnprocessableEntity()); + .andExpect(status().isUnprocessableEntity()); } @Test @@ -431,11 +431,11 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { // Delete getClient(token).perform(delete("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().is(204)); + .andExpect(status().is(204)); // Verify 404 after delete getClient().perform(get("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isNotFound()); + .andExpect(status().isNotFound()); } @Test @@ -451,14 +451,14 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { // Delete using an unauthorized user getClient(token).perform(delete("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isForbidden()); + .andExpect(status().isForbidden()); // login as admin String adminToken = getAuthToken(admin.getEmail(), password); // Verify the eperson is still here getClient(adminToken).perform(get("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test @@ -471,14 +471,14 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { // Delete as anonymous user getClient().perform(delete("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); // login as admin String adminToken = getAuthToken(admin.getEmail(), password); // Verify the eperson is still here getClient(adminToken).perform(get("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Ignore @@ -488,9 +488,9 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { context.turnOffAuthorisationSystem(); EPerson ePerson = EPersonBuilder.createEPerson(context) - .withNameInMetadata("Sample", "Submitter") - .withEmail("submitter@fake-email.com") - .build(); + .withNameInMetadata("Sample", "Submitter") + .withEmail("submitter@fake-email.com") + .build(); // force the use of the new user for subsequent operation context.setCurrentUser(ePerson); @@ -512,11 +512,11 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { // 422 error when trying to DELETE the eperson=submitter getClient(token).perform(delete("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().is(422)); + .andExpect(status().is(422)); // Verify the eperson is still here getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test From 40ca9f6150213d55eaa33db6ca8f422bb74720e7 Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Fri, 5 Oct 2018 00:21:49 -0500 Subject: [PATCH 065/193] Added URL parameter parsing for Browse Endpoint --- .../app/rest/RestResourceController.java | 7 +++++-- .../app/rest/BrowsesResourceControllerIT.java | 18 +++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index bfd5296e22..0685705efd 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -678,8 +678,11 @@ public class RestResourceController implements InitializingBean { if (Page.class.isAssignableFrom(linkMethod.getReturnType())) { Page pageResult = (Page) linkMethod .invoke(linkRepository, request, uuid, page, projection); - Link link = linkTo(this.getClass(), apiCategory, model).slash(uuid).slash(subpath) - .withSelfRel(); + + //TODO we need to strip any existing paging information from the query string + //Even if the paging info is not removed, the params don't get duplicated. + Link link = linkTo(this.getClass(), apiCategory, model).slash(uuid) + .slash(subpath + '?' + request.getQueryString()).withSelfRel(); Page halResources = pageResult.map(linkRepository::wrapResource); halResources.forEach(linkService::addLinks); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java index 3527175b5f..63c48efb25 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java @@ -571,7 +571,8 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe //An anonymous user browses the items in the Browse by date issued endpoint //with startsWith set to 1990 getClient().perform(get("/api/discover/browses/dateissued/items") - .param("startsWith", "1990")) + .param("startsWith", "1990") + .param("size", "2")) //** THEN ** //The status has to be 200 OK @@ -580,22 +581,17 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe .andExpect(content().contentType(contentType)) //We expect only the "remaining" five items to be present - .andExpect(jsonPath("$.page.totalElements", is(5))) - .andExpect(jsonPath("$.page.number", is(0))) + .andExpect(jsonPath("$.page.totalElements", is(7))) + .andExpect(jsonPath("$.page.number", is(1))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$._links.first.href", contains("startsWith=1990"))) //Verify that the index jumps to the "Python" item. .andExpect(jsonPath("$._embedded.items", contains(ItemMatcher.matchItemWithTitleAndDateIssued(item3, "Python", "1990"), ItemMatcher.matchItemWithTitleAndDateIssued(item4, - "Java", "1995-05-23"), - ItemMatcher.matchItemWithTitleAndDateIssued(item5, - "Zeta Reticuli", - "2018-01-01"), - ItemMatcher.matchItemWithTitleAndDateIssued(item6, - "Moon", "2018-01-02"), - ItemMatcher.matchItemWithTitleAndDateIssued(item7, - "T-800", "2029") + "Java", "1995-05-23") ))); //** WHEN ** //An anonymous user browses the items in the Browse by Title endpoint From cc7bcf600782e0d653f5d6dc9203a897951334f9 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 5 Oct 2018 12:30:19 +0200 Subject: [PATCH 066/193] Add the ability to create EPerson Group via REST. --- .../org/dspace/app/rest/model/GroupRest.java | 4 +- .../rest/repository/GroupRestRepository.java | 46 ++++++++++++++++++- .../app/rest/GroupRestRepositoryIT.java | 24 ++++++++++ 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/GroupRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/GroupRest.java index b8aad5260e..421ecc5587 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/GroupRest.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/GroupRest.java @@ -10,6 +10,7 @@ package org.dspace.app.rest.model; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import org.dspace.app.rest.RestResourceController; /** @@ -17,6 +18,7 @@ import org.dspace.app.rest.RestResourceController; * * @author Andrea Bollini (andrea.bollini at 4science.it) */ +@JsonIgnoreProperties(ignoreUnknown = true) public class GroupRest extends DSpaceObjectRest { public static final String NAME = "group"; @@ -69,4 +71,4 @@ public class GroupRest extends DSpaceObjectRest { public Class getController() { return RestResourceController.class; } -} \ No newline at end of file +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java index 454d7c2eab..e757dcba32 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java @@ -7,13 +7,21 @@ */ package org.dspace.app.rest.repository; +import java.io.IOException; import java.sql.SQLException; import java.util.List; import java.util.UUID; +import javax.servlet.http.HttpServletRequest; + +import com.fasterxml.jackson.databind.ObjectMapper; import org.dspace.app.rest.converter.GroupConverter; +import org.dspace.app.rest.exception.RepositoryMethodNotImplementedException; +import org.dspace.app.rest.exception.UnprocessableEntityException; import org.dspace.app.rest.model.GroupRest; +import org.dspace.app.rest.model.MetadataEntryRest; import org.dspace.app.rest.model.hateoas.GroupResource; +import org.dspace.authorize.AuthorizeException; import org.dspace.core.Context; import org.dspace.eperson.Group; import org.dspace.eperson.factory.EPersonServiceFactory; @@ -33,11 +41,45 @@ import org.springframework.stereotype.Component; @Component(GroupRest.CATEGORY + "." + GroupRest.NAME) public class GroupRestRepository extends DSpaceRestRepository { - GroupService gs = EPersonServiceFactory.getInstance().getGroupService(); + @Autowired + GroupService gs;//= EPersonServiceFactory.getInstance().getGroupService(); @Autowired GroupConverter converter; + @Override + protected GroupRest createAndReturn(Context context) + throws AuthorizeException, RepositoryMethodNotImplementedException { + HttpServletRequest req = getRequestService().getCurrentRequest().getHttpServletRequest(); + ObjectMapper mapper = new ObjectMapper(); + GroupRest groupRest = null; + + try { + groupRest = mapper.readValue(req.getInputStream(), GroupRest.class); + } catch (IOException excIO) { + throw new UnprocessableEntityException("error parsing the body... maybe this is not the right error code"); + } + + Group group = null; + try { + group = gs.create(context); + gs.setName(group, groupRest.getName()); + gs.update(context, group); + + if (groupRest.getMetadata() != null) { + for (MetadataEntryRest mer: groupRest.getMetadata()) { + String[] metadatakey = mer.getKey().split("\\."); + gs.addMetadata(context, group, metadatakey[0], metadatakey[1], + metadatakey.length == 3 ? metadatakey[2] : null, mer.getLanguage(), mer.getValue()); + } + } + } catch (SQLException excSQL) { + throw new RuntimeException(excSQL.getMessage(), excSQL); + } + + return converter.convert(group); + } + @Override @PreAuthorize("hasPermission(#id, 'GROUP', 'READ')") public GroupRest findOne(Context context, UUID id) { @@ -78,4 +120,4 @@ public class GroupRestRepository extends DSpaceRestRepository { return new GroupResource(eperson, utils, rels); } -} \ No newline at end of file +} diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java index 537876e397..0668850e5b 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java @@ -10,16 +10,23 @@ package org.dspace.app.rest; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.awt.*; import java.util.UUID; +import com.fasterxml.jackson.databind.ObjectMapper; import org.dspace.app.rest.builder.GroupBuilder; import org.dspace.app.rest.matcher.GroupMatcher; +import org.dspace.app.rest.model.GroupRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.content.factory.ContentServiceFactory; import org.dspace.eperson.Group; +import org.dspace.eperson.factory.EPersonServiceFactory; +import org.dspace.eperson.service.GroupService; import org.hamcrest.Matchers; import org.junit.Test; @@ -29,6 +36,23 @@ import org.junit.Test; public class GroupRestRepositoryIT extends AbstractControllerIntegrationTest { + @Test + public void createTest() + throws Exception { + + ObjectMapper mapper = new ObjectMapper(); + GroupRest groupRest = new GroupRest(); + String groupName = "testGroup1"; + + groupRest.setName(groupName); + + String authToken = getAuthToken(admin.getEmail(), password); + getClient(authToken).perform(post("/api/eperson/groups") + .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("name", Matchers.containsString(groupName))); + } + @Test public void findAllTest() throws Exception { From f432568b31ea3adf292ed0792ee203d40c5b5940 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 5 Oct 2018 15:29:16 +0200 Subject: [PATCH 067/193] Cleaning up the code and implement more test cases for the group creation. --- .../rest/repository/GroupRestRepository.java | 3 +-- .../app/rest/GroupRestRepositoryIT.java | 25 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java index e757dcba32..ac17e99c9a 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java @@ -24,7 +24,6 @@ import org.dspace.app.rest.model.hateoas.GroupResource; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Context; import org.dspace.eperson.Group; -import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.service.GroupService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -42,7 +41,7 @@ import org.springframework.stereotype.Component; @Component(GroupRest.CATEGORY + "." + GroupRest.NAME) public class GroupRestRepository extends DSpaceRestRepository { @Autowired - GroupService gs;//= EPersonServiceFactory.getInstance().getGroupService(); + GroupService gs; @Autowired GroupConverter converter; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java index 0668850e5b..44e93eb512 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java @@ -15,7 +15,6 @@ 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 java.awt.*; import java.util.UUID; import com.fasterxml.jackson.databind.ObjectMapper; @@ -23,10 +22,7 @@ import org.dspace.app.rest.builder.GroupBuilder; import org.dspace.app.rest.matcher.GroupMatcher; import org.dspace.app.rest.model.GroupRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; -import org.dspace.content.factory.ContentServiceFactory; import org.dspace.eperson.Group; -import org.dspace.eperson.factory.EPersonServiceFactory; -import org.dspace.eperson.service.GroupService; import org.hamcrest.Matchers; import org.junit.Test; @@ -49,8 +45,25 @@ public class GroupRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(post("/api/eperson/groups") .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) - .andExpect(status().isCreated()) - .andExpect(jsonPath("name", Matchers.containsString(groupName))); + .andExpect(status().isCreated()); + + getClient(authToken).perform(get("/api/eperson/groups")) + //The status has to be 200 OK + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.groups", Matchers.containsInAnyOrder( + GroupMatcher.matchGroupWithName(groupName), + GroupMatcher.matchGroupWithName("Administrator"), + GroupMatcher.matchGroupWithName("Anonymous")))); + + authToken = getAuthToken(eperson.getEmail(), password); + getClient(authToken).perform(post("/api/eperson/groups") + .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) + .andExpect(status().isForbidden()); + + getClient().perform(post("/api/eperson/groups") + .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) + .andExpect(status().isUnauthorized()); } @Test From 79b950c8e4e5fdb4a7dc9538efae193f568b59b5 Mon Sep 17 00:00:00 2001 From: Stefan Date: Fri, 5 Oct 2018 18:28:29 +0200 Subject: [PATCH 068/193] Restrict the endpoint with an @PreAuthorize annotation --- .../java/org/dspace/app/rest/repository/GroupRestRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java index ac17e99c9a..b9c8596f58 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java @@ -46,6 +46,7 @@ public class GroupRestRepository extends DSpaceRestRepository { @Autowired GroupConverter converter; + @PreAuthorize("hasAuthority('ADMIN')") @Override protected GroupRest createAndReturn(Context context) throws AuthorizeException, RepositoryMethodNotImplementedException { From c466d10c6a55e801d4261fdbb5d5c16fb89134ad Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Sun, 9 Sep 2018 09:45:22 +0200 Subject: [PATCH 069/193] DS-3850 Integration Test for workspaceitem endpoint (find and delete methods) Add predictable order to the workflowitem find query (by workspaceItemId instead than item uuid) --- .../dao/impl/WorkspaceItemDAOImpl.java | 6 +- .../rest/WorkspaceItemRestRepositoryIT.java | 304 ++++++++++++++++++ .../rest/builder/WorkspaceItemBuilder.java | 41 +++ .../rest/matcher/WorkspaceItemMatcher.java | 110 +++++++ 4 files changed, 459 insertions(+), 2 deletions(-) create mode 100644 dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java create mode 100644 dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/WorkspaceItemMatcher.java diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java index ee98889294..95d4822af8 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java @@ -64,6 +64,7 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im public List findByCollection(Context context, Collection c) throws SQLException { Criteria criteria = createCriteria(context, WorkspaceItem.class); criteria.add(Restrictions.eq("collection", c)); + criteria.addOrder(Order.asc("workspaceItemId")); return list(criteria); } @@ -78,14 +79,14 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public List findAll(Context context) throws SQLException { Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.addOrder(Order.asc("item")); + criteria.addOrder(Order.asc("workspaceItemId")); return list(criteria); } @Override public List findAll(Context context, Integer limit, Integer offset) throws SQLException { Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.addOrder(Order.asc("item")); + criteria.addOrder(Order.asc("workspaceItemId")); criteria.setFirstResult(offset); criteria.setMaxResults(limit); return list(criteria); @@ -105,6 +106,7 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im criteria.createAlias("supervisorGroups", "supervisorGroup"); criteria.createAlias("supervisorGroup.epeople", "person"); criteria.add(Restrictions.eq("person.id", ePerson.getID())); + criteria.addOrder(Order.asc("workspaceItemId")); return list(criteria); } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java new file mode 100644 index 0000000000..890a11795e --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java @@ -0,0 +1,304 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest; + +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; +import static org.hamcrest.Matchers.is; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.io.InputStream; +import java.util.UUID; + +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.WorkspaceItemBuilder; +import org.dspace.app.rest.matcher.CollectionMatcher; +import org.dspace.app.rest.matcher.ItemMatcher; +import org.dspace.app.rest.matcher.WorkspaceItemMatcher; +import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.content.Bitstream; +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.hamcrest.Matchers; +import org.junit.Test; + +/** + * Test suite for the WorkspaceItem endpoint + * @author Andrea Bollini (andrea.bollini at 4science.it) + * + */ +public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegrationTest { + + @Test + /** + * All the workspaceitem should be returned regardless of the collection where they were created + * + * @throws Exception + */ + public void findAllTest() throws Exception { + context.setCurrentUser(admin); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + + //2. Three workspace items in two different collections + WorkspaceItem workspaceItem1 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem workspaceItem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 2") + .withIssueDate("2016-02-13") + .build(); + + WorkspaceItem workspaceItem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 3") + .withIssueDate("2016-02-13") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/submission/workspaceitems")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", Matchers.containsInAnyOrder( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, "Workspace Item 2", + "2016-02-13"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", + "2016-02-13")))) + .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/submission/workspaceitems"))) + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(3))); + } + + @Test + /** + * The workspaceitem endpoint must provide proper pagination + * + * @throws Exception + */ + public void findAllWithPaginationTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + + //2. Three workspace items in two different collections + WorkspaceItem workspaceItem1 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem workspaceItem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 2") + .withIssueDate("2016-02-13") + .build(); + + WorkspaceItem workspaceItem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 3") + .withIssueDate("2016-02-13") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/submission/workspaceitems").param("size", "2")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.containsInAnyOrder( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, "Workspace Item 2", + "2016-02-13")))) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.not(Matchers.contains(WorkspaceItemMatcher + .matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", "2016-02-13"))))); + + getClient(token).perform(get("/api/submission/workspaceitems").param("size", "2").param("page", "1")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.contains(WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem3, + "Workspace Item 3", "2016-02-13")))) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.not(Matchers.contains( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, "Workspace Item 2", + "2016-02-13"))))) + .andExpect(jsonPath("$.page.size", is(2))).andExpect(jsonPath("$.page.totalElements", is(3))); + } + + @Test + /** + * The workspaceitem resource endpoint must expose the proper structure + * + * @throws Exception + */ + public void findOneTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + //2. a workspace item + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())).andExpect(status().isOk()) + .andExpect(jsonPath("$", + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "Workspace Item 1", "2017-10-17", "ExtraEntry")))); + } + + @Test + /** + * The workspaceitem resource endpoint must expose the proper structure + * + * @throws Exception + */ + public void findOneRelsTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + //2. a workspace item + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID() + "/collection")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", Matchers + .is(CollectionMatcher.matchCollectionEntry(col1.getName(), col1.getID(), col1.getHandle())))); + + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID() + "/item")).andExpect(status().isOk()) + .andExpect(jsonPath("$", Matchers.is(ItemMatcher.matchItemWithTitleAndDateIssued(witem.getItem(), + "Workspace Item 1", "2017-10-17")))); + + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID() + "/submissionDefinition")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", Matchers.is(hasJsonPath("$.id", is("traditional"))))); + + } + + @Test + /** + * Check the response code for unexistent workspaceitem + * + * @throws Exception + */ + public void findOneWrongUUIDTest() throws Exception { + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/submission/workspaceitems/" + UUID.randomUUID())) + .andExpect(status().isNotFound()); + } + + @Test + /** + * Removing a workspaceitem should result in delete of all the underline resources (item and bitstreams) + * + * @throws Exception + */ + public void deleteOneTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community with one collection. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, parentCommunity).withName("Collection 1").build(); + + //2. a workspace item + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + Item item = witem.getItem(); + + //Add a bitstream to the item + String bitstreamContent = "ThisIsSomeDummyText"; + Bitstream bitstream = null; + try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) { + bitstream = BitstreamBuilder + .createBitstream(context, item, is) + .withName("Bitstream1") + .withMimeType("text/plain").build(); + } + + String token = getAuthToken(admin.getEmail(), password); + + //Delete the workspaceitem + getClient(token).perform(delete("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().is(204)); + + //Trying to get deleted item should fail with 404 + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().is(404)); + + //Trying to get deleted workspaceitem's item should fail with 404 + getClient().perform(get("/api/core/items/" + item.getID())) + .andExpect(status().is(404)); + + //Trying to get deleted workspaceitem's bitstream should fail with 404 + getClient().perform(get("/api/core/biststreams/" + bitstream.getID())) + .andExpect(status().is(404)); + } + +} diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java index 73ad1c7af1..85e61aa0f0 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java @@ -8,6 +8,9 @@ package org.dspace.app.rest.builder; import org.dspace.content.Collection; +import org.dspace.content.DCDate; +import org.dspace.content.Item; +import org.dspace.content.MetadataSchema; import org.dspace.content.WorkspaceItem; import org.dspace.content.service.WorkspaceItemService; import org.dspace.core.Context; @@ -70,4 +73,42 @@ public class WorkspaceItemBuilder extends AbstractBuilder matchProperties(WorkspaceItem witem) { + return allOf( + hasJsonPath("$.id", is(witem.getID())), + hasJsonPath("$.type", is("workspaceitem")) + ); + } + + /** + * Check that the required links are present + * + * @param witem + * the workspaceitem + * @return + */ + public static Matcher matchLinks(WorkspaceItem witem) { + return allOf( + hasJsonPath("$._links.self.href", is(REST_SERVER_URL + "submission/workspaceitems/" + witem.getID())), + hasJsonPath("$._links.item.href", startsWith(REST_SERVER_URL)), + hasJsonPath("$._links.collection.href", startsWith(REST_SERVER_URL)), + hasJsonPath("$._links.submitter.href", startsWith(REST_SERVER_URL)), + hasJsonPath("$._links.submissionDefinition.href", startsWith(REST_SERVER_URL))); + } +} From 9e85421ab418752656337370f1a4f287fa8e4362 Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Sat, 6 Oct 2018 13:06:47 +0200 Subject: [PATCH 070/193] Add javadocs --- .../submit/extraction/MetadataExtractor.java | 4 + .../submit/listener/MetadataListener.java | 14 ++ .../org/dspace/submit/step/MetadataStep.java | 1 + .../app/rest/RestResourceController.java | 23 +- .../org/dspace/app/rest/model/ErrorRest.java | 12 ++ .../rest/repository/DSpaceRestRepository.java | 202 +++++++++++++++++- .../submit/AbstractRestProcessingStep.java | 40 +++- .../rest/submit/ListenerProcessingStep.java | 6 + .../app/rest/submit/UploadableStep.java | 3 + .../app/rest/submit/step/DescribeStep.java | 4 +- .../rest/submit/step/ExtractMetadataStep.java | 6 +- .../step/validation/AbstractValidation.java | 19 +- .../step/validation/LicenseValidation.java | 3 +- 13 files changed, 322 insertions(+), 15 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/submit/extraction/MetadataExtractor.java b/dspace-api/src/main/java/org/dspace/submit/extraction/MetadataExtractor.java index ccaa6e05d1..0961a49d92 100644 --- a/dspace-api/src/main/java/org/dspace/submit/extraction/MetadataExtractor.java +++ b/dspace-api/src/main/java/org/dspace/submit/extraction/MetadataExtractor.java @@ -13,7 +13,11 @@ import gr.ekt.bte.dataloader.FileDataLoader; import org.dspace.services.ConfigurationService; /** + * Configuration bean to associate a BTE FileDataLoader with a specific list of format identified by the file + * extensions. See config/spring/api/metadata-extractor.xml + * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public class MetadataExtractor { diff --git a/dspace-api/src/main/java/org/dspace/submit/listener/MetadataListener.java b/dspace-api/src/main/java/org/dspace/submit/listener/MetadataListener.java index ddc8c04ae0..df3c78919e 100644 --- a/dspace-api/src/main/java/org/dspace/submit/listener/MetadataListener.java +++ b/dspace-api/src/main/java/org/dspace/submit/listener/MetadataListener.java @@ -12,12 +12,26 @@ import java.util.Map; import gr.ekt.bte.core.DataLoader; import org.dspace.services.ConfigurationService; +/** + * Configuration bean to map metadata to identifiers (i.e dc.identifier.doi -> doi, dc.identifier.isbn -> isbn) and + * alias to BTE Data Loader. See config/spring/api/step-processing.xml + * + * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) + * + */ public class MetadataListener { + /** + * Metadata to identifier map + */ private Map metadata; private ConfigurationService configurationService; + /** + * Alias to data loader map + */ private Map dataloadersMap; public ConfigurationService getConfigurationService() { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java b/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java index 1c8b411eb5..c0998bcb2e 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java @@ -33,6 +33,7 @@ import org.dspace.submit.AbstractProcessingStep; import org.dspace.submit.listener.MetadataListener; import org.dspace.submit.lookup.SubmissionLookupDataLoader; +//FIXME move to the ExtractionStep /** * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index bfd5296e22..26c5133d9e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -17,6 +17,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.UUID; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -426,17 +427,24 @@ public class RestResourceController implements InitializingBean { } /** - * Called in POST, multipart, upload a resource passed into "file" request parameter + * Called in POST, multipart, upload to a specific rest resource the file passed as "file" request parameter * * Note that the regular expression in the request mapping accept a number as identifier; * * @param request + * the http request * @param apiCategory + * the api category * @param model + * the rest model that identify the REST resource collection * @param id + * the id of the specific rest resource * @param extraField + * an option implementation specific parameter (could be used to force a specific processing strategy + * other than what can be guess by the filename or mimetype of the uploaded file) * @param uploadfile - * @return + * the file to upload + * @return the created resource * @throws HttpRequestMethodNotSupportedException */ @RequestMapping(method = RequestMethod.POST, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT, headers = @@ -454,17 +462,24 @@ public class RestResourceController implements InitializingBean { } /** - * Called in POST, multipart, upload a resource passed into "file" request parameter + * Called in POST, multipart, upload to a specific rest resource the file passed as "file" request parameter * * Note that the regular expression in the request mapping accept a UUID as identifier; * * @param request + * the http request * @param apiCategory + * the api category * @param model + * the rest model that identify the REST resource collection * @param id + * the id of the specific rest resource * @param extraField + * an option implementation specific parameter (could be used to force a specific processing strategy + * other than what can be guess by the filename or mimetype of the uploaded file) * @param uploadfile - * @return + * the file to upload + * @return the created resource * @throws HttpRequestMethodNotSupportedException */ @RequestMapping(method = RequestMethod.POST, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID, headers = diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ErrorRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ErrorRest.java index 054ea022dd..59bf9176dd 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ErrorRest.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ErrorRest.java @@ -21,6 +21,11 @@ public class ErrorRest { private List paths; + /** + * The error message as i18key + * + * @return The message as i18key + */ public String getMessage() { return message; } @@ -29,6 +34,13 @@ public class ErrorRest { this.message = message; } + /** + * The json paths where the error message apply. They can be as detailed as a specific value in a multivalues + * attributes (i.e. sections.traditionalpageone['dc.contributor.author'][1] to identify the second author - 0 based) + * or generic to apply to a whole section (sections.license) + * + * @return + */ public List getPaths() { if (this.paths == null) { this.paths = new ArrayList(); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java index 050f547296..8e3c2f74fd 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java @@ -68,48 +68,94 @@ public abstract class DSpaceRestRepository S save(Context context, S entity) throws AuthorizeException, RepositoryMethodNotImplementedException { throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); } @Override + /** + * Method to implement to support bulk update of a REST objects via a PUT request + */ public Iterable save(Iterable entities) { // TODO Auto-generated method stub return null; } @Override + /** + * Return a specific REST object + * + * @return the REST object identified by its ID + */ public T findOne(ID id) { Context context = obtainContext(); return thisRepository.findOne(context, id); } + /** + * Method to implement to support retrieval of a specific REST object instance + * + * @param context + * the dspace context + * @param id + * the rest object id + * @return the REST object identified by its ID + */ public abstract T findOne(Context context, ID id); @Override + /** + * Return true if an object exist for the specified ID. The default implementation is inefficient as it retrieves + * the actual object to state that it exists. This could lead to retrieve and inizialize lot of linked objects + */ public boolean exists(ID id) { - // TODO Auto-generated method stub - return false; + return findOne(id) != null; } @Override - public Iterable findAll() { + /** + * This method cannot be implemented we required all the find method to be paginated + */ + public final Iterable findAll() { throw new RuntimeException("findAll MUST be paginated"); } @Override + /** + * This method could be implemented to support bulk retrieval of specific object by their IDs. Unfortunately, this + * method doesn't allow pagination and it could be misused to retrieve thousand objects at once + */ public Iterable findAll(Iterable ids) { throw new RuntimeException("findAll MUST be paginated"); } @Override + /** + * This method return the number of object instances of the type managed by the repository class available in the + * system + */ public long count() { - // TODO Auto-generated method stub + // FIXME DS-4038 return 0; } @Override + /** + * Delete the object identified by its ID + */ public void delete(ID id) { Context context = obtainContext(); try { @@ -122,44 +168,96 @@ public abstract class DSpaceRestRepository entities) { // TODO Auto-generated method stub } @Override + /** + * Method to implement to support bulk delete of ALL entity instances + */ public void deleteAll() { // TODO Auto-generated method stub } @Override - public Iterable findAll(Sort sort) { + /** + * This method cannot be implemented we required all the find method to be paginated + */ + public final Iterable findAll(Sort sort) { throw new RuntimeException("findAll MUST be paginated"); } @Override + /** + * Provide access to the manage entity instances in a paginated way + */ public Page findAll(Pageable pageable) { Context context = obtainContext(); return thisRepository.findAll(context, pageable); } + /** + * Method to implement to support scroll of entity instances from the collection resource endpoin + * + * @param context + * the dspace context + * @param pageable + * object embedding the requested pagination info + * @return + */ public abstract Page findAll(Context context, Pageable pageable); + /** + * The REST model supported by the repository + */ public abstract Class getDomainClass(); + /** + * Wrap the REST model in a REST HAL Resource + * + * @param model + * the rest model instance + * @param rels + * the HAL links + * @return the REST Resource + */ public abstract DSpaceResource wrapResource(T model, String... rels); + /** + * Create and return a new instance. Data are usually retrieved from the thread bound http request + * + * @return the created REST object + */ public T createAndReturn() { Context context = null; try { @@ -174,16 +272,60 @@ public abstract class DSpaceRestRepository upload(HttpServletRequest request, MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { Context context = obtainContext(); @@ -212,9 +389,22 @@ public abstract class DSpaceRestRepository upload(Context context, HttpServletRequest request, MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { - throw new RuntimeException("No implementation found; Method not allowed!"); + throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/AbstractRestProcessingStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/AbstractRestProcessingStep.java index efc477be97..f36ba3f3fa 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/AbstractRestProcessingStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/AbstractRestProcessingStep.java @@ -21,9 +21,10 @@ import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.model.Request; /** - * Interface to retrieve information about section + * Interface for the submission steps to populate sections in the in progress submission and react to patch requests. * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public interface AbstractRestProcessingStep extends ListenerProcessingStep { @@ -37,9 +38,33 @@ public interface AbstractRestProcessingStep extends ListenerProcessingStep { public static final String UPLOAD_STEP_METADATA_PATH = "metadata"; + /** + * Method to expose data in the a dedicated section of the in progress submission. The step needs to return a + * serializable object that will be included in a section with the name (id) assigned to the step in the + * item-submission.xml file + * + * @param submissionService + * the submission service + * @param obj + * the in progress submission + * @param config + * the submission step configuration + * @return the serializable object to include in the step generated section + * @throws Exception + */ public T getData(SubmissionService submissionService, WorkspaceItem obj, SubmissionStepConfig config) throws Exception; + /** + * The method will expose the list of validation errors identified by the step. The default implementation will + * found a {@link Validation} spring bean in the context with the same name that the step id + * + * @param submissionService + * @param obj + * @param config + * @return + * @throws Exception + */ default public List validate(SubmissionService submissionService, WorkspaceItem obj, SubmissionStepConfig config) throws Exception { List errors = new ArrayList(); @@ -55,6 +80,19 @@ public interface AbstractRestProcessingStep extends ListenerProcessingStep { return errors; } + /** + * Method to react to a patch request against the step managed section data + * + * @param context + * the DSpace context + * @param currentRequest + * the http request + * @param source + * the in progress submission + * @param op + * the json patch operation + * @throws Exception + */ public void doPatchProcessing(Context context, Request currentRequest, WorkspaceItem source, Operation op) throws Exception; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/ListenerProcessingStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/ListenerProcessingStep.java index 72bcc35da8..f2e3513fab 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/ListenerProcessingStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/ListenerProcessingStep.java @@ -11,7 +11,13 @@ import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; /** + * This interface allows a submission step to access and modify if needed an inprogress submission also when changes are + * requested to sections other than the one managed by the step itself. + * + * This could be useful to allow a step wide validations or changes over multiple sections. + * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public interface ListenerProcessingStep { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/UploadableStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/UploadableStep.java index e416b4cddd..df7c54f249 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/UploadableStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/UploadableStep.java @@ -16,7 +16,10 @@ import org.dspace.core.Context; import org.springframework.web.multipart.MultipartFile; /** + * The interface for submission Steps that need to deal with file upload + * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public interface UploadableStep extends ListenerProcessingStep { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java index 9a6864f8d0..79b3c24f11 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java @@ -30,9 +30,11 @@ import org.dspace.core.Utils; import org.dspace.services.model.Request; /** - * Describe step for DSpace Spring Rest. Handle the exposition of metadata own by the in progress submission. + * Describe step for DSpace Spring Rest. Expose and allow patching of the in progress submission metadata. It is + * configured via the config/submission-forms.xml file * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public class DescribeStep extends org.dspace.submit.step.DescribeStep implements AbstractRestProcessingStep { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/ExtractMetadataStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/ExtractMetadataStep.java index 7353a9cf03..9f91ca9610 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/ExtractMetadataStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/ExtractMetadataStep.java @@ -35,6 +35,10 @@ import org.dspace.submit.step.ExtractionStep; import org.springframework.web.multipart.MultipartFile; /** + * This submission step allows to extract metadata from an uploaded file to enrich or initialize a submission. The + * processing is delegated to a list of extractor specialized by format (i.e. a Grobid extractor to get data from a PDF + * file, an extractor to get data from bibliographic file such as BibTeX, etc) + * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ public class ExtractMetadataStep extends ExtractionStep implements UploadableStep { @@ -81,7 +85,7 @@ public class ExtractMetadataStep extends ExtractionStep implements UploadableSte return null; } - public RecordSet convertFields(RecordSet recordSet, Map fieldMap) { + private RecordSet convertFields(RecordSet recordSet, Map fieldMap) { RecordSet result = new RecordSet(); for (Record publication : recordSet.getRecords()) { for (String fieldName : fieldMap.keySet()) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/AbstractValidation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/AbstractValidation.java index cf97d044c4..49bf841d59 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/AbstractValidation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/AbstractValidation.java @@ -14,7 +14,7 @@ import org.apache.commons.lang.StringUtils; import org.dspace.app.rest.model.ErrorRest; /** - * Abstract class to manage errors on validation during submission process + * Abstract class to provide basic management of errors resulting from a validation on a submission * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ @@ -24,6 +24,9 @@ public abstract class AbstractValidation implements Validation { private List errors = new ArrayList(); + /** + * An unique name to identify the validation implementation + */ public String getName() { return name; } @@ -32,6 +35,15 @@ public abstract class AbstractValidation implements Validation { this.name = name; } + /** + * Add an error message (i18nKey) for a specific json path + * + * @param i18nKey + * the validation error message as a key to internationalize + * @param path + * the json path that identify the wrong data in the submission. It could be as specific as a single + * value in a multivalued attribute or general of a "whole" section + */ public void addError(String i18nKey, String path) { boolean found = false; if (StringUtils.isNotBlank(i18nKey)) { @@ -51,6 +63,11 @@ public abstract class AbstractValidation implements Validation { } } + /** + * Expose the identified errors + * + * @return the list of identified {@link ErrorRest} + */ public List getErrors() { return errors; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/LicenseValidation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/LicenseValidation.java index 1ce6cb35de..12d9ae99c9 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/LicenseValidation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/LicenseValidation.java @@ -23,7 +23,8 @@ import org.dspace.core.Constants; import org.springframework.beans.factory.annotation.Autowired; /** - * Execute check on license bundle + * This submission validation check that the license has been grant for the inprogress submission looking for the + * presence of a license bitstream in the license bundle, * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ From a8863fd6a082873214310660490da70fd57e071c Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Sat, 6 Oct 2018 13:08:58 +0200 Subject: [PATCH 071/193] Add missing method to support bulk creation of objects via file upload --- .../app/rest/RestResourceController.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index 26c5133d9e..9ca3726b8f 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -10,10 +10,12 @@ package org.dspace.app.rest; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -47,6 +49,7 @@ import org.dspace.app.rest.repository.DSpaceRestRepository; import org.dspace.app.rest.repository.LinkRestRepository; import org.dspace.app.rest.utils.RestRepositoryUtils; import org.dspace.app.rest.utils.Utils; +import org.dspace.authorize.AuthorizeException; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -61,6 +64,7 @@ import org.springframework.hateoas.Link; import org.springframework.hateoas.PagedResources; import org.springframework.hateoas.Resource; import org.springframework.hateoas.ResourceSupport; +import org.springframework.hateoas.Resources; import org.springframework.hateoas.UriTemplate; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -527,6 +531,46 @@ public class RestResourceController implements InitializingBean { return ControllerUtils.toResponseEntity(HttpStatus.CREATED, null, result); } + /** + * Upload a file against the collection resource endpoint. This is typically used for bulk creation of resources + * such for instance multiple workspaceitems from a CSV or bibliographic file + * + * @param request + * the http request + * @param apiCategory + * the api category + * @param model + * the rest model that identify the REST resource collection + * @param uploadfile + * the bulk file + * @return the list of generated resources + * @throws SQLException + * @throws FileNotFoundException + * @throws IOException + * @throws AuthorizeException + */ + @RequestMapping(method = { RequestMethod.POST }, headers = "content-type=multipart/form-data") + public ResponseEntity upload(HttpServletRequest request, + @PathVariable String apiCategory, + @PathVariable String model, + @RequestParam("file") MultipartFile + uploadfile) + throws SQLException, FileNotFoundException, IOException, AuthorizeException { + + checkModelPluralForm(apiCategory, model); + DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); + + Iterable content = repository.upload(request, uploadfile); + + List resources = new ArrayList<>(); + for (T modelObject : content) { + DSpaceResource result = repository.wrapResource(modelObject); + linkService.addLinks(result); + resources.add(result); + } + return ControllerUtils.toResponseEntity(HttpStatus.OK, null, Resources.wrap(resources)); + } + /** * PATCH method, using operation on the resources following (JSON) Patch notation (https://tools.ietf * .org/html/rfc6902) From 1bb1fd44a47dbc71411563c2971dc3cfa858412d Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Sat, 6 Oct 2018 21:02:53 +0200 Subject: [PATCH 072/193] Fix javadoc misunderstanding --- .../java/org/dspace/app/rest/RestResourceController.java | 6 ++---- .../dspace/app/rest/repository/DSpaceRestRepository.java | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index 9ca3726b8f..07db166db4 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -444,8 +444,7 @@ public class RestResourceController implements InitializingBean { * @param id * the id of the specific rest resource * @param extraField - * an option implementation specific parameter (could be used to force a specific processing strategy - * other than what can be guess by the filename or mimetype of the uploaded file) + * the original name of the uploaded file * @param uploadfile * the file to upload * @return the created resource @@ -479,8 +478,7 @@ public class RestResourceController implements InitializingBean { * @param id * the id of the specific rest resource * @param extraField - * an option implementation specific parameter (could be used to force a specific processing strategy - * other than what can be guess by the filename or mimetype of the uploaded file) + * the original name of the uploaded file * @param uploadfile * the file to upload * @return the created resource diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java index 8e3c2f74fd..2d79f61961 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java @@ -299,7 +299,7 @@ public abstract class DSpaceRestRepository Date: Sun, 7 Oct 2018 22:20:45 +0200 Subject: [PATCH 073/193] Fix bulk creation via file upload --- .../app/rest/RestResourceController.java | 6 +- .../rest/repository/DSpaceRestRepository.java | 12 +++- .../WorkspaceItemRestRepository.java | 23 +++++-- .../app/rest/submit/SubmissionService.java | 40 ++++++++---- .../app/rest/submit/step/UploadStep.java | 64 ++++++++++++++++++- 5 files changed, 120 insertions(+), 25 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index 07db166db4..bb9964e20b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletResponse; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -551,6 +552,8 @@ public class RestResourceController implements InitializingBean { public ResponseEntity upload(HttpServletRequest request, @PathVariable String apiCategory, @PathVariable String model, + @RequestParam(required = false) + String extraField, @RequestParam("file") MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { @@ -558,7 +561,7 @@ public class RestResourceController implements InitializingBean { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); - Iterable content = repository.upload(request, uploadfile); + Iterable content = repository.upload(request, extraField, uploadfile); List resources = new ArrayList<>(); for (T modelObject : content) { @@ -630,7 +633,6 @@ public class RestResourceController implements InitializingBean { String model, ID id, JsonNode jsonNode) throws HttpRequestMethodNotSupportedException { - checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); RestAddressableModel modelObject = null; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java index 2d79f61961..181af6b2e1 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java @@ -373,6 +373,8 @@ public abstract class DSpaceRestRepository upload(HttpServletRequest request, MultipartFile uploadfile) + public Iterable upload(HttpServletRequest request, String extraField, MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { Context context = obtainContext(); - Iterable entity = upload(context, request, uploadfile); + Iterable entity = upload(context, request, extraField, uploadfile); context.commit(); return entity; } /** * Method to implement to support bulk creation of objects from a file + * * @param request * the http request + * @param extraField + * the original name of the uploaded file * @param uploadfile * the file to process * @return the created objects @@ -402,7 +407,8 @@ public abstract class DSpaceRestRepository upload(Context context, HttpServletRequest request, MultipartFile uploadfile) + protected Iterable upload(Context context, HttpServletRequest request, String extraField, + MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java index 3bff819652..98ce42b614 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java @@ -65,6 +65,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.data.rest.webmvc.json.patch.PatchException; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -325,6 +326,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository upload(Context context, HttpServletRequest request, MultipartFile uploadfile) + public Iterable upload(Context context, HttpServletRequest request, String extraField, + MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { File file = Utils.getFile(uploadfile, "upload-loader", "filedataloader"); List results = new ArrayList<>(); @@ -360,7 +363,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository tmpResult = new ArrayList(); TransformationEngine transformationEngine1 = submissionLookupService.getPhase1TransformationEngine(); + TransformationSpec spec = new TransformationSpec(); + // FIXME this is mostly due to the need to test. The BTE framework has an assert statement that check if the + // number of found record is less than the requested and treat 0 as is, instead, the implementation assume + // 0=unlimited this lead to test failure. + // It is unclear if BTE really respect values other than 0/MAX allowing us to put a protection against heavy + // load + spec.setNumberOfRecords(Integer.MAX_VALUE); if (transformationEngine1 != null) { MultipleSubmissionLookupDataLoader dataLoader = (MultipleSubmissionLookupDataLoader) transformationEngine1.getDataLoader(); @@ -383,7 +393,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository()); log.debug("BTE transformation is about to start!"); - transformationEngine1.transform(new TransformationSpec()); + transformationEngine1.transform(spec); log.debug("BTE transformation finished!"); tmpResult.addAll(outputGenerator.getDtoList()); if (!tmpResult.isEmpty()) { @@ -417,7 +427,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository findAuthorizedOptimized = collectionService.findAuthorizedOptimized(context, + Constants.ADD); + if (findAuthorizedOptimized != null && findAuthorizedOptimized.size() > 0) { + collection = findAuthorizedOptimized.get(0); } else { - collection = collectionService.findAll(context, 1, 0).get(0); + throw new RESTAuthorizationException("No collection suitable for submission for the current user"); } - wsi = workspaceItemService.create(context, collection, true); - } catch (Exception e) { - log.error(e.getMessage(), e); } - } else { - //TODO manage setup of default collection in the case WSI it is not null - //TODO manage setup of collection discovered into request + + if (collection == null) { + throw new RESTAuthorizationException("collectionUUID=" + collectionUUID + " not found"); + } + wsi = workspaceItemService.create(context, collection, true); + } catch (SQLException e) { + // wrap in a runtime exception as we cannot change the method signature + throw new UncategorizedScriptException(e.getMessage(), e); + } catch (AuthorizeException ae) { + throw new RESTAuthorizationException(ae); } return wsi; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java index 8ca0e10bac..a602433c4d 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java @@ -7,22 +7,32 @@ */ package org.dspace.app.rest.submit.step; +import java.io.BufferedInputStream; +import java.io.InputStream; import java.util.List; +import org.apache.log4j.Logger; +import org.dspace.app.rest.model.ErrorRest; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.model.step.DataUpload; import org.dspace.app.rest.model.step.UploadBitstreamRest; +import org.dspace.app.rest.repository.WorkspaceItemRestRepository; import org.dspace.app.rest.submit.AbstractRestProcessingStep; import org.dspace.app.rest.submit.SubmissionService; +import org.dspace.app.rest.submit.UploadableStep; import org.dspace.app.rest.submit.factory.PatchOperationFactory; import org.dspace.app.rest.submit.factory.impl.PatchOperation; import org.dspace.app.util.SubmissionStepConfig; import org.dspace.content.Bitstream; +import org.dspace.content.BitstreamFormat; import org.dspace.content.Bundle; +import org.dspace.content.InProgressSubmission; +import org.dspace.content.Item; import org.dspace.content.WorkspaceItem; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.services.model.Request; +import org.springframework.web.multipart.MultipartFile; /** * Upload step for DSpace Spring Rest. Expose information about the bitstream @@ -30,8 +40,10 @@ import org.dspace.services.model.Request; * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ -public class UploadStep extends org.dspace.submit.step.UploadStep implements AbstractRestProcessingStep { +public class UploadStep extends org.dspace.submit.step.UploadStep + implements AbstractRestProcessingStep, UploadableStep { + private static final Logger log = Logger.getLogger(UploadStep.class); @Override public DataUpload getData(SubmissionService submissionService, WorkspaceItem obj, SubmissionStepConfig config) @@ -79,4 +91,54 @@ public class UploadStep extends org.dspace.submit.step.UploadStep implements Abs } + @Override + public ErrorRest upload(Context context, SubmissionService submissionService, SubmissionStepConfig stepConfig, + InProgressSubmission wsi, MultipartFile file, String extraField) { + + Bitstream source = null; + BitstreamFormat bf = null; + + Item item = wsi.getItem(); + List bundles = null; + try { + // do we already have a bundle? + bundles = itemService.getBundles(item, Constants.CONTENT_BUNDLE_NAME); + + InputStream inputStream = new BufferedInputStream(file.getInputStream()); + if (bundles.size() < 1) { + // set bundle's name to ORIGINAL + source = itemService.createSingleBitstream(context, inputStream, item, Constants.CONTENT_BUNDLE_NAME); + } else { + // we have a bundle already, just add bitstream + source = bitstreamService.create(context, bundles.get(0), inputStream); + } + + source.setName(context, extraField); + source.setSource(context, file.getOriginalFilename()); + + // Identify the format + bf = bitstreamFormatService.guessFormat(context, source); + source.setFormat(context, bf); + + // Update to DB + bitstreamService.update(context, source); + itemService.update(context, item); + + } catch (Exception e) { + log.error(e.getMessage(), e); + ErrorRest result = new ErrorRest(); + result.setMessage(e.getMessage()); + if (bundles != null && bundles.size() > 0) { + result.getPaths().add( + "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + stepConfig.getId() + "/files/" + + bundles.get(0).getBitstreams().size()); + } else { + result.getPaths() + .add("/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + stepConfig.getId()); + } + return result; + } + + return null; + } } From 2d2afd886cbde774b1ef54c35e6804ea9ddb32a6 Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Sun, 7 Oct 2018 22:21:17 +0200 Subject: [PATCH 074/193] Set the status when the errors information are available --- .../dspace/app/rest/converter/WorkspaceItemConverter.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java index 4b8bcd9700..89eae193dc 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java @@ -85,6 +85,10 @@ public class WorkspaceItemConverter // info if (collection != null) { + // we set the status to true as we will discover validation error later in this block + // we could eventually leave the status to empty if we don't have collection information, this could be + // eventually the case when projection support will be included + witem.setStatus(true); SubmissionDefinitionRest def = submissionDefinitionConverter .convert(submissionConfigReader.getSubmissionConfigByCollection(collection.getHandle())); witem.setSubmissionDefinition(def); @@ -108,6 +112,7 @@ public class WorkspaceItemConverter (AbstractRestProcessingStep) stepClass.newInstance(); for (ErrorRest error : stepProcessing.validate(submissionService, obj, stepConfig)) { addError(witem.getErrors(), error); + witem.setStatus(false); } witem.getSections() .put(sections.getId(), stepProcessing.getData(submissionService, obj, stepConfig)); From 4a0b636b3de03f8e38dfd8dba4c498215fe78fe4 Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Sun, 7 Oct 2018 22:23:40 +0200 Subject: [PATCH 075/193] DS-3850 add ITs for create, bulkcreate, metadata patch --- .../rest/WorkspaceItemRestRepositoryIT.java | 824 ++++++++++++++++++ .../rest/matcher/WorkspaceItemMatcher.java | 5 +- .../org/dspace/app/rest/bibtex-test.bib | 14 + .../org/dspace/app/rest/simple-article.pdf | Bin 0 -> 103731 bytes 4 files changed, 842 insertions(+), 1 deletion(-) create mode 100644 dspace-spring-rest/src/test/resources/org/dspace/app/rest/bibtex-test.bib create mode 100644 dspace-spring-rest/src/test/resources/org/dspace/app/rest/simple-article.pdf diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java index 890a11795e..32b7e6dbed 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java @@ -10,30 +10,46 @@ package org.dspace.app.rest; import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.UUID; +import javax.ws.rs.core.MediaType; + import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.CharEncoding; import org.dspace.app.rest.builder.BitstreamBuilder; import org.dspace.app.rest.builder.CollectionBuilder; import org.dspace.app.rest.builder.CommunityBuilder; +import org.dspace.app.rest.builder.EPersonBuilder; import org.dspace.app.rest.builder.WorkspaceItemBuilder; import org.dspace.app.rest.matcher.CollectionMatcher; import org.dspace.app.rest.matcher.ItemMatcher; import org.dspace.app.rest.matcher.WorkspaceItemMatcher; +import org.dspace.app.rest.model.patch.AddOperation; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.app.rest.model.patch.RemoveOperation; +import org.dspace.app.rest.model.patch.ReplaceOperation; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; import org.dspace.content.WorkspaceItem; +import org.dspace.eperson.EPerson; import org.hamcrest.Matchers; import org.junit.Test; +import org.springframework.mock.web.MockMultipartFile; /** * Test suite for the WorkspaceItem endpoint @@ -301,4 +317,812 @@ public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegration .andExpect(status().is(404)); } + @Test + /** + * Create three workspaceitem with two different submitter and verify that the findBySubmitter return the proper + * list of workspaceitem for each submitter also paginating + * + * @throws Exception + */ + public void findBySubmitterTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. create two users to use as submitters + EPerson submitter1 = EPersonBuilder.createEPerson(context) + .withEmail("submitter1@example.com") + .build(); + EPerson submitter2 = EPersonBuilder.createEPerson(context) + .withEmail("submitter2@example.com") + .build(); + + // create two workspaceitems with the first submitter + context.setCurrentUser(submitter1); + + + //3. Two workspace items in two different collections + WorkspaceItem workspaceItem1 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem workspaceItem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 2") + .withIssueDate("2016-02-13") + .build(); + + //4. A workspaceitem for the second submitter + context.setCurrentUser(submitter2); + WorkspaceItem workspaceItem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 3") + .withIssueDate("2016-02-13") + .build(); + + // use our admin to retrieve all the workspace by submitter + String token = getAuthToken(admin.getEmail(), password); + + // the first submitter has two workspace + getClient(token).perform(get("/api/submission/workspaceitems/search/findBySubmitter") + .param("size", "20") + .param("uuid", submitter1.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.containsInAnyOrder( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, "Workspace Item 2", + "2016-02-13")))) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.not(Matchers.contains(WorkspaceItemMatcher + .matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", "2016-02-13"))))) + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(2))); + + // the first submitter has two workspace so if we paginate with a 1-size windows the page 1 will contains the + // second workspace + getClient(token).perform(get("/api/submission/workspaceitems/search/findBySubmitter") + .param("size", "1") + .param("page", "1") + .param("uuid", submitter1.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.contains(WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, + "Workspace Item 2", "2016-02-13")))) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.not(Matchers.contains( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", + "2016-02-13"))))) + .andExpect(jsonPath("$.page.size", is(1))) + .andExpect(jsonPath("$.page.totalElements", is(2))); + + // the second submitter has a single workspace + getClient(token).perform(get("/api/submission/workspaceitems/search/findBySubmitter") + .param("size", "20") + .param("uuid", submitter2.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.contains( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", + "2016-02-13")))) + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(1))); + } + + @Test + /** + * Test the creation of workspaceitem POSTing to the resource collection endpoint. It should respect the collection + * param if present or use a default if it is not used + * + * @throws Exception + */ + public void createEmptyWorkspateItemTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + // create a workspaceitem explicitly in the col1 + getClient(authToken).perform(post("/api/submission/workspaceitems") + .param("collection", col1.getID().toString())) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$._embedded.collection.id", is(col1.getID().toString()))); + + // create a workspaceitem explicitly in the col2 + getClient(authToken).perform(post("/api/submission/workspaceitems") + .param("collection", col2.getID().toString())) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$._embedded.collection.id", is(col2.getID().toString()))); + + // create a workspaceitem without an explicit collection, this will go in the first valid collection for the + // user: the col1 + getClient(authToken).perform(post("/api/submission/workspaceitems")) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$._embedded.collection.id", is(col1.getID().toString()))); + + // TODO cleanup the context!!! + } + + @Test + /** + * Test the creation of workspaceitems POSTing to the resource collection endpoint a bibtex file + * + * @throws Exception + */ + public void createMultipleWorkspaceItemFromFileTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + String authToken = getAuthToken(admin.getEmail(), password); + + InputStream bibtex = getClass().getResourceAsStream("bibtex-test.bib"); + final MockMultipartFile bibtexFile = new MockMultipartFile("file", bibtex); + + // bulk create workspaceitems in the default collection (col1) + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(bibtexFile) + .param("extraField", "bibtex-test.bib")) + // bulk create should return 200, 201 (created) is better for single resource + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone['dc.title'][0].value", + is("My Article"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[0]._embedded.collection.id", is(col1.getID().toString()))) + .andExpect(jsonPath("$._embedded.workspaceitems[1].sections.traditionalpageone['dc.title'][0].value", + is("My Article 2"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[1]._embedded.collection.id", is(col1.getID().toString()))) + .andExpect(jsonPath("$._embedded.workspaceitems[2].sections.traditionalpageone['dc.title'][0].value", + is("My Article 3"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[2]._embedded.collection.id", is(col1.getID().toString()))) + ; + + // bulk create workspaceitems explicitly in the col2 + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(bibtexFile) + .param("collection", col2.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone['dc.title'][0].value", + is("My Article"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[0]._embedded.collection.id", is(col2.getID().toString()))) + .andExpect(jsonPath("$._embedded.workspaceitems[1].sections.traditionalpageone['dc.title'][0].value", + is("My Article 2"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[1]._embedded.collection.id", is(col2.getID().toString()))) + .andExpect(jsonPath("$._embedded.workspaceitems[2].sections.traditionalpageone['dc.title'][0].value", + is("My Article 3"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[2]._embedded.collection.id", is(col2.getID().toString()))) + ; + + bibtex.close(); + } + + @Test + /** + * Test the creation of a workspaceitem POSTing to the resource collection endpoint a PDF file. As a single item + * will be created we expect to have the pdf file stored as a bitstream + * + * @throws Exception + */ + public void createWorkspaceItemFromPDFFileTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + String authToken = getAuthToken(admin.getEmail(), password); + + InputStream pdf = getClass().getResourceAsStream("simple-article.pdf"); + final MockMultipartFile pdfFile = new MockMultipartFile("file", "/local/path/myfile.pdf", "application/pdf", + pdf); + + // bulk create a workspaceitem + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(pdfFile) + .param("extraField", "sample-article.pdf")) + // bulk create should return 200, 201 (created) is better for single resource + .andExpect(status().isOk()) + //FIXME it will be nice to setup a mock grobid server for end to end testing + // no metadata for now +// .andExpect(jsonPath("$._embedded.workspaceitems[0]._embedded.traditionalpageone['dc.title'][0].value", +// is("This is a simple test file"))) + // we can just check that the pdf is stored in the item + .andExpect( + jsonPath("$._embedded.workspaceitems[0].sections.upload.files[0].metadata['dc.title'][0].value", + is("sample-article.pdf"))) + .andExpect(jsonPath( + "$._embedded.workspaceitems[0].sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/myfile.pdf"))) + ; + + pdf.close(); + } + + @Test + /** + * Test the exposition of validation error for missing required metadata both at the creation time than on existent + * workspaceitems + * + * @throws Exception + */ + public void validationErrorsRequiredMetadataTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem workspaceItem1 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + getClient(authToken).perform(get("/api/submission/workspaceitems/" + workspaceItem1.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + ; + + WorkspaceItem workspaceItem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 2") + .build(); + + getClient(authToken).perform(get("/api/submission/workspaceitems/" + workspaceItem2.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(false))) + .andExpect(jsonPath("$.errors[?(@.message=='error.validation.required')]", + Matchers.contains( + hasJsonPath("$.paths", Matchers.contains( + hasJsonPath("$", Matchers.is("/sections/traditionalpageone/dc.date.issued")) + ))))) + ; + + // create an empty workspaceitem explicitly in the col1, check validation on creation + getClient(authToken).perform(post("/api/submission/workspaceitems") + .param("collection", col1.getID().toString())) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.status", is(false))) + // title and author are required in the first panel + // the json path with a @ selector always return an array + .andExpect(jsonPath("$.errors[?(@.message=='error.validation.required')]", + Matchers.contains( + hasJsonPath("$.paths", Matchers.containsInAnyOrder( + hasJsonPath("$", Matchers.is("/sections/traditionalpageone/dc.title")), + hasJsonPath("$", Matchers.is("/sections/traditionalpageone/dc.date.issued")) + ))))) + ; + } + + @Test + /** + * Test the update of metadata + * + * @throws Exception + */ + public void patchUpdateMetadataTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withSubject("ExtraEntry") + .build(); + + // a simple patch to update an existent metadata + List updateTitle = new ArrayList(); + Map value = new HashMap(); + value.put("value", "New Title"); + updateTitle.add(new ReplaceOperation("/sections/traditionalpageone/dc.title/0", value)); + + String patchBody = getPatchContent(updateTitle); + + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$", + // check the new title and untouched values + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "New Title", "2017-10-17", "ExtraEntry")))); + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$", + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "New Title", "2017-10-17", "ExtraEntry")))) + ; + } + + @Test + /** + * Test delete of a metadata + * + * @throws Exception + */ + public void patchDeleteMetadataTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withSubject("ExtraEntry") + .build(); + + WorkspaceItem witemMultipleSubjects = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withSubject("Subject1") + .withSubject("Subject2") + .withSubject("Subject3") + .withSubject("Subject4") + .build(); + + // try to remove the title + List removeTitle = new ArrayList(); + removeTitle.add(new RemoveOperation("/sections/traditionalpageone/dc.title/0")); + + String patchBody = getPatchContent(removeTitle); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(false))) + .andExpect(jsonPath("$.errors[?(@.message=='error.validation.required')]", + Matchers.contains(hasJsonPath("$.paths", + Matchers.contains( + hasJsonPath("$", + Matchers.is("/sections/traditionalpageone/dc.title"))))))) + .andExpect(jsonPath("$", + // check the new title and untouched values + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + null, "2017-10-17", "ExtraEntry")))); + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(false))) + .andExpect(jsonPath("$.errors[?(@.message=='error.validation.required')]", + Matchers.contains( + hasJsonPath("$.paths", Matchers.contains( + hasJsonPath("$", Matchers.is("/sections/traditionalpageone/dc.title")) + ))))) + .andExpect(jsonPath("$", + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + null, "2017-10-17", "ExtraEntry")))) + ; + + // try to remove a metadata in a specific position + List removeMidSubject = new ArrayList(); + removeMidSubject.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject/1")); + + patchBody = getPatchContent(removeMidSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemMultipleSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject3"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Subject4"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemMultipleSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject3"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Subject4"))) + ; + + List removeFirstSubject = new ArrayList(); + removeFirstSubject.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject/0")); + + patchBody = getPatchContent(removeFirstSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemMultipleSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject3"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject4"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemMultipleSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject3"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject4"))) + ; + + List removeLastSubject = new ArrayList(); + removeLastSubject.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject/1")); + + patchBody = getPatchContent(removeLastSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemMultipleSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject3"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemMultipleSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject3"))) + ; + + List removeFinalSubject = new ArrayList(); + removeFinalSubject.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject/0")); + + patchBody = getPatchContent(removeFinalSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemMultipleSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemMultipleSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) + ; + } + + @Test + /** + * Test the addition of metadata + * + * @throws Exception + */ + public void patchAddMetadataTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withIssueDate("2017-10-17") + .withSubject("ExtraEntry") + .build(); + + + // try to add the title + List addTitle = new ArrayList(); + // create a list of values to use in add operation + List> values = new ArrayList>(); + Map value = new HashMap(); + value.put("value", "New Title"); + values.add(value); + addTitle.add(new AddOperation("/sections/traditionalpageone/dc.title", values)); + + String patchBody = getPatchContent(addTitle); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$", + // check if the new title if back and the other values untouched + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "New Title", "2017-10-17", "ExtraEntry")))); + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$", + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "New Title", "2017-10-17", "ExtraEntry")))) + ; + } + + @Test + /** + * Test the addition of metadata + * + * @throws Exception + */ + public void patchAddMultipleMetadataValuesTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .build(); + + // try to add multiple subjects at once + List addSubjects = new ArrayList(); + // create a list of values to use in add operation + List> values = new ArrayList>(); + Map value1 = new HashMap(); + value1.put("value", "Subject1"); + Map value2 = new HashMap(); + value2.put("value", "Subject2"); + values.add(value1); + values.add(value2); + + addSubjects.add(new AddOperation("/sections/traditionalpagetwo/dc.subject", values)); + + String patchBody = getPatchContent(addSubjects); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject2"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject2"))) + ; + + // add a subject in the first position + List addFirstSubject = new ArrayList(); + Map firstSubject = new HashMap(); + firstSubject.put("value", "First Subject"); + + addFirstSubject.add(new AddOperation("/sections/traditionalpagetwo/dc.subject/0", firstSubject)); + + patchBody = getPatchContent(addFirstSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", + is("Subject2"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Subject2"))) + ; + + // add a subject in a central position + List addMidSubject = new ArrayList(); + Map midSubject = new HashMap(); + midSubject.put("value", "Mid Subject"); + + addMidSubject.add(new AddOperation("/sections/traditionalpagetwo/dc.subject/2", midSubject)); + + patchBody = getPatchContent(addMidSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", + is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", + is("Subject2"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", is("Subject2"))) + ; + + // append a last subject without specifying the index + List addLastSubject = new ArrayList(); + Map lastSubject = new HashMap(); + lastSubject.put("value", "Last Subject"); + + addLastSubject.add(new AddOperation("/sections/traditionalpagetwo/dc.subject/4", lastSubject)); + + patchBody = getPatchContent(addLastSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", + is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", + is("Subject2"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][4].value", + is("Last Subject"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", is("Subject2"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][4].value", is("Last Subject"))) + ; + + // append a last subject without specifying the index + List addFinalSubject = new ArrayList(); + Map finalSubject = new HashMap(); + finalSubject.put("value", "Final Subject"); + + addFinalSubject.add(new AddOperation("/sections/traditionalpagetwo/dc.subject/-", finalSubject)); + + patchBody = getPatchContent(addFinalSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", + is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", + is("Subject2"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][4].value", + is("Last Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][5].value", + is("Final Subject"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", is("Subject2"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][4].value", is("Last Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][5].value", is("Final Subject"))) + ; + } + } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/WorkspaceItemMatcher.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/WorkspaceItemMatcher.java index 3481a715c4..4117e1892a 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/WorkspaceItemMatcher.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/WorkspaceItemMatcher.java @@ -8,6 +8,7 @@ package org.dspace.app.rest.matcher; import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasNoJsonPath; import static org.dspace.app.rest.test.AbstractControllerIntegrationTest.REST_SERVER_URL; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.is; @@ -70,7 +71,9 @@ public class WorkspaceItemMatcher { // Check workspaceitem properties matchProperties(witem), // Check core metadata all appear in the first describe panel "traditionalpageone" - hasJsonPath("$.sections.traditionalpageone['dc.title'][0].value", is(title)), + title != null ? + hasJsonPath("$.sections.traditionalpageone['dc.title'][0].value", is(title)) : + hasNoJsonPath("$.sections.traditionalpageone['dc.title']"), hasJsonPath("$.sections.traditionalpageone['dc.date.issued'][0].value", is(dateIssued)), // Check keywords they appear in the second describe panel "traditionalpagetwo" hasJsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is(subject)), diff --git a/dspace-spring-rest/src/test/resources/org/dspace/app/rest/bibtex-test.bib b/dspace-spring-rest/src/test/resources/org/dspace/app/rest/bibtex-test.bib new file mode 100644 index 0000000000..4d197ff90f --- /dev/null +++ b/dspace-spring-rest/src/test/resources/org/dspace/app/rest/bibtex-test.bib @@ -0,0 +1,14 @@ +@misc{ Nobody01, + author = "Nobody Jr", + title = "My Article", + year = "2006" } + +@misc{ Nobody02, + author = "Nobody Jr", + title = "My Article 2", + year = "2006" } + +@misc{ Nobody03, + author = "Nobody Jr", + title = "My Article 3", + year = "2018" } diff --git a/dspace-spring-rest/src/test/resources/org/dspace/app/rest/simple-article.pdf b/dspace-spring-rest/src/test/resources/org/dspace/app/rest/simple-article.pdf new file mode 100644 index 0000000000000000000000000000000000000000..abefe17f9369efbc22e14487b7a90858c9f697ea GIT binary patch literal 103731 zcmb^Yb8szR)c%Xcwr$(CZ6|xhwr$(ClN~2Jwrz8VJGOoE-uHL!sZ;0t`K?;jqx&S^eRcC% zbJK6BQw*myc7HDqzklYuLY#dbtva8)Ic{COfAVqn@M-U8U;p*(`Fi*0G5Ii-P3g~@N0YL>S^=fXw|P<@XPJH>#{cU z^X1@UwD3J+lUb-~ z(N&1iOJ#nS{9clZT}t7pOzv19f?rU|Dv{2TiT)!MZF0lnf$fRi1qYA-KrjZUC#LsL z?wTH&{wMgh(L>u)yNeE>0l;94PESoAp4>M*GW{>`(T$S_wiCI*mW_QX__On2dPJ?{{>dRq47ZXMDKzDhy%duf;1B~`>S@<5C0o{ z``bg^Q@x7@pbkKk0`0HOfUy1>__bX1#Z64@u2sl@4^7c0$}SxSCdu;toND^{{uXH{~mQQ zN^{|>`_!}b-X81y;>Kee&WbC<;c(sAT0Z#XEbZaL-J^K>in%427z$%*XYzmi?Pu?Q zToLAfyzqZ^m^s#EE|%uGy7Y;6BG554Gw z_CXVG70_E=Zn{pM639FqpEAjoW*IjTp@=jQaTAdu0!ATAK!*a+23GcgR@MfQ5fgVX zR7OVgg^$LW({vOU0|x`vR6+(8S5{V*`p3JC%HjL>dguN7uXpeDb7w2>y_&nLtNU`L zbDp!pG?-yX0z!ZUefyC(c$)oc2GYPi(!vGJ*z_b}D(@M&MFMmU0UZ?~>&4~YymsW7 zcoH#RfvzqRe+fNQLSkb=z1EltD#oq$3N`R!humWZdPO;nmeKD3B+AA1YUK#i?ym|oVXcCcm7&}d- zV2hgB%860^LY%eFSJ~VNdXNfHT4AxM%VF`oGO>K-jNbh)4Efko#WmZi=INmZEzI^t z&cbAEZfM!dl{LRd=J8MQ{Z^}hidMfAIl&~);VqjvY4aSp9RGC43sQRN$i~?;6JS0* z1%--6==U6a`1iI^C`c|4Ur!ECe0zf3%-JfHMw2hW73M3*+T@cQ4o+B8W;HfC< z>^-_S03tZx$vKF{qO*acE0A%)6MvI)2}NxH2j$GGO9CH*8%k=o$oKDbq53F#9|MEo zLp}_Ase?ftQH{QsNg>I*#K-UiX83?u5nlgd-x$XozL2Tg?oavDK~LGpM@8vk3`=`A z+H#@WQcPK~#1e3R;l-6PTl-OT*_CUKo}OCS_Sr>oaK2wJ(lXL+ zjD&aNQ5nXWj5ztHZ^lszq@4?ja>DLb$!Y}P`7wpyh66>J_(X#vab&rYgBp>8hsL;@ zSrgf1Q!cFHtmmjnU3p|rL1c7SciS)g7num#Vm% z8<{ya@#2*CdCHHAYj}?a_B(=3P&%#gOq`+wC{C#S4VZh`rv6$ql;cvv&HoPuZ@D zCV9;_X1TDUi-WQVHD}0OTT49!b#^96M}4LI3-;KK*tCD|ILo2Pijd}UaG+b}|aHIS-6L|NcD=4S)WOi_NaWRzt1@ND&d|J*T zD1J;UU4Oq;`1=jek-7TP#+>=n)6kbtb`Ssko-LZJxbf!EdG%@Jz7bN~yPdr<=iIXY z>5f3KC3p(?RybQ(JBu-D=h^Kt=v@OZotc@(-~=K-ehw8%EfdPX-(y&#+h7f;eZ;=4 zqm1lmn{GK*0&bmDofk1zVp%sOFTPp*gkWZ3Jeu>bC7WUP_aS4`+0#%c!&=?WI$Lof z^>sz=`~sUZjOxxBM`vYEBKG#yR$|J&G(xjmES;$YnkgbJj z6c~Y}o&A}GU3NBC2VJ%=z*$!oM3plgdz*{9fBH$#P)wX*^Y~8*SOKU90<`lNZqV4c z*~BP$V4~!gc5`Pvh;Vnt*#H*4j;qx~l%{z_3%{%3K~L*J(qEqY#m*~Af!!MR8U5$! z$;i^=xNFYG=F?~XOw6>;T;kiuz8!Q*_1j6!v?c!fJ#ALO`AJ^1wHxh_+rgcCUz3q= zSjIGhyb`*%k5E*j%P|SdykA|sZEoV#G{*f2=&$dsf@+p^*q=N0n`pYv(-^IEEvr{r z4?EWRcD}u)u-{c3HN6!>$UCg%||=QvR55-X0FS{OIpkIurt>^$~8Dz^*+n{;cPjs{4EBF=Kc72ObIq2$!T6g zKEzB6@sva&iqyK}bD;!o5ajHzu(t!So>~D7qsO-ZJ4r*^ho!idZfBl0`?1;Q?d1Cm+ha;W#*fz(8Lum&PeR@3a`SH5 zdU?LP4*Tow=-K!QZrtw@Z{PE)?b$@K<5T|M(FpSH@9BiG9^Je9)eM#3ra7N(2cM*3D96kibR`2g66P@amZpyORBV7g&((Bd!9PJl#v6-I7zb0w!(!1WD%0@YD=6W{; zSfW<+Z+e-r$2f}4Fi13`uv8KlKH5mHSr`c zYrhz;hy1gI5g$#$@(w0#vlfypNxcIPqX4C(Gjpp zlI&$w#m@!`aI`wccl-RhW32VY;Jd?gZ%2djLq2B^q~pQ&$?WB!sku6xHrCks-nT9$ zWUsyco0I*W`lfm<+6>v!!$wXtO_#mcD*yEv7aR4o#XRf#9d!x3bIiC=!(W zQ&sab=jm!HCZFur`S~~QpSJV5!t~fnbogqabG|(S4yG=g7fWdJ6EPw;3zD)|f;4)f zkYd$3OHwoY%c4sq+h3TQuh&K;IgNLZze?brJW}G`MOQdrNxnzPU}?8d-R??>#P_n~ zzuaG}$0{i=@L8Kl(mz<)s2<>Po?CwkNdj&&?rbbpSz2o>CzcR6CZz7(Rlgs&!p8Fi zaupU}mRj*NGG<(@L4 z1{UV$FmI0(()0;{Rn=5DiY)49JyT7K?mUWmPI?3!^6o_*G z1g57J6ulKjWZvEac;>98>vN+y%%qKytfs~i>8WYQ?d|C?v^dN`*wETD^?V9aq<3w& zPBM~d$FVq|xr`G8dttf~80u)T_+7_N=CX!r#hF_dNf$v~cVK0FjEYlnsA{3!5_SZC zaFh{}W-K9aGN4sg_+Do_xJoPWv5Fc3GuQc&)vLzkW8sg8MaQmyCM&YRA;|2yu&<6& zyxlGzv}5JomvrWWGpF(8evzvFg-ge23twtsZGL=g+7Q9uYHzoNFlXIgC*BChD5$hS zjA}$3iZ695`|zInaQb}sM?DR#nnfWBVqsbtGWRP5Lt*JAaZu97H)1i=f7NX-_8WSt z??azuu-OKPV)kQFSoGjKVx9FH+HAJoOn;t>KhTk!nVDL;M{6WM3oSqG-=p3v#FT#q zLWaKrWOc%~4CMKt&nbIT_^Q6Yf+tb*!pH}2H^{*};6O(%_?G75GZ~5f-T2Ze_4KJc zgB2t9DAvsz_HkvtOwr0+k->-Q>G@y-k&%DReeb-aSkYy6$*;kCk+n7I)!Ocf<4FU9 zknnqMBQu%u7~u7Ia27Uk)Q@2&t>NIho>^y%-4_toQC(jx8MCcnd+rOJlz#`=NYS3 zN?I(b_VJJnOjC1~OxpkMp5S~L_mqsiM$cEZzirIEvTS@lAJY<`Hue1H*P>q5(r%@0 z`c7sTjS^~BAdWJx(VP_3u@E;7yXY_atZ{tKB5DhaEQDiQhdjhpv!b}ixEU!8QV4XT zkt2`z#fZ2T?O1$gT^!VJw5xeo9?hA^^OLc*(@E5$AVfy;u3u(Z8vY0UB)6RL)5yoR z-%1J6DuQ}#dz~vO&&R_Gm)*{fL+a1=y_Xo@59!Z7OmB0O(TP68p3~OF{%8E_56j{A zC8BZPXOZ7KORSFHBR##{%^Wtn$4#)LjdC@as`*`xD>Lw& z-)-e@ne_VmBTc@~{IlOC1GLij3VzWPTTC{i=cDHC^!`qZS9Ns!`5k=Jr-^1+n)`jMd#D`QP26}5S2mhM(0jJ0m%vU7MCru*I7(z$+oVp%o%DH##4RI0J~|HV6y-BI@hn&h$xfBWL>AU24I)iZSrWY^ zjFB{4lD#GGHRfwV?wL?c9G^rvrg~_3=e{7@l5{+-aL3{q+afE?G*PR=0}b>M#%Jzl{fP=&%QPZe(2^zsSVcM4g2PO&Cc(aWJ58VVE!GOmrpL3 zKqy@2N7|bl%~VHXhlceK3eqio^p6`4JMg(!h!R@r9PSm|r9S!t!UOUZ-+_5cINm{2cTRu6WLDC72EPKD_u&!zT|^!2Efh;t26{8I`B$e$!MKror4 z@7{!Km(hS6?U9z&_N-O-6V9>)EpNb%?+lMQ@JkUK)FjqX zr&g^ExN4}#Ugu7ih^LUgCexpWh8|@?C^c}sulc|nQSQJEgM+%#fsw;V?a*OL92%CE z74#21X2<=ZAt`(D%aFJ2*x&ac*!hfTH?KbZ%km!E8v44L=}*qKwk<@jtp*1Yu=zDE z${rC&_M7KYE}zWe5wUHD&74O!Xzdaa{z~=&G$kQEHhcGlvi>*UO84M5K3}Qy#wfkW zocooSw`9(NN?My90*Ygp8q4kbe?HyYsu+3>39*cOqkixxUf?j z5~c+pPm#4^nni*OF_OklT`dhQ$dF4~#zQL1U-(rHtafphb{u58PBu)t-(whX5R(op zHeonz^P#swf(ip#R%|}U17XUr?}`xjN$WEWzgRFa+3Mftq6*Ptv4h`R-gsnSCN-d+CHl@e}qzS101SxgG6cE z)Yw|sG&)T)j$Oi+wo;=~|4QdUJ;r%G-l(C5i3A<0vE)gkM%AJrvyCQ>v+dE`!f^A! z6_l;WONjB5(BUUz`KZfh<)-hWR!Bqc=f@*OI&@2~2JH8dE`#7FqkTuzY7h2-)><29 zyBf`tbGv}2gE24qnHJcR_{S^%m390j*B?YXwucA-mrl7BDwDo(K zpb@5l{U^YwN|edO4sD2qhI~6vT*pQGZvXBuOg7EHA!%eJ;+{N^bg;a5ghS4mrQ+EFAWA^loGe7%cCW``VgiuybP}NFqNW1icEL?VkpmLPU@Ra# z^#aDCp})d%#vrglf1cjlF~V`XbyOJKzz0fb1+e0v9m;Yym}v1vz^F=i1|;DGhcJ1P z(qr%$G5f&Xcx44cyR&2Ad;yhs2*T0s?sCT4{20VAbW)2yVD!}$YAIL_f!~xn= z@Js;jK`>*F6*x>51j)3BX+5^a` z7(Fl=$9?)#)PS@`_NdgbJ`h+Y_5zOZGzyIRm@UL^blEUcf#MG8QBpxP3R(JYE!1w{ zIuZw=E!Yg$X&`eVXoAY;$=D$3A!5O+#SehaffNh9)S%Y_MnE}=aDgd7{Xp9DKhRe=(?H*fTcfj8;JaG1Pa_hzM1m_nL z`~kWlSORYg8uXsO40tZ&4azTipU(}TofqkYoFi$oM%RJU)O3C!(gArv(t&wl(t)rg z*mHpIfOVknz;(dirL^Eb1NK4N27STO0e<1y9kl@Mz`TKWA>5VtgW`a?D|sUQ0JN)W zfxc_@2j?vR-wpNy($WV$Kimslc=ri%AH9YA4b?`}3W%NPIZ$iyW58^oWU%Di{Rwj) zCf9{%Jm{5>A{b(EE?!Rr2S`r{2k;jtKlTSw_tYM(1?w)u1KV!ZN#-u`15S8daW803 zpcn98FusT#5nUknV%q@w;>!SUE+0sK%nzVT@mbKGXaJB8;v;ZRyc-x|fv*MSt{(zo z0Vc4Z5F_|=aqx+0pD3OPBM@TouYTVXC@=IIs&K->RbW90d$7Nf`3^7CUZ^*$4;Vi; z(*1_t1+E+31Md>}1Ed@Dg?t0o2h(?W5Bh;&clE@#FB#7-_zC>ENYz4c*U|;(1}^+> zQE*PB~xnqo?Lv3W9@< zZ`g5*vkp0aSqBe`c;)&3xIWoNPs_O#1g9O}EaMgxopb!64jxp0Qu|z=Xrrfp9df?l z|NnvVM>y{ICjBFH%JEA&c&Ou6`2H#Ne*)^yuwAZCu+dXWE`{%(I(7e7_z^Syi2qLr z`Z@Z^{cjMQaeQ-(Ta5oXch13sFbj`7Orr@KF4tJ>vSL8a(e!x%NA;&l3xJAUDG6@F{!9Uuc6zGrQXZrsq0F9nP{s{XV-yna|Km7j!esPP> z&N)5#2M?ck<<|#XzJ#Nv?_3IhM;+hZ@ydH=|8L<3djG(m(D@@i;__u2J@w{R_&e$N z2KcGtl+%-b@ZkRc09*?G;XnL;1OLy+JuY9wpOHV{-5;sE^DBMv`{y_6@OJi1s~~u% zKXf|##aRB$>A=&OB?{4dTNEh2{*6`Ge&4=jh1i*NuYMv+y0d+Q9aw$Coctb;j%*`53c&?|vLEgmWW@{Qr528^0O;R|_6>&f zEx@B3pUWQA$%wWn;MOGrQsV~sMgdpqmg~li`3Ep?hLYWaI#W8FyYWCE6<*s(_GT_g=aW z|6CX+T-e#KALU{&es{W_u0%s)ZXVJ{-mV$y=GN zaKQmWWuFO&W)*WO#&ubNQdQ3`10FtUSiiq8IxGl2V=lWl!+qtrLdH8{-t`cYdmdQx zhHc-PG{F<0pUhT-kKFCabmfe<7zlWTFK)X=^|;VNlQ2REO#z<@1%yAn3sQ9Xp4$id zLs$5Q!l9V-#gJs9G2om6NPt`)JwVbeYw?D1;7V=v7oe&0Q?sUE)Fitx9gA! zN?@-JD6e)L7YEP_#Xt%H#IARSdXml6e5O#(f?F>eNLz=&YSTRsJuq)*0`PaNwb8xX z`qh0NKJ=&8HdOb$&0G8z1|PxJx}XNzKE?fGLx14wkWWz`xcnjW8$~oKW^tkHTs5{- zsaL}iZZ%+anbZBo7r?opGx>_d6VJF~4%^4SC9i z%m*zm7+>D*cmW~8QpUULF1{VL9h@C&A5_6m!7#zt-l%W7Z?x~E07fd*CFp<92+%vDVszFrHGuCLL=mX9JdxNUrfwKpB{fM^**JS~PieDEtRx6?Ioc30f&dn!Pfc{Ya zo+6^&Dm{x-NJ(W!GWQFq*)*Xt!;H@DX-7RnjIO+xP zc6%4R&;{`4Mn7-q1MGydaQ|zuzu-T7##gr>yYo3M!{qF@c)=Whj*=IMej1 zK{71yz|Q!Hz?f)FP{nUlPN3^_Ab*t#L`Bg^EfAaWFU&p~+Urbdiuw0WM&pzjwP7yMNdFYZB<`_SKb*JsEhwx!e%_KtJXwJ*aQo zh~KbY#v&h)uycURrX)o@8H?=Rpd8FK9I(Yia1tcRq$&`)PM{;wdLi4;bQzn55$tgzb_P-rvdQn0Vh?k?o6z1!W& z5aS8ep-0`1HmWjqnzkIF-M0quCwJG(f^jqWK9}^$Fjtv8yI-5i-Hw+J2M$`KhPa<{ zBpkbNZINYnl|UrBdAuhvs&S**L1og@dqPD-uw8zyTFg$Lv#&X?6Fi`p18ha@*DEHv z^pdAF(66tCxgVc8049VhRSu5wN(j$c06&Gg0B`ukp*RS7)0Q@OSH^SIq7Iz&Km9vO zyoHVFOBxN=O6|Md?cE)^3MX}W1B1)lsnNCFRwUb=ZxmttmsfzHhgw{9&r5aOXm$0Q z7{ElP{$eg7BLISgj=_BQ*HW%}YWItR2k~HBFutmVOY9S0OPLwYB5fmLlj3Eb1}LiW z#g%yR@kR?yY#@HZBG!GzRg_F;4dEx4Z#HV$3{-_bxday`689@li682(aqnC>A0e+ z(UX_M#Uq+5p4;rfjr6r`S9C7?mlMtXq<9@bAlIe2M3p4G6+0)lsW#vrw>hs*U1eD! zOzbDd_F4+$%*yJ8q!VIol7U|eZFeS5B`OmF(QbF#pY|uHP{M)jI8%quG}bVpTI4P3 zU%8x*;Ij?xj>F5F5Ti@kR~=t`2Oan49h8?8bA~)oG__cNx9NMXbOaLA-Q9a~$FFNo zYcFBlR@SjgyS*VR$x^rJJ=xRCdl}oDD=Rtuwb9{>XcXcReXpm#lH`W{LT5~M(Lo0* zJrfi|3m*b}ORb8dbf|t66%AF1(fom70S_4}lD`{c5%}jGrYX17nbNC~e>pp)W>!?) zq-~zu=e%!K9T^o@<&Ya%^pAgT?Vd^D>v4sh)OKXA6`qY(QmzNmop7L% zi;I=vxic`;p1`lg`yhBO9PDIJs}}JqfHW-*72^)7OAkC3DmXxhEDV9k2T`z(@jreB5lrI zFdR}b5z|985yfdRSJygp*X>2ulMh~Z%w$BM8mdBE0u4Q)2t=7(`MfAja$cFHMMnTS zsrWS^sYaB~#NlcPnBnV9uqeGTFGDURc z&0rClf^^DG0jrV^Zq08|jh+UC@X0+X+E7wRv$J|>r~(bEvjkzd-5~fTq*34feTaO@T7=1oT4Sm?(s@d6?LM#gn){@NuH5aKECV1VaRiUF4I9QpTD(LIC=lU z&1l*28;oiNd%45u$wjk00^j>~-~F@y=b1fddCQjm<`dgfzE{Pzac7~=uA!a6Y+%Q| zu$j(-5D{NN-F)35;p(Ck;hbs{aX``Gx?#e-2`MrFvH@-{F4Vy$Je!dS+)hNNLinXT z0FM?eLCGjjimDW<M4K@&_(Al|5_NU}jem=>-hHw82w3$2c}NzC&Jtg0ka zJCjC(_~RtKDgB0#0n?nbX4z1ojz+I)+0v$`FeM%xm^RSaqm7=qW~xeOgPN8*^t z>-jA@dSihuWl>t3Y+JQ{$lJr)#r|Ay!M8+k=0oATcG1EC z%yu`E4WdREvk)`F1*MyeWLU{St4MbS>H#8Z0UKTgR9^xPEgq3Li$V`cV)E@~DL@Jh zD&5RAs=gxL15|~4wrwk56(^5fDJ*vgHmK7Yx2z;hz(-Rk>_tBA)8Pl{LxUD zhz=;2g@mHdg{34+dsHcAPyB<|Ar%f1WG|TrI9rjv91xiDhV=+aUIMq0n@|myKS9kT z&aGwO*7wzbj>`3H>Fr==t?FHN4QiIO!&&kZEKMKb}}@& zCq9%7jNFC2s3aB*1&c*lOHx%0Pnb?-z=sTwyJ$JPe{VYrgV0SDHABnCmUmOB1I%YI|!3P2}>m< z6nIdgMG90rC^mFptV5GXtV2`$s)9YXjHd(}vUhPU2u;5$8#+ca*ob*MnD8ijvk?#z z{z^ie&v-bmLj6g?V3bLqh#)0K0^V;u-V{RO`_dXfVD1Q_v5Paeb^uef3kjxWkf2XG zydtL%lu0DQ#aDR&2|sg3NfT(FYM%OOn@Q6fmAqdBhUuGq2mhp0s1%^k8pvv4JBZUc zQQP=hj|n5^#@Ac;&2F_a1rLhg^K}&nd3&g^;A)B8+~cn@Mmh~@cMg$>rG$33uM5Ik z74XolVXx=X^qe-PAYJ}van16~$xXu5JAcWZ$CxyRd!LhB(nJRs#kePi zC90^IC3l|Mc_R9j#i#Q^;Wb$*FL1$;*~CPgIr%1b9<^(6j%`a!J~9h~f7zQh50ihB zf3`CRFmsOP0@JDX>+EQ6vbpLcb>Ll%b{Ww!Kf;UR4cngZv+L&1Va&sy50{72L#;qL zwA{E4F8a)LS}_%4w&_5X(FT@$%vlV>#t0kasahz=ws^?6R3=iHL)e#!fVz>^8TT#8 z_Y1~;@SyM_E+Xp&NzA#&lZcswMpXZJMSbG4d-HW}Zts1ch$?OMk!p9~2?aND9TIgN zoeIYd4>uw+VKIES@X_T$u;y|E$%VdgjI@kj8!tR56(DUBQ?=mrz^KG8)`QBLzmkO} zH`qq!m5xn5F|ARu9BLS1W-m#_k zt?S#GQFb{?DD5w3y>@mEwP~@?-?3>*&2d#bzxSg0KqutjqMUx4wlpRK$gVZ$R2Wnk8|YdDN<5_6bsiH;!;Ql42uJYKx})4v>?OO5 zU&S2NUTgMK?oy82hry4ok$ZKwNW>c=8-qrhb*Rt`8#2V58l+3u&*gN8$(f+pe>)`q zGm91(r=mA=E|I~mwNf_ZSWSIa_6DJuKv7V}upWX4(Q%+Gb0G9%AVQ}>7b{+d2_-3P zNBl-cqTVI23g#;~E9Tpjpr1o3~s$i3xa`1TYrk=X9bV1~F>`pCp5eAG;T&L=pE&-A?G{aD#su&^%b zJ5@X3e_lXksMX<%I(Aur=6EKfE5`fGZ}dTqMDk7I1kp}_Emc+rp7mhcX#}Hhp}Vc+ z5J36-b9;KSIKn#rmrQ1Hj(*;`8!$5_hwZg-g?!vYBHRjaV)!eo;@V`zp4vhLx)zOFmQ|wSXF0 ztW~4<>^RKSa zvXfV_(StG|hf3dJHT`b$Edu>qmhQwT~1XDXHauyarA@g*iYrxk=ZQ@qn zmDbMMTGX~iGXl8*SU3XY)h&BAn~y9tdiKICAAUfyWv9}Vn`tN-L_GqrxUD|Wrkl36 z<$i7TGk1qs;g^_8WIE25$L9q5{hPh3!d+dP`=K>2?gWoczPIOv^<=n4R>ftSA?lUQ z7V}7^l|AX=x0y5VV;tr`IY1o}RAYzCKbr-B4F|uQ^Jx@J*60WlQvTh)pf79Tsdo@g z8M&m0(24g{LK@Ge)TTj9YR%A^l?&#}NUjpJGxf6@C|G2R8iR4b zj?Njg`jN3CmIVneB6&tHpG+oN+zm-u!r!b1KGlN|Ik?Dg({1oC!Jk)51jY2sk-lpvSo=0o z=<_6w_9WUz8>e2AkI397Jo5P%`X!7};y+(YeEIbI7*f_H_v+Q_QK3bMJ0c;Y0UpWhzugxe|rjuyMTNAR8rNiGGJk|woQwz`!1d2WKWloaRAz2~QBlV1!+h7S? z(|uQT&U|&!6(+IKYZ=6CRsr`b%v3eS{*?tihq?Y>1xiBb<{aw0`;90pFr) zwW?j>ujnGu2w*h+lcP-SpUeJ9*VbPXqmfJLv%ja65et(;8X1;%#Zz`u);S}^Z@u(( z1UIP&?g%ltMywT&3g#%zu$crr1V7CM4Fww_KIW1DM_qe*^BR~~IW8}~bPKqyh1>=nj(KXx1z9)0Vq-N}4<7+hKO>=>KQdHO~`H zorns@n3XKyzj&5@{d-1^MeD#$4qrofB_u@D@oRH@`FVQiTEVB* zVTy8H^2{&zqmmu*_=JJ!-z)u`kQd0zB1~e1^eDRWAldjiWg}*i$T7SOBovbXE67qz zi~WF4wiG2IHPT`fAJ@J$qeJXy6o_#|@?9Yjdyr-hL(PFNu%z9QM3~pCmkeRyU87NR+ryz*|> z>{D85z^rDGf3z>LT}nd7g*Zl{m~gvaMGO3b^20x>;Yqr-QZlV{tH^CC4Po`Q*h=N;-BfoFYhvSBnbh&Kp@aw2-xUq(NcIV2opoUn|i$ z*%onnrdnlcrjgu>dyuM-_(XCgMwMg38pp=QhBG-)rHXsQ5k!xkHEbt11=lHQU}+L# z)8dxn;qtDa8xCts95%nnRieMah=w-Mcm}zPOo06jS-KTH6eEd*PtGv9M4{j(T}j?4 zvxC*$*CN+SZQE#~cGR4zaR1!|-H;I%=g!%XQRpZv(Zm^7o&jOX!`X0-q3pYLtY zh%4gN!?@oKjp%XQ^75`8V1~@fD6M1BM(EXzVZcy)4m5G;UWsC7ZsN4UuIP7bT;(`R zni*ryMoLBs^4x7X_C{lDRn9b^MPB13>u9Fk(Y3X|A^tfQYN+M17P1hfo}l|}6yJF7 z4N91(XE-a_JVB?}6hhoD%%Q|iSQm=$;Nu@*$r*@RN0~IK{`!0fsf_+5s@U80=OsLy zMWwn97alnQfJK|1?YGGQYhE@hzld#Xv?C8%D}GKfL&(0Q>$7=?{T%Cc zlM#__Dm?_Lv8C!f`f@mKH+hafNuz=HfL$F)Ovr)OR-Jy($RGG{>%qq^VAOR);e+a` zIwX%_SVTXmVWm6l-S;Q*IYe4$4=Q@aN@atjznI#_EpR8UIz@%}&!ciDh#|>^2yiZ+ zY)!yuYN0uD>{~?!W=N4#?#fwXy$_i=BWd&k%Xs6Ah_0Iovy`lG*rw9-KlkG*?W+bM z560Vu=~fvuY9jtsXj2MYntB#V;7CM)^m9e0!=?Oj2`KLr@3m#C-9#pDG}>S9`C}oj z&_p*(Ufm=zC}z1Tw^7u;*&4pp5y4F2<)fsr86s5fB;dL<_M`}%Za-{SxXM{WEsIO< z>Q7N`=H__ZlyB&?Me@YQPav%13bc)`o>b26)T+&@zh-@9+1)dU$&$div z&15Yt%X%0+*pO&%)6XbRvmeQn1@#qAzsVhL^3p$MN&Z zsK2bgfVS1F($N*2i*gBKrJEl*45H`pMT1RdJ z&KCQZh~0ED3;-^Vh}Xki6yaFt7{obM`Ni?;{^J?`4eoN z4h;>;p@WG}Ck@{WdUpA|B!a^-aUslBJ*DpuO`1+x1ArL+d(ZVQ?+AIPRfS%}D_re& zO6s_d2|r5*YJsLif*iH62?5s@`6eUkSRW8z>|xw0rw-lu_mL4Q42J`l=~?(v&OL^$ zHcf8+`@f*YTr5ygvLLE3Ei4)~MZVEW1qP@UeVY6CG{x z3W%e&uHQ4`0%$Q}yxla*M<*eOwpRt}g^F;L#_lzyV(7-(=GLr^P|%Os9^0^N9!3}=$y~1R zhzCIx6xHncwLq0rej-bY8F{bL43{n(smNqih!LO(u~&dU76AUh;!BdW1c@j%KUT^Hz9^?1|`FkFTG#tbDDUq1J3Ib?PMu{Ba6# z7J(m1OiK$}Tnj*@KnAX?e~L-*>V=+qcx4h)tb8zDxu((<-Dws-CDc=_9H_~dCZp1a zfuUz~{^EV`B{X+8h%#xrKeZNRFrK5@57WlIlrhJ~h6pNP>M9KHe^N)}> z>S$872&I^Y_ z$=L(f#oWkQiYpm3Fce-?>XeGu#kP@~5hz+cTJRtdU^A5P2-qRx;i{8Z$8!|$PL$bp zsxaXgTS~b+uncO(WNK3imgM2ZOx=uT3;O#MgYexNF6k5|I-RVVmXISWlA`8yGg+}( zbi3p^J9wvo3+?T-%NCSKbZHxvFjLRwGKtMfUk%yn4FdYoPmY$D+1kNjvXc5ESa1P9 z1(BJL1Zj}v=T>#l@h05&SPfh(a;=giR_T&1tIQE9O!^o%320;N!y;fKFa?Ow+pYf( zPv78IiTehdH*2$P+qQYKZMV72wp}N?PPW}<+io{(uI={y-TS%!!@M)|%!4Avy#~Ck(XMS~fIt~(>#WN*mNb0n_DTp7-xq1-dkcTL+w$b z6c{M6VEByGJv0Q8D!hq;3JY5JwknFxCWGuOmN(#*eO$(mdL753x%;$Y^md&9B>*d} z{zIG#94%F^s0J>VD!(kZVPLW9&!|XdRJc+BMYKS;me@X-joNPZ16JFne;p0tU+yX) z?XvUWHZ#-VTa$5X-q$UZNg;2ax++#)ctrTNDkA|JE<_IafnfNRx!F1)zcn zOe z{Ms&aqdvbRt6ry?x2%X0Z&B3qoTHtXA;*%?7)Or)38U)6Jz0WnAXHH)P2{Fd1>fwB zzPVk8->6GpzWH=$h=08$fr#`NjR~9RJ9;S#Nhm3-Z`fFv-@dvlQe1jNpC-lcpBv;> zecwoA>QdQVU6taG?Uf}+6ujdptr8zefi&k%7QB6F9}9mNppdWH%4@0`?V9Mu4F*!U z?fO&P_F?4Vwi57Fbn&{Ni%{WRw}PY0IwQ+E?P62S4A16SC1A^eC}^476{7 zT)le9p;y3z}qk*V3?X{)s%boe&PC*aD}^{U_KJ_|@nY zn$-%QLrJ+_H4(+=oFm}0*o$Y3vn0iiBidgylYZN_nwDVV{K$zJ(hqnQl+Eq=HHSeW~vIsG&dA+LM{680h<9e-e)JOUg0+a_Dn zE9p-K0{sRR{^Fq)RVBq#b$m0a`F&(|B6G}iIaI$ogP$@MZZHMdKqjUu_*xO?5|n}T z(dq%^%sla_H{qB#T+6l2mb;FXvdO;~F*E#IwsCT>nSJEsuLWnZ?)(I-9Ue>1gVU7E zvy*YkP0#l1gM-Os1VjMXd$JJk7hEr4%nvjf1%%<3VH-{nRQPhTD)w6HxZjGKX|2L> z?a%EDwN$lXweTe-QWXg;6|a$Gh0(DIEfOdR7-PDrL)Wd^@*2cR-_Wmm&qA*-Vwkbn z=PO|)+ik$D6Xi-V@c$yKCg40pH;QeM8Pe}imyP%@2}8_ynY&SFA5Ig-kg$#93XRNdyDlhVpyEu zPHU5Jz>{eQp@ggJd;MZM=xm_lY!(`;)%hxSXKO!0lg;C&i?Ft?j^*~e^cS|$1VJMh zRM@@{km8&{=B$k;KFMWBtIzk}7MvO)E-?YcRI2gI-Cb{&juZI&q&G|b@`ofiZal!^ zRC1T!lTlH$rI064aDWJMgCyXj3^;E93O)A(fNZjmm0TRw;LSk ztPuEyJ!20pUfwYJ#RYMTZfcEf7TNj!M=YgS`GVlAs1VqMSfFC2_` zthrl!k$CvTVi>`{VhN5JzjNcyczkD-O{PRTg~_2WTPN|bl{{qG@W8qO}=JRV%E(T$=X$u`^BL{E+7sy zNQa+9x`mKWVWw$=KQx7{Wvws)nvGaUNm9y~I85K|=ATqETBVVrS||oYMbLT4R@7Jo z)G+PlgRULhx=a}pqo-Ooo6HzroKbOXiN6~p8<^mx(8m(0q2G*+!Y1|Wuz2Q@EdFxq zEH#b#seBIw{US@$qoiNDh?_K0qc4_MC7+QszP zDbH9O6GmG4B0hN^IT{ThLy??F>THCax|}Ut^=rlLroHilfBU|YXV$Z=t4Dsz$M+&K zH*-TXrY_VWN1ZLB37tpz<^jx3df~4YA3_pxrPxWcG;ax)%qV7(>uF0jSo2=+GcqKk zbMuYzxQWcg@v@2Wx1iq_O9qu#`a^iDl_2a4&WgiwpRt)mg^sTFisiDjD0L^Cam1;H z^WkP%pPD~qXc(okv&1rZ`x!U(zZW!&yt_#&y-3LE*T*aUn;{~)D*oVMsJbAfI5II2 zr3g70KWa-MPyp38G%eb@C`tF|Q`=#pc`aRdG>VIuXi@ix*a~qAY+ZR2aLsOpzin~N zNQnF>+4~j%xqWMDLbClWK;+DMs@ z(NX<+Z`6Crf7|-DBlxuA7I2#TW~dpRzgZPjQp>Tl3MCcm_D0`JKr}ttL5n5v|4L>G#kBs|8DD*RI_=#;s@-ZoHRXU z^!dCD@-Jx17q-@|MOcC-bIUG`nd-DT!{os1F6^1W3i3bpqf$JQ@=K%Pz*rR>P~ zZNO6C>H4|#0sXY<)<^lSd-o=`{?2UrTcmwY=%}0i$#7qA_~3_?UB~Cp zOD#*E*3|aIr9<68i}!?i0SQCag2R)sWlYEH{GXl?>S$%m0@?teHq$@oWP|fo!51Bh z@rWR%+MJ|shMn(GJCGT|E`R(J{M71pUM6&JXWodt&&#cC66u5Ow1nd*&iC(`KXyAB zSdOD}4Kf2{Kh@l?P^n&T=6^Ib>6^ALEAd!YC$S*y6(AVfs zAouoQqS-$^T#{Ssb_IA zaHQAT@{MR$yl*Vst?W|>Oi=ZEVrdiXc6htHu^4jV>h*q>`gc9L8L>O`X?`sKt_5uY z`dCE1l*JQv)i`{BEze}Nfo=AWJ;sIaROzgdOx zeBoY7B}9HwfLeeh%!D=ksXMEe$|L>o+H^le6oxAeLbo8$xl|J#YSro5|_H+wT`6BL9yk!H0SIrk$nDPQOwjdv``@ zC%}iNqoPXRaS-+F&ePeBJoQxV;0k{4&0|L2qwl}^zV|(TLI?L_`P~Lxhc>sm<~#F! zOcZ6mhdeEz*VMJ-{}w)9Ua?;+PsGtsP6N^Imk$F>|LE;^H`@eMT^~O+|Dgjs z!gP#%>%c=2x=;V(=-Kt)mS_9qsgw#6Zm{YmSOiS?p)Nbxrai`eENuL9A_7@ z^^;wTx@DeE{pHckHa3=-MU1kZ~sWuiN}) z&MR5H-j9ZNnbVNhgl0KY$*ZUjYCwUmzfVg|tx!hwAAe?y&$hH(Kw#~I-Sw_rK+(h7 zkTCr}o%>l`BRshihoQ0XdVK$}8~=`{<6SMUjiNuA1@XJ=KD*jQKZ;C66Q>$^-hYic zalW+gZCGAWi3;Ndh&=y%9(YCJ4s55)l9zMxvhkX|IIMQM>~nZ_d??Q$Hu|_9EEsVu zFsgJdnACD>*w5@3iBQ9uZJm!t}TFI%^zQ&YVJ zDOP5`AvtynXz#bH`KrL}qCp8UN^JagZE=u$*=2R(y>B`vE;Uj@ICq2gRrZPQMGKJg zm7=$vJ+|}}Lkj!icu1TDXH6?>Br;C{<4N&=gr;W z#fkg$+S2KmO3w*7pwclrM&Pe7q3Kh~lcD4M7>C{S@AYkR_dL+*-M{{MZ3s5y%>S!n z6>Q};ds4tCK>v|>7kjVptngRiJ!n+eMu`ONZb70cDF~P*9beo3VpDGQyv~0#;8-D-B#)G3U2&q-#o%K0HD`RT400i&rejdO7vN@`)?`7=zU}9 zHkBhz_-`}!gqwk711WY4}3r8 z{q?YW_p{jbPtGs3eqh^qnb#9!s9_&5-`7Iqi^P z`!)2z=F)8?uyu0f`|a3H(+%rAw_`$MpoNIhoNJr^M+}tbtI@#%wi}oLvO>&Bvw+mh zA=2NLv_+1!@e9q2aWJ!ZPnAzO8XM4X&Z(Ug=;ElI6asotV? zQJ z#zB79)%!AOFv0KReij6MX5{blx&I`T_txKGlWG_E5u&`y z-$ifaJulU($UB_I4{tQ!rQ}w>{gzos?xm6O&qdg&Hg22RYS+L=iB_(6Eexmt8yg;+NM51_M`+LGgYZQWz|WT~`XB3)G$q$e+->L%NH2Cb1Pg^{{-(bZhWpA;FKBP4V2gSW zx%P?nU5ZHjzEK%&%cu7iF1zV|=!C-k@%78pBiiAbMhRJN`Al;KOllGP4s9FxT|F4R zziJhpfZcoN`#i1owWlf`?PF8;!7S~{8^zClijE`o5!Ro*Blo2+63%V*Q^p8!k>4~j zV9|S=A#}5S)E{-+HMX^KEaG<{`}?h=xe>cb75_~TGShe-RdbyC{UYXk{ANYm=k!(= zC)>IFy&7BZwC)|44%6AD`<&#-eQwy!_RGI^mmONxrY$C*YUgp+@Tu-kmp_lTM@tim zaL#APMmz20-&L$Lr%z-`tv&cK(@K4;P`^fPChX|2!THbRnMZjtqskl9RA#J~=<$0V zntd$@?DHMdD0okm9+El2zhjtZ7H*ZP%xT{FAA!G1i`8ft@Fsqj@XL9XAi~`&T|qD> zvhV;eYYJ@)kEYNC`(jT|rYKl#(y5M2tZ71W6cj2ZIKvUJ}?^&g3+?%UMNb?Rg^ z=+dGoVknftKCqt?HED|Q)4W5*q9jc7OhacxKzCvbYDu%5;K_6X4^g9yB$|<4c+^y; zTw)NT>C87*pX} zyuuk41JktijzJ(%S4u8(rG=2uc#~_%@iCb>kklej>*p-<3GF3{dS-_bylJC?K5ap+ z`s4UzdG^xFXxLRHlsAcSFBos5^fhL*PW2dLmmz!h>dlEr6*X#kMV2nZx(A>ansn4;_bHKB1WL!Gl0CGjAmxZQmXDCub z3pJIkF!rQ_AR@bQ$6GMLf)kE6p{$)aXcoE1Esr{OsduIW%ur|Tla>*&knX==qN||F z;siB-l0WhgI2dKbbf{`dqJ#$JaM>)hX&cmdKyB~}`P7X#TpA!c%plaC;olYzz-Yh; zryI~m1&NjRl(YWXI@z$cFF9S%O3+TaX2G&Gj={I7{Y(qZ5K-tQqd#-jsbKl|27vG> zoJ%~D!48cj8HS*hw@siXo?)RQoh9O(PuuHFlM4bi#nE1yO<(N^X zh)!#(N+dns{FzF$3|{xgG`$cqp~P?NNGYN<0|;tu3XqwR+Ih~$hnIaV2Mb?^O@Os$k6p|W~J$df$05%CA`2|7)NK7@-dHS<4ia(c0fOsE9 zP#hzn0o@8Z>Zf8T7i$gF(gYB8s$5vyJv43FP_9ZFt$tu~VQ@vxFX&w?Kin!ljqESN zjq1cry&A@pX;wqB54bthocR!3O%19kh}1G(IfO)TgQO z7d|9v4pEsdm10mXpTzC=B8{inJv?808qW1ll$9$}JjS3@qr#!K1{B%gB)oEgO$CvH4kGV6s?b4EXxiFcZwH7iEtBq!L_I&?3V=b;HUHhU5Wf z`e2b*P%F!hnojXelw=)4TN?a25bT&iEXYqn^u(l3Ko73p14_sl$9|5+2D*ruL;uJ! zTIYl=U1AA5GxhvSv$temV@^{!YQ>EQc=rJ63a1~wC!)A4Dd-%Nv>95+rf~DV)yiP>!hBPs*4nosGO|6(c}M`cgS8z zGp54(7%YNFID#}Fklw#n;_i2%StqKPReH3H z7p!A)o+7svL2T56lV)(HaBP^e*Z;lvl<|NV$=6@*YJe$$Mz8JACM!eXu z20dvjkvyS5%w;|%*j-oIv5a72_kprrlky0U+60w6;JbE*%5{o6I>H2(($YQ(oV3j8 zNppLEgTJi;jd~5!%%2e==DT&y9-%S0d=tup*t=U?x`t5AsaQC(pj5H2qA7C=^rfE- z$@>HdOR&20T)!^S0Bq!vG#-Qi%Nf)#>Y7llDG+j|iaBkL7Y+eb3b-;Q=@hz0e=OZC zpB}H+qn2@gN`sp4u-slE$Jpco0X^IaJcl+0qJ^fj$|TDTMh(LhYt5{Xf$;@y;KWHn2b{ks?8QU@gCDRA`k@XAxF$A_KH92pVXI-#|&(B48H z6sKqaTelhtqheVJM0!cNS9T{L$$bX4HtkfT{d#7KvHfvdX00GrlYKC+aa1bAVx&p< zbtN4V8>FhgGH&Q3{M*jj%T=l<;K>Q9e|b@M@?@?-urnN8$S4@1{%;iaVxd7klLx} z^4b&JlO;ryB?H;HS?LVtAd2)gew=V$i+qa&ct!gxbWI2>p&_}2PDCmc1M~FOg(ML; z|EvfI9MsT;OoK#CHhE|qz!yPz@BGBcX28MFQX`R)S7<;rr{Wu7H$8W*le=$m)QwgfAro{jkaYW1vpJ_Tq(izb4!Pv)pm3fxx!f=}BmDQk0 zqtWC*l3`fP6ek`>Il%RTYS0)6G8xaN!NnN+&IY2*$m|#bzvGzAjENq!VurJs%v4K7 z`grF1W!jk9p(+L!EEIHY!E7MWDh2?^A+Dcl^VTbPyr=xjY8kZ|Hl zLOU81RnmvHa)!W2bFf_-4)l~qf2D}u?y0w?;3K25Z)#<7g8GMOV0hjX@OS^EhvhBtqw1KH4p zm#o1QQPlUI82_Jn_*ll5`g(qyi!W0!z@%xrIrX=hrd zlT}%mN!sa4-@^p&k7WNYb^hB@4eFe{cl!P_u31d2l9#z@mr2IhdsSTSQ^rGdzt!sxZyLoOub^A681jRXiRdAiDGmG#5649a+iiyOoqq z9)%~Xj7p}%1;q3*(_+e`=TJ!wiK4ku=6Kodg&mE1$eIFTDz>qE@q|&ag+ic;J35LV zFnmLDvTPn++{3t-lVDh-3NCm#PKrsK6vWx~w%IkL*7F?l%jTgEV8|yWbXU*@I^|Kd zsJ%8SOpX1q8WUKjSd_k{UfRZrH)twgZTd-!ai$od-r1xX@|c9Wx@BhCO^~b%imo)o z(z(@`v}qx_8c@=d^rd4U50Tnj#+G?CTuAhyLiucw0n{pzmo$#X+#pnrXf8ayNbqFv zT-Pw9@)Cds)DJlwESdz1I=FSpLFTg@jYh&C8E1|xfhbRU=nr)QIxyU^mcnP)YYIYT zI{30kF#Sq`{li;aA-`HxsXeL;_Am5|Ys}m^C=P;=C4fcRsjV+Wa>Qm-s4OUp18u_# zary4)zQ$PD=e?6<)jjfR-%TB@A3zEx5_XHg!U~>m9IN|kbKN!Vy^RTjMQs@VN%mdL{zOfH6v$k~ZjmU)r{f%C` zS4ii1s2e`HjZX!dtX*8f&Gf##&m9P0UL6>qN+*wKQC-aNBBoF9ESk-&gxeUFg4LVHG;B9kPVHl zY_kOqW@O?o8gg>-$mZu0d7499UEVL5qU4p8BU6acXQj{@8)c6~^uaF#Zc-sdn`k$9 zHwEj=YlM`OhCQE!nG^n1f8Ij5xSbL6Fpttx1ir>Tvxdi;f)udM4}i)&9I z#G^v?+jZ6u>|Z03&Oi);u!*zBi0D*sDX)y=SLb`16^P+tAC6J4R!#)M$C`5kidRli)}1D1-1Qy63BV_skQtk1m$r|HXdMBi)Y zaIz@f3^`c7a8%7e+@K%SSe8uvr5j$3S=EBGqIrk?-Z9% z7|3FFV9w536?c7g(&=^T;!?5OEpOAW&2AW0zHN@Gqn6RpB`ZL+txYntaVg}gD-5kD z#ulEvwMGS;l{w<|+HT&s@+>KAyRxjCSif}Qn%UoCtS4J*hBn}!s4E=3#1{`1ZGD2mK<+$@?r}@F<_gvGeGP#v8mkHbilhU#mLo`F_J}mn4DJX;ZLe@wMd%aY9a(Daf z@GKssBOaI~on?viSW?wP@3bFTcccSh4nw5r8e3Lb@z>KXYFS<5#Zsu}w*B%nA`CZG zPU;)M<}YCqUz0a(p5I0vfM~Wz^^s6FWO>rnaIe!fh$@vg4Ze$ z?r=j<`s;r*1swO>Yc$^laSDN=2+Yf~gB-g!Xj-o)TL0W}y|Cyt=goo3T);dGU=k{> zc(on??~WROn*LN=1ipY2RvW;M(SuEio|s~$uUKP6Etm#qDcbzEszi+GRYy{?24^W6u$1O5SfwAC zzC0OM>YC98urn2){);Ld#U-;JGmUEb_2wD!V_1?<Nsp3Ws&?dtvYv;hv`#u{+7Z-?B$Z0!pvIs z4}-xtw7`IxqyG|^X`%Q?`yoI*se`CFUVbl$G%3iU>JI@rr{#E&B8|-@qNb+qFxll{ z`>Wy4=};^tU|}dL=ec@pu_nwb+knP*>sYItd}`V{OyB%--m+t#s8gNsZcc*|b3|Mr zkhH-Khi+LC>Ww!Ba{9Oo;pY9;VL-0G_INHSEd(@lvgLCC;abKV9wG$RHiBXhHl(x` z1z)R2&+ksdt8)*<(qqkE^ykg4X0XYC9}cUnw1;l z$*_Bz>)%(5fAYZ1b^@pTfKY<@eAYWN|cJd0ZI{Yjgh$qQ68Bo z&#LQ0H6B<|!lM~Eg17b&PQu~xsNdf42(>rPXV5$qt37M(YO%H9dIq{7^A2o^BEVu? zzUj?n4c(tA8n1u}@-$YBN<;o$r6D0XQy&W2W`-g-Iymx3DBTjSNEf7HvTqRgZ5Um1 zI#mpo9wRltS_BbZ%hI1nx~nFipmukARf*8waLt2504chE-E05BjeGq-Nm~FdAb6$T7lp&|8&q5k?J!lB9WrzwkZ)!-w{fcY4?uV5FW@Fk83^U^mT4Tsu9<>}*e zOfHDwF9%;x4Bh%D8W9^CmP8pE4#MQsgl6TxL1+CFWkzV{a(;K}?fORlG!>z36kGtF zRCpSe$#D|;dVIFv?br5~Fl9sH)-6-LCoDkXZdge7%NtMA zUuuMICr9KIS1Zh}BNO0OXw1K$HL)PP#UBLeh05((25N75UP(2(Q z!0?#L5XN>KKj#zAz0x!eC zWDQ_%Nm4UMbUH2Z=Tf2x7T6TR(~f*AL77E|-DM7QIsBHTfBk>IL%!KHs0AxPKwEQ2 ziBe`_f4h1UP=3Q2nye_p8IH%yrMb%bkHOBr7%Z9sx>c^4u3v74wC1Q%P_)d*)YfAF zp(d7Wk;1X%Ak!--tqg`48Ce{pI~fi~o?uogg+PMUVz%)=rxjWN-*+ZS$@5=yOtSxl zrbYi<*m}L(;mBPm0FflZ>Vl27w>e{MEOe4h=t(fB8pHp2>?YNu6uy1YfRIM|$9eod zj*xxg;YJ3!IaR+*HCBfCx~nz#v$cgHYEtGo(qGQI8q^8tvoh5qiJ)sqRq|+kokS%0 zvabUaT&$vHiE{^KHPPv~SuCyaiZXli2V1w!n2QtXemeAcT+t?@E_%r|J`yhk2N?~v zF+hTEe^2n8p^hBHV>v(@GTa!O96*pH{Wg_^^*4<9M6O1Uewji_Mp-OMoku7=j|Vw( zNf>m8Z<+@*tzr_fwuRq1Ehd_yx+AwD}K7cZ`l|<_%a2yrQlt|ijjPMxy zV{DJ~dS8!MYvp5}{ZnGMgkT#UQILvaWx~N!Lve~L)${&2n=40D676e2Q6p3tBS;ff z4rl>*RvJF&_c2tIfM5;rLw#BMa$=mS>Q)bHdFJ1|%0`<4`8D>Z#;_7C#wpOx=5R** z1ek>~6C)mN@&-Ao6@QUEZa+(yI2C`jq?ErdKl0Oo2z;;NO6nl-4PKw4Hoj}VQhsGq z3gTi^>a`nROL#`rXv`q}O%V{R61r;1GS=$y878DMu??zcbQSp6Y1dNxwI#+_8vGHB zxT~S|-{4uL-k%U~PVSXUy%_5g9x*96w>kZj(|C2|-&rYQD9P^eKqzo!Noxqvh(Hmm zhgxV=v-tGzAl%G#!lZM(Ud(eem4KTAj2!?cLAg%E4>!M8Y#eENJCMSySR3BR@?14l zl_Ao`a+Ow`G3K&k3tk2K9s4rKreoH{Vj@X>)sx^=oYNCRq0xJ@8gSU4t9Y`L&_gKU zvYyOr2VHxJJH8DQec*20gQruZ?%>0c?qi=*m2f!c0<&z}V&DN&R!U~mT7~&dZ#GH8 zO$DjiM23{Uib8gG~~vF3ag% zaH^Px$55$%7Yj8~!c`rXN^CL0M1c#5QaE2z1RB*vf6C~2<1N}-hySTF;4hkmu_EX4 z)VwuDMAmNCjVvXMD-Xtpyu@w75e3;ORWDn!RJ4A0(ZZw;2vWjKuSFSWB7fa2NcY)} zV{DR=K}4aKZ=s`WPv<)0UG+w~vV(D;o3jK81p`UvbK?r~S}Q z<~AuCl)HwD!@D)Y4nQ)0%jP!wBostNFTD<|NrXqfSk}dhu&K(j*-~C)sST6u=}lcR zQ(VzM`kRkr@WX(laLd_XxS{Nz!{ca&>5r+HtxNU_``?z@7y4TTc^x@h)8b9TCSJ8A z3~b!(r>>M+Y+b)?=a7fRc*)i(A)<_-Cs5}ZBZiA(_WuHVao zc)c_Z&vnolhc6e_SLhwZ9I=BuN=~I5*|lB@lu8H36NT%4?UGJ87fG;c;$y%BxGs?4 z#w0*&E|Dx7u?k)k%%jTNQxwqo^c0ly=nXPKNdR?aovQE4XeM4RO|qYDoxz0-4yAeF z`qZ)Vtj7NCL_IPWHpNBD`_dM(P5avBv(TYkM8Sh4bc+R1u{qAP*_Mw!ad@M=HBv3@ ze@bZ~2;AvwC~fE!s}EgzumKr%@eu^uRXL)2KC*i-`3_w---sSo8}X6VymGcIv&B## zq=`{_?1aQikChBu2!FYrUo&^tUw1^yUDjYsjv3-W0q5165ecM8d5S0LsxN_Mzbu{taivjtTE}Lax*4MX7l$;N_d76W3AvziDq}n{T^vnVF5(*n z{;sgrWpA~vj5N%lLaR+w@r57a|4*V*6O$&~`FfSRJ2$S;rSH*sdS$n4CtNX9L#20( z7B-br(r0fp#+t7wfS$oT#g^)*B;QabByHvqSovQd;Hj>qGA0kD)%!gDt26rGYA6r{ zClGTsbTy5P+j()kgIloZLufh$@(=8=-fL)Ll2Ne0N8p z5!|sP0K~mz6IINLLiXU%W?R*23+-PQ4a?DbHu@pzb}d!mwq8NVec0`~ds8xcn?f2m zl_Gm>iH9#hloq-3dUk^Q!_YJ#d1)Q`=4Z2Zlkz6u`FzDPFiJTXAgqSjlLFI9G=#t6 z7r0^H8eVJswe3bXX?J^*TLDj*$z}ITH!eM2w`RPVppNvEB^Gb5{vsNO1Z5IjK$AZY zS!!xrga-C+*`~YR0~V5sX5G4GG4#BiiET-Ry1E@Q5|f)^t>+oP3}vuPfr39-U@4{+ zn%Q=;9QfDwGnlEiwVjr|%-_ zlFGvKwuIps>k72Mp*lfdv`a4Cu{3GAcbOThWdF)vyl6|a)UDUlgF&((bjvo5-*70# zPOzvts;R@vdg20LmI+E-n402R#+%e#fPp1$OQ&eVwSg9qI_Gl zamy^J#?jk_+bWA|7O0ROUk8u!2wmECT)WBTN`<_o=LixjCb^qFr(lW4PVs*__YFT> z+%)ns5>Q?C3r*=g^=%=EC!4>h`pY$2U8LeHnZ^mghCS=3$(Q?){6(1rs^*{JG6xBa z(PwjlEg^(>#qmp78GQfgxLK>`f>EpZfzJZ3>KgpzM2brD|GZ<}58L?howg`7!Jg3bqQ&VcSL9V> ztCo{TCx%2E0lUw_QuF-4p{)ao<&V!(Y8&wXN0^GnlsacN8vLT>_~xkP=nBR7j1|Xd zoCbhTRME=D&^_d}jcB%N`4A544tIyg4e$t(?Kq&Skw~barlMvHa!i?O6=&F}`=V`| z9nbb_$!4vmo-BO%%5_*r{dvUXmOq_R^ceZ6t=~-$n&Y4Senj`)lnuyR*K7#C*--xl-pmVp2sEB8Xn1EQ^8_c%ValT|#T4 zo`H#^lVvmK>%_i{>ib59gnFEvIU~eTi;ov2eiM?;A29ZZt84nj+L?XDkLMQ_$O+1j zh;V*cw+;WB;lT=USUX2jV&11sS6bUso(_6k+3J$UhJ1TX_x$P5Q!xHD&z7#En5E@9 ze3`U8-*?z?999hV{X4HNckG2O_r)|NB`>zENKyF8Ej6P(pi9EQ2VX_H?TreibdjiY z+eG=Yc@LrsrvZ*{SMp@;`q4*<`_Xhd?$0P`8OyB=E&CllV|G1YqrL^*+;eKG2T;CQ z*~gpeJ@w#hP&BE@aq;3Jp+)i47W z5a5sn%i`z1kVJ*hC@2Q;@QU&GoiB!m<9t3P zOg^*5|HI?@f3=LsU-gWCq!FjGuEk29wy7J7I6G+nSHX>mkyApwe0>F|>VC-|j3M7H zBv-B2R_RJpVN3pfToheWR4z@x#`CbHuC)5EFAfnvabfwWR2%qThTQ+p(Y=z**MS?C z;{PRnl}TawQs;1Fn>>T!QWK>6)`<)>T^qOmg?`IhvN;Vc{Pl}a9{!!4CyM0eRN)yE zDM`jUs#QAK`2<*s5%4gVA4)&wYLH&jSDk8*U>-!6TV6#L@ECbB@m_{t`-^7}%Xnpgin1|JQP2oHEsmcu( zi?O&7eaQat&)6X`x2R3{fr2P9%A%;sR?_PAS3r~OxuD)R0_(pvp*FZ>7ThhJtB8__ zD!EjM$`SJ71lk@6B(R{zp#YvU#B39Gduzo$6BH7@@Wl(DlDZR&`*a;L%<_1>w~ZPn z_bi3P#0uEYRr{U)=rYHuRRz_|@lPE}M2ll_Hsaeu*^%-=*&)ZZ(9jqaIhE4ZH;Yg6 z`2~TV0tzG~>ZY&pD$8XU)-uYKw|(0miD&qbWbP|++2R;eY&8K+>%lZq3c+NL2xv%2h>1aSs%AVK^kraC(Gl(MoP>XG@GzdIkm;K;rQu-(M}EU>3Cr z((XAQw}rdBZe@Mho}QgD^B=Zr;^WxV*Sc!*gCxI)Tg*ACJco>F;mw3aR%*qCBwC96 zEy+7hQvAonBud7Lj-@-nk0E5J8XZAA2; zPydHg3nV?EuPy@=Xu+|fsz$}PQ~rN}w2gPcv;|w`a^%w^01%0PuZChrbn8`P7Z)CH zzZPOLFIRtx=6T_G1})kpdcBl`Thv6+97&wjnbo6?pTCllLz~%*Z%~!%y;#Uq^+ldI zAODv;mju4ZQ`&31!c&GNPW3CD&VkqY@Dg3p9x}T0ICR{qZ+tscT9AbyEqZ_XQ9rP` zp<3M7LD%KD!Ky!GOMtZ~hLf6WKom#yv2r(zoYBRfBJ0a$`$Uz}lp;IJ-lIEI%T*OO ztcah!%(9ASQ@kGzAUB|jOu4K*K2{B6%bGT_M-@w^wz z127jI8ZO9prleU4I!bO!E%N>lqLh20&ND1u)$2`TBT{}neNy!a*}2C4QNFlRv1+Z5 zu_;KoQ}ZNP|A$#imIuAEfT3K10?HcB%aoA*+7s2&4GNi2-Y}Rxn_SB0I4sNJs&Z*^#FHR{? zTmqyNE5!;eP+W_S&l zqkXjpDV2ZuzqR-LKb<~S@Nl56EQhtEVP@7tEAO)GdthYo?BnSv>GaWlg;II{y{S10 z7cV2dS<4S?9gZ0*6*iZ?rVG{+OOR(dAvt=X8~Xd2fN~>+>EhgXBu^7d|BnhqhELxj zvj*w(n=-J=4(aZ9zq$Qt^WXZL9zgdT+Rxe^mJyCS{nd`gT9ZSsqUI*%LA_tGwvzm) zxcB#0cUKj^y-JDu;aOZxP$RN5dmJiw;y4yW{&ifVVOQ+Q)D+>t^q#%sSMcK@d-p&Q z{R~z7JZL{XZLN!SxN2`tGB(=bixWWK-8fz>`_h*dFSqXI;9&aHUIcLI8fjz za%5e{j|`jui0X$gdZjELSfOLLveP|jq<{RvG(p?iI-~)>1A~G_;GL&kfqT`VR~b`# zo3s&QoXw$I|IZ|zMrKjM{&6Pi!UvMsIXzoaysGZ8^09GW02S-BJHZ9f+%(c%Bt2%@ zMZ&dzRzvLInQAcCess1*cI@u{lzrY(*;R>hb`WT1i$ddI9BLv&6*K3Q|A>1amG4h< ze_rcxb5%1`pWZ_v^WZK)ueDtGXU~?i6x&*V^xV?JphkbhPZq27wAvh%fZ8M`#R{~T z2h6$7O}kC&4m6u*Th9^v7`J};c+ak?qd`CO&~fo#ddOSy-}h|A9V=zo(cON_w+C~r zo~=o9Ej+E$`@&Odt&3`@I?fgC0x*LNl4mQ~fJSjca57Qd}(6TpF#V3h_+_{taRCXeAaW!dg}iP89cM&m8$yF z+MWXne)+Xi>G|%5L0}1dC)!u{Emej6E>6%$Iw$9^lBA}eb}A0XVzOsX$JMfqRQL`N zZ;tJw=RG}-pwRSw$7Oms2Md?OBKXy9hnGI%Ri8&CX{7IA&K#|SlT+Cd0#O%7&^#z@ z_q``bh9GtcM@8zzX>hhf(VfW@ydwbNGYP}XX_I7#)@fbAZ)o)5JtShVuFtbxK0Yk^ z08_{ddfCXZV6+Pa0$q3 z$GV7aTv|HJhK}3%)k`6@X{Rj;NonkRX^U$2%Z2y67jqgo0IkX^>;~f|;%!$!3>wEB z*;{*O?kxe_TchdOdpK8lDmsOHKD!mQR*JOT!QIfq(;0iCUDYISy%onK=hEmjv1l{C zyczf&X#tERjOvaiKFbc4J0)f1=?n8jo0wazuDFF+7g7$~?dg)~kwc~3I;!2!x?X;6 z0Uj;ESgm!nvEtb#3SN+YfbtkyBhXqj#rNp9=suH_I{L7lIP1WvEGOGOdP7V~OsuuK zy;cgEWnXSYgFx8ZzvuQ$5uIze^76Fg3p~B-w%A~!T5>d>fPD=AX9Nlmqas->hm`^8 z5QjVto_bb*L!&&cD@l-5A)JfmooP81#bTwoW}{+v4a_Dfc~F+9UT8*)&$h*J~%woD{mzM4{TzZ#dHE=TGhyN@Jh zQuiFuRu=pqQiIYbia?kn_ek%6EktCGbQr+r3<2%N`EOx2_4cfnxep98%B-lI=%mTN zY@_)fH7|DOptun(P4}V`@y%;lMlwBB!!PXx7_ifl6nUUl_+$q^Oy)nEt#7^OqHTHQ zL-r9H1uF;*-sY!Q%`z*abCI=4e7{3>Cy0Mucc~u|T`6#wI`1K%4_>Ia2QQSK)cRTLQDJP4^LmYB?s;MiH@RbrH!dM1*g1lz%B-3|CSa}=k*&HC+*ecV^lB501wb8 zo$a?XS`Xd$_ae;B&hC!#`1t6^sp9CEiD?w=(xi15DePA#VGI;@x+wg@fV5E zgims|1s|2x_ncaTB=?D9*4#lLua{4EsviUNY9(zgnnS_9py=Yt0`9AIRB7o3auQ=$ z8U!|2roSq&E8UnaUpvu|+``Ylq<=&4a$aOkL=>{}5lh=q@~Ma_M{u+(wXAaR?2md6f5Hu#Md2CqQ$btB9mS0?XOO=m@1Ct4_vl|3Be1R$ zNN|O|Iy#E`7k(Lesh9>Oc1OQ2*DgOiHrz)TcStS3LkXAF$HAS9*>K}*Qw66^DJa;T zquaX~o=y~eYW?jymTe5$$`faF@@P90xiZUY1NS>VY~8uMn)jM_T51DDqofGS7mQa{ zB)oP|ci96B0I%blqm9_J+5?Lu5BvQ=9+jF+;AqMlVMeS8e|4V59puqXCi`Bfp zEzxP;mG7R9*3uymGat~vSYDq7D zY5YIVGZT<#3oGzu88h7XumNllQsyvn%Ub>^oY;O)GQXyEXK9l>RirE=%vkzzzj!mV z;JbrqUzt4OY~8r^#t&(5J{*GkKc~dCagqpFb!1U3%#@+&RV*cPAtI*(`c{E3CSDt> zzvlo8f!C`h=c~8dN8Q~U`1pXBs%pt{(!$^Fk7o-{qjo#$qQdFQc;nc&Ej*o_8R|)6 zQ7*0tiZNwVntE!3u!sJ&EEG4Wb;STK>Ga5w7HejYbD98wcx#^ zf2J9ZWp5a%PO>HvnCPW^s{E>2l^5N+2n=j+l4qveMPZ1e=+WT4?z8RTZOeMSc7N2_ zg-Lz`R0=2w3@O8xooEhTSvztDzz&^6KT*n!BxJ6vczZ?0dMW_&1o6Epcu31N*EDC2OmL#YW zom-99Ig*H-B zP0q&ms~F|UZVc>bT;_0fJe>6MZK2g$#Z=x|k~uuPNq3J0<4n2fA$y?=HNWXK2lVr8 zYtYqM`rVjb`PGDM>bS9_*uo;v4SmG&dGz>j;%D&Kc`N0yxR}^giH@PawcR~q7GnkP zl}R;!}Ag}X@H0=a%V z6|c+n;=IEg-Eg=N8~706*%63x^`{01DWqnPoY&xYcu!v0fL`k8Xdn5NwSH`C3_!`9 zS{v?dDse6*{kJC|Z?` zZ5vfMFkJULitG`z%5}C1@91>TQpj5}G%hTRZBbVCTbdcS=g1pLb)a?KjbHxbXn9|+ z{GaDULc%>bR}z(pf54aVAotIXq&`FuoBuZ_j{f(Yn0q*c!k59bYmz>B^53LL$FNY2 zS7sTDr&YU^?iB14SVvWCb)i7_l)&qk>IS|BODKKmL5%-|B8C;EwTQVrg1CV03o1Kx zfd8iNdtO!D7%fMqMU_#HLCI*dHP0hM`B=MPV|@&# z*C*II?~V~CFw5JVL8PM$M1J| z6-e%<`meOUph2QiLxgX4mlYHuw4=(j?L_e5F@LEO~<9~r2E|Qr%DEm zE?I>w);irHxh>w7ohN?HoLA<{K<-18*rEjsE^|h|qaxkU zYKQsIa3BWyVXXD_n;SCwyaVHn5nTQpN@{#Zix3?V@d|1>^D`j7Lld58pDOVdvFhB@ z3BYu3QkNxSeX1a7IjD{0Rzl;oOJ|4T+q{WPj^`s(s3;tvw!DW*n6J9_uc9%8Ru3RG9`85-hGbJ zt*SE-!7zS9{E#}qOIy6tIO)Xed~(b31s~#}(MccAqmR>2*)pK8>NG zovI$S3>3JJS-uK#IH?+SInFtMUZT`=FoY}pRz35wMMl+G?t##mbM;eGSwbDO>){J+^ z6X7upM><(H`Y@-5O5*_%tqS_< z8}p9HTf((l%8!g29naDCPJ8D%l@vh8-7}xaVbGXr7qX9H2Sjlz=&ufRuOLb~^8s$5J zPSR2Mv8J`v6Z5j|w}l3UCyfIa=OH-^(-4Q{Lh#Ipx&E&PH+b$F1ld*7rd`oJ5hJ6; zWv?^Ie4wYs{pRHfCe9VI1@uJ%`ROo3SA#tj-Q24p757Wxv5&&};hTb>)&0D!Mx%f_ z=e_;B-5tKwz+Q8NxqO;KE(O-52J(I)#z!NDyHsw`eZGg zu|DnomM_crhBnOMGdmyj6?9d=xsniw@zUwk7HXa+hy8PTyug+n9=ohK|5I{@48v%0 z#CD__N@{pV8p>!v<^IPx)UT-um$tv1O0Y9|XMO5$`P=fp>KzSw`#riLW8U|`r-UTV z(an0R4@dD)c3Id*DHsCp3#NVlWMuuA^X;8MRDaM4+VYxQvb3f*y-%`HsB+r!%Aauk zu?Ry~m$^Cr)tJ>@`W8BU+!m2DTWY+a>KN5@@p+l(uu)eZf0;Tk>L8h+?MCNK#oJ~| z^1$FsGLj~mOWA@eI3eR~c&Frd5H2MK*Z*-#vDLt+PVM1rr2yz&Z5y&RC2;jDiepzV zy)*^AoYu6^ThGy?u~vAJ7NeT) zv+lQU2hKbFk-}v76d0B(?=_CMAjX}k9+ne$CkecXm@)9FIa2&6KNQ{%uOMJ>6((xi6lxO|SkfFWwszxG-#B?K$@pA3+(INO|#ElA^a zWCOrxc+>o5=Wu(0WUxA{<3=5N9tn3xev1ZTccKQ){dPtz3{PwXI_axdxXuK0<3^MO za+n#Vf^$ZWWV6i@rp1o-8NV+hp~VlI}{c`EAz=9J_l90EvO1KDz`uOyGd^ z+o6r5^BeyG6j-**FPhTVxrh|l8$jxEDl&r)mfQwKp&8cCDmNA@jX?&tJCJ{IObRG| z_Ll?hh+Y>I!;yZ(InN+XjUP}KiWfZN}hb856dP^;Jv$iW{pQ4mY9S+Sz4?7mL%j?m(4U3wo{_vgV zs~qZhUNHRlJfOV;lziF-aRZ-cSpg2RpUI)l?j7`RMrhg{;9(2JcX1ycv}#Yrw8D}(^q zu6Mw~9(r+vGcPuFp1}g~i?NyQ-~xn{;AZDBn+XL5hm$vgZSJY#jM zh}1ZygI(XZF8Za4sj2!n-|@XZ*#Wn2&}o@tk|`*b^X-t?n(#cNp*9?hyqlc4X?Nh6 zg$OU%nIdi zW^4*`<}tn6G+njKZG7IIy_+p}%48!_0b~lzng9DPL~;>y^X=UERt(D_8m>@ z8i;U7<<>#&m~}a3j{L9N5w0fT1RWihgT{`JSs~Uy&8ogTHe>maH zxP(P~Wh&i!!rMti(aA~kwDl>(=Z?vldsnd-sbL$CtjCx?r|7|LjLrS6%QoirxQy0& z6Um2doSrqD`lQ0f6+&cDcu61S15Hrd5{2lLUjDl{H zx-`dvwzay3hqQjkSm8BAJEJxq7_@sHnSNlo$t4eP!qa}f!`h=8A{ut;G zqJDQh_}%r>kcWcHU*i0oh0(S9c2ERm#AuY+XbO!&p#BF?!Uqz6R z(hb7O3jR903j73l$7IR$Oz>F*^^;yA+^~q?|L$bpeDSaYT2ga@x?c0-Suvg9_E0Bb zt*Ydzv-e8kj=#D{y0z&YkR;opfSKOhl{PxNNG}wSt3TF<>Swa#N5)qyRW(a->~B2&(g&8lD|!_x&9Z-2ogULba{b* z;g_)xJ;UR;!jjDh3yhg&9|#hR$Wgj@ldGQNkMDfBnfl!=azoL8AG-l|7BM#n zdrmcwl8TAQhUCJoY?AI`Rt$XdWu1@R_v!BE)!_cU!4s|%nQ0Dn42@XkZgUb4Z%*@o zxo0{^xGvYuT7G`wXT=|KL)p@%Fl`s&ayZRd8{V8SFCOnZ_%Zgu6P%D&F}tOc>i@Ob z(-)%reT2UhjHCS$CgJn!+NSJc%O0Dm-_f(&n#lkQLBTBtxaRKF8+&dTveFBG*Yuo5 zdsWDXs41A$OH~?Q@_~bVm0`U%f`M5=h9)tjc<8B1*jFr+V6U!Rqs%tZq*9aTnY;<5 zspyb>SB4Z01sLlxepGzI4Nr}KrP1r`)hepD@q_f!7V;ZX?0Ss$6rA8LV@~2>VW6xE zzt+>|t}}d!V7u{O=TMqrUnU(-Uw~R-l|J<#f&8V*Q4*JYNwI?kc^^1VcG$!Mej0_- zB|PEGzCI;jD0lS&MCs!BuT;=f!|hT1(RvC(DAhATITj<1j8%IM-T{^ z`K||rE>PLtr1m=?0w(K@d-1Vu9NV)eNrYxgy!v@h$V=o(+^Vl)_7RQC;=3;v@ob9px%X1`p=w zPs)S0HSz6LAF;>{n6&?gw-dKHp4)^|$=h)VSxcrmlUk~AY<51K5i}*PufQ@kj}{{V z0WZq>iVO)Qqdq~B>LcDy8=hG3Nc!_RvrI~f9nbZs^GpNMadSws5BRyMsxq8O#>bQ63Hf;#{gMb{Rz<`z~ZW+UK16 zOm@)6xyOjp8I`-6%h_U0?;!(m>te`48*aK$DtvYu5BLP&e z+=-yO6fTKSMKQTFR_e^RvRQPKEEac)3Tv{oK6#o3E0BRa5w!H)(Dw-a=^B1yjG{@7QX53>_|eH&l+L>1ozZFGWJgcDWcK z$Bi;X-=+dO!KHRA`Xz}P_ zuxKK_=aj!|Kk}StS-_IQ53-Ad4Gw>oI`PNfgp*2wS&?crFLP8LA%_>A5~G8BMUMV< z0Jt~+lU~FpbcvE+F~4Fhy9Ks4BE(c25<$)Fgg#ApO^g~@%4a)MKLM0^Wj0aHk6PE8 z>u|tP8q-bSx60+_T`P6LhXwRDqI*zcDbVAizA+0?T{y865U0P&_^_XDqWo#1ikkEz zm4xWIwoIYpu4-5b)y}zdnWn!CFNG z^Nim-gY8Oiz@zdy9K>_3^@W)d_4anMKBJnN)Xl3zO#2B+={HM~ydACt825;6Ch__8 z`J1<4yUY{!0VV{e3KIw6U2g=Q^%2~)L@=8}9zjAII9C{R>&_MT$|9%68S}GW6G%a@ zKlei8T8)#{g0QT;pBG(KP)VX*IFnBLBFvJ{scupHp9W}I9QbJlsMco%&}&Mgvv2W+ z0+RCs$VQ~6sz_;au-GHiUhESg@`y+^9K)^S=$Q{>-M2{+HlJ;IMz{jxsHvFspGNOJ zs?uYz`4GQ?J2s1}t3I);Jh7+}5ztG`tnxxpUwwi|X{sapZvY@N`;*)Di~Vy>B|$+Y z^Nf&R!Cg{v$82@Z6dX1bY&OYB$vdoL`DA08WIlt zlfTT6?nQIEyFBKzh%so`DQ)T&B27-Js;Z?>x>!<~(crZRdzk`0p}$M-*zVnpK2g%* zxZC~@j@mw+()LOHb}zO@8x==)k<`kd9f=hyg6a(cGhbj0Ygg8TDR zp4_O&PVnxFT=;wUVt@k4VRV8lzDHTOeZN`G5ZX1yU#5gTcFK^;P>yI)UzBfx1Rf*swXki{0cV@0bGml#cKgnM($ zdSCCQQDwLNU12^MHcYxiPAL)hzK6HgM&ee>iX$Qg5`5+X_xVC}jNTT>efb{xPtC zu4CWDUbY>nMp)o1iuPQUQ#A^6mhwwy9AW7U)Zs0t-l{n_JVHLnA?C@xwr4uh*6toI z+8rI>N<`3FRt|X8h^ZKne14-hN82hIn=ZIyzxgf>`t~M{d{gXb98C9Z5pq-HL3Ac= zUdyP?@^~XXuj5AiI8G3zl;|ZndB7@zsTZ>dvjc0`=&T7)W&D z%zthQ{mr1^H?9jEUB+3`lR|+QzIF-Cq*^*)@u}af;NOTtr%bTZ0lTzuk}LyVH#oi#0sGt2@7| zb$kDrzD`1Mtj$?%yQy`_7ToYDYrKPh+Y+dH{>5&V+Z`}uwZgw!Fd3CW{rgz(RaP@9 zo5#?Zbm-W`Y54%(nhz3B5snbO6jIj zjOJ;a)q^dqvJi1oBnO2}0(E9t(;q8+1L8(nN+)&OeN!iDM|ESk+$fNfud9Y?%^?I% zITEdjMqbp5O7@~SdUn8X3db;U{j@Ht>P{I^4iGn}}_%ETW2V z8DP6z)czjgvBNXeTD_on_(vndxH(T@a+>Z>BSY)EOgBNQ0)A@1M}d9VNGaGMjX5ee z|2OyUFZ>L?52vZUr9~uXKOX5^R3ly5`yk?2c>6CBvxSNMAadpuvR@}~PXS1n&WZ*Z z65L_)@E}JXb#GxV<$5|FJhvm3x0&V9zZj}>^*5BbH{jMWH=;{JANDEk=iFIs*;w{o zbxNJ^#h|9=OeB-)r?h7n)ls$2RvP*`xe}4!eRxYZT<~qxGNY3Goi?+1Og~e@@^sxg zRi3lu+ti4^I`)lI)a6o5ZQ{Geb+2IH2EogBp8P|yS${%4}sSVLu8v zpCtiCb!iO+|7nB#nPB(*gLi{wuW8kZHQ^tGXy$9#5>EXJ{A8*E&YBeoZI&ae4P=dtEZym%{WtGQrNkZkYb!b}MUcOT zhiXvarWVCN7bI^`i62{;Vjx0)Q*CndM*TTLu7_EwpP%GDR_5YbK@Kk zV6)f2`xedR9qcG- zHJRxYdtA4N95IC()PVY#PAM2z9(N_d{R;=v#0!Ec3*~8s_b*3BZ-Trfl8}mF;pGvn zHr6hN2Lb(1viM*}0D0f1zh#r7&bUz?TwB&c6vuIiE7y#kboDQM*)eF|o8oc9Yt}K5 zDe^Z;sWoH)Ek zsGn6|@s^;SH#!bg1D#6YmIQaCi7(wTgLrn;&g!F#2(tJNvs3x+`tB@;!!P}suj266 zA)At%Qsazp=KiMDM5ThXIPz*U?VgXi)ZA8|zdp_!eyvMhYB{~|)LsIRFlNG0oo-J7 zNFTE-tP;29Ee#s-v6n9WM!4`^%$Y{Nm!ftW`eL~%wL4VeCXhA4>;A2sNlaO!a4p3$ z1;nHrq2fuQKeQO1p=B@JgRroBwyno%CH3P#0sEryI&(q%i7g>)x?ye19e-)a7s~6& zyEHa#zO!N3lG>5ETlklFqV*fyOVcM@AE(|DZ5+Z-p3LFh)O~&pn(6;s;^#Rc>pnO@bP7pxXc zJ%N7Tr3M++`w(sj)5|AlNi;T^*)KUDG9W!5G~kz1e@B1Ect>}~P)8qwm3oy^?QzX< z^>Hm@6=Mx!HDfKfiUX<+g)BgzpAj}HGsaa`P(G*|LI*LA5KY5$ns-`(Oh6VOGms^u zmU1Bq!H1|suw4qEY0&^c52oA5w6bP?;lMso(5Oe*hnjEav-e~0Ft-nR<@WUTQ-29y z0%VorG~J&9m=4)4JQ4Tjty~L~j)Uyf`(qgos&5sZ%KP&Jv-#GPQ34%V^QXQHt1=Ah zrm!wrpO;SCJpPY?!Hs8vC|!Rxr;S5@a^o?8H;3^*$hI9yq9e!a)UhMTX;aGoB{1A+ zTmM?SBgSb5aIFR#@j7)wIR-KS!N+TUJ|S19fec#|jH|(t{Tu#_jO$NxHn|+nO*_Da zK4Dfqv2iCFf#2g!39mD+LvNWemVxocqwpU1FuWf=&bO9&=5;c14M4SCx1#*6{ZQ!Z zty=<2AO$ z&zG(bZ%G0Jz{f)D{h#>X*HO%sUohN^TulA z^Cq3R&fJI2ERLNKz2Vvi3WcY4OQ94$J8i^j8HVc z&v~W4m45c7S+iltv-x913VqGziUg~Xde>|NzE+FIWhT*KhGwN47SRzN*V1M7#u0kg zLd37u&1Tm|N%b7QtHE{wX0!zmT^9XOnPgCgI?1J3on$CPWjMKRt7@5VT7acifJ1S! zNRnw_^YNML*?XS^|5`~-z7(efr(aG z-`g~e*npgsDU6BpgQOd0C(ltDD1M*pHX|65Q!-;JI3AoVI+VFpxXE*-jk58{Y%_$t zI!^W)axoBM-+bj0*QNvG0J4xyhi=HAo>ee_|2^J(j`Bf0M#-a!ZWC{7ZhzjE_^Sk} z1{wy+27V4ymgWV=!&Bf1@L%vGcq%X+m<&t=rT`Pvhrz?(A@E4y=JXjgiV#(HoA0lN z`H0cOC}6ZPY8WGo3`PT^gwd7eGmhsQ?i}nKPTd?ib2>Xdi?|Kb=VurIb zqj0 zr}%u9pV@C2_?EGst~BkGz|vn~;a<#0X-Z6 z!#n5XsGk9B9h%1JmCK@iI%}D>juF2eI=$X0;}{q24v*}h?nv?%45;spD=Nn|m0{Nc>(g_FGyx(2+CYA`MHbmtO zeE==0{o3b?7r66WeEqRMPXnMo150gCD9e4K)pvNw1k(=x$)aXBGs!4ZnOpSP!{SAP zN?Fr1d5yszwZd7~lA{kGUORHOtdb>D_9D%ds-hQ*2!%rNtuM6n#bjFfQj^k!Ud4wR z@|oGM52eM=Yzi0G-wJ;DWq;V1dn(7QndlLjTORv0?(l~0e-BUpuh4R2m>S7r0kGzfgsp;0P4oD30;=V5;>YM>w-u(u(ka5$MPi-bbI z7IRams`7s^?tlG{+gc?~iItzNqVx5L82oXvKHBXx;R(zS&0{>;KVttF4`52#k7jw= zhLvKo*6q%kKrdop++Z=1@#qeuBJ|uj(pNS_l6m*JX`JcKm<3ol809C3-)bV+?NAw&;U3Q{kz%x9+QE)0liP1W5N z&N=MY&xFF;kBHgd<%Ns&HLrDqtN_16^Uu^nd_EG1c}N^cTM1Twm^ph+p%`AoOW%b% zfT$r&7Ei`p7K&xYD&o2QQ_J=Q=W!LP5s@JWrthAX3gyu3{o6MECcJefFy#HCgY_RS z4L_+sk}^5*S0$BK`Q541VJ@@aK_tpd8<#!z^uv^z{76!BG@!Vw__2^>``1RJ-m71Q z%>O*uGaJIqeepj|w#*tg$|k*$*E9WLR6LFp%yz>F&XqO_*j_}F6TBP0-^6tBP%0#`ME#7+b4h4Oj zfk!BmUCxGw#b)KVH1=CLxsqr1CHHP^17D&x|GUW+d&%eZKi9vISGom6wsw@c`9}f( zXA)kuF#r$L4fY}W%v~vUXCPi#g?b9URPZ9QIRR_l|anV)! z$BT-DyD)6uH|pprQc}y|MI=T|U+hvd?v3NI`+kJHhYu;eHHpK{-c&?R-BWG`uEn6S zXB{yTvm`tAR33jlH85cL(@pMGv=Ig3htC&qvbwD_SRn) z@XhMAWaVygnIYp>Iki3aac*DEy-|tfDUSwa)jg$su#foR=LYg8sYupx8O0(AlGD65 z*MmRwLRrSUasVyd{90hoz)y_GeeA=! zz|nm{i0u+E*xpLAAe>eM33vG=J!N%0ft# zdQ4TpEopN30n(0*vBNCQ^PmgXA|e?vG5;5&Fwg5-u;v%hi;nsK;hD>3y|>6a+SewW zf?fx*VFa`#-JfE@Yz4m5{)vwHUY&5&{E9JiT9)t8vBXQ;C+kO+F>=FIKzTfYx!>8& zgQoAwvIg&(x-A4dzDm-=k4G%4M6W+gC<@3M)y5DPS%WJ0Qpd>TS%S6Mx0Usp8qtXf zcL`X(Vu`-)CRATi9x$pM%$E~su~E~`2{hjk6i$5aHQJ$#<|q&0`?*sVq3g;ju-?if zK%uUL@DYd-uvApWyNG)g&W!V-4}U3T3U;|G}_~%*h)4m2jNgQ6jl#QAGu_0gu!(>*!KX%4xrhVqNJk!6xDV z=%H!zdst{Ijnz^>fDUf_(;cwBmF%8cFavN`8g-4(?A;KVHfdTejJ zsI{bu)0$H5k59x!53vc4D^9INQffY<5#GZeb!bx1WyU{iMcSVn@QJ;S9A3;Q2irIZ z3xzIc7yRKuR5+>%QBS^1mY37yQcw zQHUB+7?dJ*x0^VyYqKp9b&bj4`%~a6n=Y22Qt>|*yuiOgrA-wzXc*A_dnh2d)k+jk z-yo-8Su)sGz?HavheGzh4?{NUy?w$`DE^g-y7uekQEJGVcU019yxm-!{gStrIiGqw zX~M}eZ*tReLzD13{?Az(MVzfrIS)IG!s$)sxpb>2!^v_jk)&V=&r!L2qwh^du+MPq z5}iQXt-b9ygjjGsz83W?0sCJr7BESGAZY{nGs_!F(|yl_0lJ* zddY0vVW`o!qi$xNmY@;+#eXbAxRjW~z6eiNm}Yo-?!{XPZ1xcuh^_L%XkC1@t+wr} zZ$jbcwXm`o=Rl0##+2FFS0<~oubfswqEz6qvNOx}0s|h?<5X5TZ67b)+HL_UT8n zC*jmqh6O*g>q8n{sLIYKV_pv3WV625QqTJxSuTDYb^03`{cU2wdc1KPxpgNf{ub^2 z*{#C~2Ap0rW47gQ9tJb~k%V|Jnwbd}x{Fzy&6`PD^XFuoOVA0R^#eM>#Wl`2yao}0 zNXx5I$p1&&TZYB;Y-QAtw?(XjL!vEZR z&b%}C!+e{5c0awe)~erL)v|Y2)h&xN+_w6NNeo}na3Tt;tB^LacS2J^(*JNMN>@+YXu5hy!(Fod+8N{TtKhu-cOt{w~&_|SxNAW=x;kKj_o<6v*)B3P2^oqw7;D{5QksU`6Q^Q!)3A`XAd2Z%My@JN}!AInN&0DyDdI zvf|I}gi2&24qaZ(N zgc0!XpI3h}I{i)Q-?r~g`aEq;u1Bn64*C8Dk3!G-saK?Z4))vkkN+i1uRvjD_3jlJ zpM%BzZU}(ex{a}N_h9ixLLUce1BRvZ+*sFHJ5xkhWVBcFGPHeiGGqm#{o_pDuGQ0( zdYTX#E(%8Sx(Z1^93E6CfB7iwMz5%wS8PrV4v#Yw zwIE_#kgW0#^w0PISVEgmSj^vqI(`CKt&uM5gMnmR2eB1#f-)ryRm0bzvx5GR5wMsMZmEcPK|(2#^M~$3eHA&s>bFktYcwu~w@2CZ z{RB65iArR-70cy0+kJ1Xp8eb5ZYzF>tZ`!fJAjf{l&|TzAEplfuRLz6k%Q@0e&2+& zAeNS@5%1gIb%j$$BWQ3-6jS?1=Q-p4I-Adw=vA#aHy5k-4Y}-AsMdv#xa?Y2f?6V# zYiaS-m;U4&N@8sIA27sNxZG~JE;^sOguktz9{1PQoc2i1_OETT#$4Z!@K{AddBlkD zn6(WMpA56QjDruO_VS1I07Zbrmcj-$S?+=;52t&7{bWEt{D#X6a-1$TM0aD$G-64zgvh3;1$2z1&`~H$H(DK?$7-)HGW(2gnF>?%R87xtj#|6Q? zE59!{4wMjsmUm~KLAdq@fs1?_HxVizp0z3WYY?uLnR4q`?5UZa z(tbK)Z#$#)nBP-4eA%{%X_7%Jf}Ba8%D6HPZJe$c5w0k?m|R0P ziK**%H|Kq571ipI7J3FblT4=xxicO_`0!y~hdIq$U!Pox${gO9X}$!Ub3#~NSKAGwKar|1r6*!qXNmy!x^8jNqVrm}v?D0?-+7c_~#cK!ZIyGn|xzYm(? zpAyRxX{1d`P?pfM`N}av+2UUV@7_LJBLv*z9 zirX(24;Qr;QroRbx*md$B$a^I$)I-17+?&Q44O?dj9VKwz5%j`9&xpm2rO`+ z4EVz{vnf89l2940LEMU}qXaVkqx}$RObdAz$Sl(2{K5Es*B&AGMSDdWO8HgK4*-!i zi#F)Ot+-b334s2`MW7iTx#+h?j1+m46Cg`x=0i)ZOPxENI7$s4fKf|5`GiW#A|&Oe zUzfKvVYNI#yCR{krqmp{b_7N;nbiVt4EA%yIBpP|uelL$jdYJbC^%M~tIFRct*La_ z?u-plTFE{zJ;a!yDQps(o|>U9R#mW#Zft%mJqc*SKUH#VJU;PRu7neGG}aY!|8sDU zVDEm~T^#Kr6?<$H-1KD>Z|#~Kknu|iu9&|-P&G(5>#kd~y9Hv2tG&hNI{k?MJR|<) zmYK?n1(dv_4X{X>INr#22wJmDQ$aZ}Iqj`&g4uRKgIli4dUl9%$ZrbdLvl;H<0*YY z?4FflA=lz-fjh}O24Tjn)7E}9KpvzIj^LqnEYFik$5ruR47I@wj%qraCw#kveb%74 zL>phL2q|3*WHO}h%~gz7s8J50NI*b;!ss-ET@|a3vf^Kyx<;ofE4y2I2$q;tPJtGn z);%_^54O@$cXsXJIYxgwLKdmgkAJX6CNqJn;CEU>z3^+Y*5{X9h7dU$%q})vKS##$VOAJyS;L{$8+E zN===*w1(f|+djJ6>6+jdd+6)#e=F7+ii?^?mZE+psaKY!b|))DmZX+SZ*V<`a9Z7bEla5{-I)*g zvg*M7;$4rX~A`_TD5L|nWd)EW#ob;3%*w1ZctJkwfnE8j;KH_e;bt)257 z63tDL5 z=gSURCDnX$_|4etVjFm3gFNGmCQMr2{s}*|t&?28FZHfKRF>5^%Tmp~`pF@Ts8qk^ z_#-QDyy{lJ4n{p=CM2W83)`zo(F;uHlgw7$-xukkT3bttJikiEr)A=b#7)fG`)5Z{ z&%*Cdn-^0p?#~RGqQ&QFGitb-e;1Hmmm^;`nQsqwep&P_7q{6Sjy63m7KaD@QqQhp zo%rjzx8qaP6kd5Pt!H-Ku}RLAA6qh03p(MHwv7k1sxBT()HYU^Brk$U)islq&r7Aa zPHBNfF3P742ZEW+pAUhjN6sxph6;#j!XcZX&P=P^j~{!i%wy^Hant0QOq)Lmv(cDo z&y*&YbJ|ZTlv6F|CR+09tsKGJ(SYR9=ca3l=DxC4F|7b!hV&U#HEkM5+RZ_v=anke zm$i0bWgJGcqvtc{Go$CVEx0Wj$fBdqRW3&A(_JMIb?{BsI)~dOvvn)e2SeK~9pIa@ zr@q|~p3CEVm|bn&*N1z@5xNP)CdZZ88JFiLzOi_YVN!5U+9*oe%|$kL}WePwFX@8&SQR)w80w&}=&TM(T{2FYZQOu{ut zFMd;Thn~gnFEb%37G$7Bw}K2z(~OMmZ}^)FYmu|XQ2O| zl79;>CM54{`xaCTWN1mi%}pn7Z)Ig}VDX+FJsrSC-@wKMWJE5e|0Xc8bEcq^GcYoF zL(7?*{|zbwinkDS$^;C||HS*>03mn>Ob(t-0BCFQp8x*@i@d$A-8+H~z_t0-Z3xo75_20To z_upNn`So_TEfql~Z*l_ymj5G}_w?Rtg`1mzPSOBmWM@pk!1QiKK=*bo>F3HI0iy!r1=i&^qP}lsc3gO0g`588*(BfE@Fh zmJdCUlPpRDcuZUUFkF|S<6IW1z_*$4G`EGbC0Dt1Er;$!CD$1dC3Sxd(;k+Tv=>gy zRv%U(JZ_3skFWBUUvA1?VW=TK{J(s(6S8oYBWqnbEBp^b^dF4hac82Z|4)^_*WtTR zoq&mvK%Ib*g`Pl@fSLY{WMX3Z=lRAm|3}0AMzXvOr2l?u60p4cy|Zs5>%U1>mN$}( zk)D9{jnX7wefN83H3`_>8)sp8m$EUvk^jWuc-OH1N5lTEc{gHZcsJx=dt;fIS^kOh zzrHdty*o0{zi0TK1LIp8@BDkXcbe@j+JC3|uN)cPhTeaIzT5nloRQ(Zjkgh?Nuc>3 zeBR6V4WGAx{y$ddzYCc4Uj_WHdS)Qtpl5yq@qew|qZSx9oat#+4o`R?TT?yQsq)%1sSLWSJK|?X!4(O1@~I~zv2); z1{lJQtekQG3@rP}(EZf0%sG|}= zN$Q3Gj#1l1U5(8K4F-3IZTj5=N@P6>ZbO)1V`C5pr^`}ZJvihL1x7N7)A0sh3DVjf zTJL5aA-=9eH@0&+6!H7-U37$5`<#VPdm)1Yim!D{keHP zLmBL6E^51!p>o*~Lyw2M9t+Sdh8BljtoO}CRusZ?I2V;` z+@9N|NhR~{SNt6zwf3X^$~uh#&%d_To9f+tD)T&plb60T`gs-<5BhA`S%NCWpU+xo zSGK{6Vvwjfa$C5q)j@2ILjez#Fj5@JFWj>wJH7C}b~eW;o1Fjjw(P$CkP6pfCj;12 z(e(C(dxl^1*mmGD-n~|X%Jmh@hMi2;XqR;@IW1DrYMN!0YAhB3=Di4Gf@$G7Iq5!S z^JwZWgugnY2-L|dStw;}nZSt{lTA{x!#zbuEl`TJ%xd>&UqNg+E)i5f>u zQ(jRDnc2wdguf8DeX)I*K?+tt}$m>0|P^7W|JOALKd3-(w=i@Tb7AcX6gU-*q`=R6JD zXBT~bbK9Ym0J7A%`qeoYkLv@3GVaf?PP1KLg;9jsfVSw#nY(j<49=9DvN8sES+N7h1DYzDyf3UOMsuKNBxfX z8CFmyF#vpaWTFRlH&r;!Hky4~G4CLNwOdp;;Pf^ipby!#%{Zj_y4VpP*M7X{mD_A8 zlc~0j`#BF&%jsqfz>V2T0(!a>GhpLme=f{ZqASE>D>cokM(mrCAd&qdob2wo{q}1( zLH#slv`h?ddLn8y-T;}}r0cX0q3A+0N7%(~a-zXOO4(G+brwj)g*;-SxF}eJuIRH2 zv%kW|6<3#M=vYIeJzb$IX6oR&+ZgV5T%by&?4UTSglMZC4@d@^f|BSf3K|Lwv`hsA z1vf+Edd1KS_z{LgA|#J_q3gQ-PESu0JJfZdaBwYI4I!&*Iv6e>kDA*||ETNW4ZwAn z8@D&Eh7R+m)o5t`%3f(BB|1AeN=#`qlJN7n!F|R z9RWy&*?HQPkH&s-Liv5d*L8Jo)e$%JTCG@)KIzKU{}Lw zl|o*(YfJ7v_dAtoL@I+t+jF6`w$=1$_t`lVe(Y(}gSY3fbThhf%KcP0P}%+B<+Szn zD5y;PyTc4gfV<-LeQIAC$6>5QvWVwZN6Gpm9(&8qvv!)x%@e|oCM}*0;HhzI6Zz=U z(SrT?DVp}P?P;TKSCHcO@FE+6`KPZDS~)K01f|rEKXObtmnEHZ6(XT)?#U!kr0*JK z&)@{6&kBixynK3y7ep#EP&iGQGet>yubg8 zuldw7-)2&uxmU{8%Dx_wwc`@bPH}Tg^GH|ZI-z_OqKt?0(*3smLc)Bxd%rz;e2K@^ z-^J{Ms5TyuCmTVt$%wX=nTOTt=?rKJVQ%i&vu!73{}Pjq8#tI*2Tj8DYIU|Wd1Rs9 z6V0`=go3Z&DtMF&WYT)NukXd(&a0MuxsHy|blp}|?g48sl_;DPF63)@3tB%fsXgAC zXlp+%iw+&D?)r_+w>_u7fL_|FblUmMWLDTFa5=$R}orOZGnrn zbxT#*TKH_651CuwvDO10&|?glSvi+Mm?!Vmr|CyoSgEO20ie z)Sg%Ry&@;uuuoms*z3zEQzqbhtk&|L z*rvmJj=`ZP8WGEIg8RIP$&i28Lt)qiI^@+;d%ry95&0j*?Qd@9lalW;_ zrOLgh^CnnfF<7`Dyp*M&#%$bN%2Z0(sIRlsKs4WMhL%0s9jIJrW*}T>X5w0?jK}jF zwLH3Ku0AJRgces)db52@)hOrFE|v(-Ix7RAwkv0GxWE}#L!%;+a77cM4=dP@wq9UPcARByC;$pb=)uQVsT;DeR5OoB5biIQRb-G% zGp1_EA{(bn`*K^WrQJwP=H(a;CykF!OpOQLj(1G;n$YMZ`x__mxFYpRNF_`%8az;+ zW$q-Tq$cwhnjD1g?D&iE3d_xNYO~a=&ueiaN$-Z#U?QW4}9If8zD=LfXo$4!1U-Vec2+_reH)d zwqnT7#lHuYXiqFdBsgb25H4WmC>3k)8`jikx&JkvMIp88V8ST&gD5x-*mMUi9WKO` zSO7{?7ofRRDk`aJ(s^pENbqPjQmaeEYG^d-YbUSUd#JeLZPR3D-|nShlq+ncn{>)t z2csOCd4?wMp3tc`=x>jc;D$tg!1x;T3mm2kiOG)xjbwlO#VG4cNCnQO(^)$TlIHO~D~dMoGDvuXRVO{vZ0Iu||C5x?c;R(Rzvq zTjjHjcwVWKUA0&w1*^w!@0WjS(fP)M#9< zD0GU5d6KhVja~9tE4&piI;k5~M!#v@D?oB7Ho`#Sx=3AZvwFN5qjf$Gg@{j4t|Nmg?FC-lg;?ZD@U0_qq&n%QHq9CEYZKI&3s=f6%S; zE2f|x6Lwj`Xylx&b;PYGY^l^v-<>b_7&Qyi{$;6gt^2r-;Ozx?(Z8=f6m5N8O51&X zDi}l_Ez)}E;E7%>CbzshxPpn+E4$<^*PWgdEaTJQwY9sK>Lh(m4xw$Z-8+65y+}s|*KeM) zIq;qr#XctO_Jpye-SrrJ?O+*j6eniPhq@sbR{&V)&GnooS2 zr?DK|TM$6TGdAUU(~*sO#Rp2gobLCOye@l|-zm5<@!{pZF9ggWa@;f)-uJ3c(&lrV zRn&Pj*|jGxD6eWeE?ma9+%2)W=osAxK1PFs0k2klJN7L@ysSoAnSYmYM}gWs)?JqP!-IH0 z@(-HWM@14`W^$;+A0#&L zjJCzJ_Br=!lhJQF=2o!v7jP+<33ZxM00_)fk>*?n+F$nR>{uW zWLvT};1oxOE@mK?qd@FVm`eRD!U<@UX%uP{XcSqXUM5_oStjEl=b_{wJ#eE7t(#g7M(Lnv3ntnpA|*Ju}R=Ve!6muMGjS7n!Mmv<$)@39Zux8A4N z=h!FNXW1W{XqwQ@X%kDk-b`1)rdAZInLye{+n3yT+b7zW+ZW$g+gCCPv5Tlybou2X z=_2Q%<_DWpBULMGO^_B$!w(wr7OVI*GJjX&t36 z6z;_CFf9-F)R1!_uuWJU*EqUx1fCS;a^BUvQLVm+Z;|0#Qmzp9#GK?~q`MX=t5hK6 zo`UP{lIrf_>h8dGzoGayPt$YgxJJLd>>G%H(3C#De(4#@cIW4d&;9K|$l`VK=LX{W zs}@nPc4T#rr{VErjX7?MOk@ur=f{yJ1@~`S7+Gf9@YzH6vSc_tp{B?Ue%cUh8v+&gDS&hUyhr5Ci@-Ebs9S-egw+_b@ zOJ}}Hw%GzYWfz!%egdw0s})VH4z@(;u0{eUCf>AT7AxC0<%Iofcqh#@eDX}!i_0{= z_;VM&9@xs1WBlsw#c&fiEnvnMaa|Bst1z1us%5<%91oI!3Q;3`i`GvjC{KLAsqzZMVuP?Zqq*Jm~TLcrZBlszZe^Ha$(>3Owo(Par)a%{5w;)x?|5-IR zJ*6@Wb%yPF^|I?p1$(=4r~tz7{Ygy?8#EXtB#@7a_rxz7djsA<5WLGH&z|t6fThS# z`IY^^Oha=#8OOGDyhr&c)Pa)87LDf#7-)^+lGu45@5(Tl4@rNN?TGNQeXLRi3(ZGA zp1pmN0K{N@V90#Eo`!KF$oUX%I4YqW#v)!w2p}oYpSy(xS<#@v|n|SwSqFV@iJ62mwHp^c6c4dNZR$Q6M(G@6$*i9TLjv#|@_YIvYft zn(pTqT7!_Dbb^pfqI-SSm@gbS&KoXlE3$!-nhm-n2cVM4f34${T5eBzQM88!>j{~<)#QUU6#4CKa zIy`K^ZS-JXWgIR=T7UEB_c`9gvAG|tc-1J4_n#ZIdG=b(1$N|F{U%9gJ~ZMdLpJi6 zL0atCQ6{I{LndyurcbKM@8Fw5?~$34E+X$%&Ap^oaaaK5`FG1r(qYQ?6OWIKQbrA! ze(qKzro&Xur}M!)C*XFg{ZyaF8P~RQp?_4}ISp*w@vg0KPDfzZ>_>vs>_!@N^9`*< zw`0hYn4|j{U+Kfo_4BnC322cXPzjYjG$$~=osLg5rU}^?MFXwb6Q|FsQ^e1wpK4Aq zI$Mr3PAffIDadqMWp9o(imW$e?ZKWWT8^GBTB(>WS}~p2R++`|OmYbMjIIvh^7-(S z=Gcs3Z3Ut^?w*Llx4nuKygnot9x!gAGqSWb+Fno!xH}yBndQ-7ht3@J5q)pq=-asb zoXfcUy#H|15wkSF=sW+IPM_C{KW>_HKXGm8;*q%n(dZbE%nLl^5yrJ!A(g&c z70pk#c2##YHLQLl;D9|!r<=F=q$};&H~OK)_Zj+1&cSeJ?1<3;V{iM&e4J{IBVF0X z1)YoTlC&u)71;%`>BE(pbeUcoR0~)$!P#fIoff(!a&on5)j;cQE^z$sm2MNZChAM< zrbNx~OZ7Q)_SND2k|Xi)#kuM9x+=4uryty7Er7G$D+8qvEg_Rl^N5Mcb38{P<9wB? zJ}X1}?nlV!>Z)ve&qq7MLq{K_@%8I|^LDfP@P2;y>gu};{XpJ?d&S@Yv$vV@5@a#Z z+z-}q^x_>jfp!m`%$w&)#GGR~ibx-;bmdReyEOnCja8MfdwMNLTw-##2l0Fe{`*rK zi0sn}|A6Bf#`Ecc(-rLs@#foJ^3nNl)zR1yAlc|BImxg1?*!!!%V*V?7xobx%9mHB)klG(m%iH z)7YP11tdMUUqvPJmT@Q^!{P&883JHpOPlUMW4@B4m*B^oNH=V%nB@CNvQ$J3!*X+I zI$$EQjA8D9+(b|~yG-#cZU4g@rBRE;zuud7BFwww|hr&SSMeXwP zPyOETzS0nrhB_8=5zmUS?MOxQqMiD+{Nx{VH6dft{L%G3xgE#>wRL)-Z@kApQiWHV z`MIRKRnbGeFruD_l(J9uc6p@mM+^yZt36-`6>ysUpXf{uNulQ<_7@z}z zv7qg*#fLG(6YW)aeIyw1M-_gbQ-#U&?8?SzFj+wI8!gM*B>x_jlJ=bBZ2mQCc=~N3 zhj^W-V|tXQhWCv>on_{CVp4EF0IhDH|URQ-+tJ^wtYS9 z4!bB%{mxhiEWtq<{m$^1_A%NLP2A6Aeb?!h=$!ssd4pl%cp@3h4+b!1F(Nb4&GfsZ z?_4L$PM#Ghr?U z=h)-MKr@!jy|m`se%WF^gnZ-zn&tY#c`fh9Vom9y9y+~doIZ*1>)4+EYm~r8 zmj%%|WFA~u74zU4_$9k;lP7M=$}V%XrN{OD0g^keYuT{aT8Khq8iR3%42~In|>( z)v*C<&38^hSkmv8!ZKYn{kcpf!*KJBUExFkfeLF+iua^p2QFzd{0-E9iNZxt?{zjX|541o^T z65$k1TUS~Vhe-O%ZBM9SARnf>EHVaW@b~WM9(CC?3~h|nFRw%%RH{)UZDbZPac8Gm zO*!g0m^ty>Ibb+21z3Y4}bsh9&o|RvB@*!+Ta*+E0}ih zeLZ>I?EHDbG4&L*n%o-7_~nKfeJQ?T#U}2|7LeoQ{|BW`XXQ3na{_f^z7x@1joulR zU8Nfdqwbd{8XfP$=Y6_~unm!)yFXr>@YCm_RnEaN+GoDo$n#mcpAtrWt8!S+waz~= zkcR&0bqT-ahMVH}obo-ILdpA^BaAQ;U=^hjxm+Gm1K#4m*@mW z!Xs9bVkHcAU2cXp6w)!I9Nu%tgLsJ|$9ECv*rzk{`0Y>*aISEYLO$cHx50V(&3I25 zXt*O=L4E1y^xV{WeuTKMKKJsmlR4vSWT)%+gM>hd%-;OAnC|itDH_2iXZWI7!@IRK zZiqF0?Mkj3HHY+F+`VR--OVP_0nLeuPUQ{AhZ;!HlYQUb_O(kdMc*vwCb+l{XzO^- zjyEwfpD9|`+;JI3_m5~PhQ+gsy03LbT!y0sQm(?MLS;SS+y+ri|4!Nng$_p#Hn$y$ zUs=Is9?5ooTK_3DFa+#@O59$1GS!iF-$@^ay5Md|;h|wh06O50Q$bUJsU96IM2FPZ z11!raItR=zON9e@ct3f>!FK6LEpFRiU|n2al)Oz&mtQgMj_mXDA!FFZRbi3q6zJa| zz5&cV2sr_uo{T=#CwQ}%C$a+`h|Ruy4OG-_KVbO^W`O{=!4?g#|Ll`r11JL#os--t zRXX_tJ+%CGh1Pcw7+SqOZbWfB=+(3l?YNcZLb*czY<~7nX+{4GjG6O0hcz058U;ZC zEQvDjVhq@|(K}UuU#siB9P+tg5r^t9`6frgEFnoG^pc7Jh~Tk)Puml@U5Pid;nxBQ zqOob($O4OXXRC+FD+C|1zI2!xw->6FSDq3VLt~QeR7Csv?VI0~x<^hfeV|Sz)K=8i z)@Jiav)1bi#bdE?vKT2pC>+cXq#T5aN5oc9VCXAXuCTBZ z;q*6kPKs%oVE~H*K&#G9e)CCe@5E5b;ul+Wks#&VNTI(xqS5l-tHNZzJtwcUz`wl= zY$1|xzY9);T;%i|xp{)v_u|B{7cuO|5;*FtP&mU z{tc_$;~jkgQW7E;hrMmjj8vX^#hmy3_Cw}XX06YTgM`JU@#iL-P3ePhyat*X*Pu}! zL|eeoBQu4CX{denp3P(~s{C^NXv*TP3CdsR%W;?$bP3Y2Rc0)~v`>U5d|ZBiyEk`7 zjxoaf{!k>rjSQx0yEaCi4D6Y#K-SSB*3X(@SGxy?zGGC;(xPp48a^o8I zGfx`zU9=Xno0A32CyR+$`wr#Lm)~}3te>yc>{u~Rm`CLqzs+vh#p2r>**AYx<%vQM z%(6rMoXJ%~4<)^m%aA84v>;j`g&>-NHOT$Z(w@#+gtPG(@sdqdZ;!WSl_p+ge=3&_ zi<+S2d2{)++ThelqL>aVH7fNg0UNwK+B7uO1cOY9dd~7QZ_S#!4UaclcNyb6>WY%e z4>>SmIEBLu6zEgm}>x12o~KP-XQvD=r8J@;4oW+!4!NIa@( zt`nCJPt4T!N_g`DO|cVT&s=nC?D+6~45HVbO^4h2m#WFfF>WhRq4nfbvH7j#{PCbW zZ{e=$P4S{h0u@QmQDQ>Oo&2|Lex9&>-O`m~iVi+HwgX{xH~8YHRTR1CrjmPk4Nd?J zen zq{My(xQ|+bIx!1#Qtq}3%?cv~{Hdnjvu_t^YJ6{6O&*6o z{p78!aPf@7m4c4~onOpeNot{1z)V#c+?`pi!rWaeP-~IXV;9NZPcP^X3_kqaArn#U zNA$azEQ+=g@h`E^q~ZB*eppdRV6viRq8#&A*^jG+LV-&p=K3Z;V|UJ+-Xd}3*iyQd z>Z|z)M{(dwPQk>(1XjJRh>2st>D6|{g-KD#4DNaNRO+I-YB4CqPmPThcx;YaXPd&a zfFvS{Af)D#r7oIg{Fz4C!-U6o>|1IzuL39nFU*s{&;ql#gx2ENb-k)L>@w`TvSyE( zpHhYf`Gs>=hVc(aLC2vhDtO4ItxYz94+MSV}^BV zfaR`}ocg z*8MaE(~Eo<->zwkAro=ol7*KbyV96dlNp5JDe-~ijt9ENE;QLSu-izgYFaH`*XtrM zJhq!$`olI)zFqYHQ4Z0V`drkb62mb@7axy#2Sz8P-K%iW}7mW4v>3`6r@ z6mko(HNm0^y_6$^k%MKi5-~-weKE6WZMi>U6@$^>DdnhT)KtRphA@=FQ;CqcB5IVB zf-4>>FVvWnzHzbFGCGJI<<7Y?tS(kW=&kl;s}!%4o9gLi0H%h6JA(&<8{q*x*_F^$ z+2umi_kk7So~f_jUfn$a@c2ZR>K=dFgzKAD3h~=KnpOBbUYx9-YJh|(+4G1=4EeOt zXi?kd*(`E69FnDg_^HwuzSthh1}!k*SUiu7Tbit`uDb8R=1`t0mzr`sV7b+$@8IH5 zy<}#ZOHG}tuj8n7VP^2)z&mS*>KtdLUazTUd7(isxn|iPz4YYsSFeE%O3{c~Jmq5R z-g@ie8jZc;Qd9O!kGXsXXOrnDZbLB-6WJgo&c-S7a)bo%1tx6IKEp)+C&O(hc*vS> z`Y}f4AN97kw?Fw)Iu1djW!TzNbrBZR8WmZWbtlu(;%aea>N{DOm^9AStXq-0Itq=@ zt60w=2@}z8=EsAOt6M-tNkH96M6wZf{SbO?H9q6cH6bmN$+}x(CS0WLDMW#UX70%U~=nNYUWhfN4-ER#R<8v$kef z+3?$NC}wZZoer0ZC7fb=3f7F$p{hjfhEHxuc&xg1O)2!m>Ok@E%*c5rC&IEtc+TA} z&EHPWU)C$^>4SUXMKx8;DQq;h$#DkBan~jf=xg~%zw|AN7PabHG#Gyq3ltS?2nCT5 z#D6B2BE9&UIjfySNpX&bjCOJD^bz5kALZ!VWF#*EA{m+X;23YOrUEDWf_fmx{UQE> z^0jb^0b*3KG_p+Tn0sBa3kSvsw?YMjlbx5-;#5kJw#A=?;uiIgap=^3<9Phn+Sv>V-ZomY5`3OmwuDFh3T1+{bGH ze`_b~wl%H+&)2VtIz>CRh0+RP(Kpt{$KWv^KR>}|S z-bUi)q`tVMSkBcjl$Az)j*!&2gxRdZ((D)!?xqMgt9m&}WyZmxOcld12-(5FbIyli zz{9bc{1;mE#&eO4+$g|rctb59IDu_A-a<634wB)! zZR)F_&3?Wf>)2Lxm#^$;E4Z0oA^*H$TwPvRUz=mH^)hYC7lP~V`^Rakb#>`&+m9?V zDRl+Rh*`;&t@^RvIAr_nCce09^got~^yOO9;x&KOe$^c?Cn=o&R&(s)_gY-?|^P@#Ii$&NqHHryQnR9I8R9Ad5|DB{tB~&4tYq)oo;&wW!{<_aX+=39+x}l_CrU!~v}6 z0K`&{o6{&2o+Xb#XTCq2U;yBS^CWdF3 zU0-T(OqC^~K2XoB^PBtOmn;}%K%$>y{O|BE>$&irae|ZXGryYRT;ZjPSLL5r?VWRf zq6|@SJPP-bhyI7&i&#|>A5m3e=(POQXkMds`vvrUnuQV*shREHau_qW(>Jp%*J>@a z&;jU`2t5M)`N;eB0z9AUB);%jpkN>3IsnVRvYAq~kw>8S(n(^Fe$`(vwhQj+p&xOKxJ#iDCu+tl&DS-&u*TDwV>F zbQw>*gTXOF4coMfnNO}3I$E%X(v>14=RVAkLs^gIB+T%**3ZYpl z#Zm<33Dx}!U?-SXcXg$}Yx(^&gO_#+IhfzunKdvLk|C48D{#>YZz%?L@2_{4eny%H3JRKwV^?a z>8#?+qtusSza&}WI`l9NM#$ohh_vM+58XoRs#5)5Q|U#R2hZ#jSYP3$V$BEKYO&0a zc-bQ@z!Xhd6;ZDey0Y2tF<#;fWu+sUT5HjUsCeS{VASu|^^s-fq>syf6?P=p{ zbq+Dik4=LJuv>eztkRaF3{0h;lLvvqv=ei0b6W>A$F^5(!BupY*lp6{QY(B z{=$A^e^74K9mcvtejh5l*t(u@NAg5rwTslm+q%8}q~hw3S-jdapjlM0j!j^$26@PZ z4%t^;A~c%=LbrgUfkC>`61!T?G0rGdz!w{tdg!?X)8q7S7C2G9CNs+Nb(>Ms$4fJ6 z0s3BY0l1rxNZUnNRxP9{CvZXR#-HmZx%XBtX4DM}Sb&lp!;8DP21TMT2RlLF)TUDH z`peeD*n0$Gb<7iax6(5ymlZ+LFKT^zZ3el*Pm)pGT4l=D5_oRncwz_7ddQ7FqVPm! zWwWQZPUzHsD3Q{XW$n^7F2|ej9->iX()u|TxN6HXM;uK*&Br+*q)@=0Ca(TP6P`vZ>%EU^2@V7_hZ9;UTQ?~xS`|5Q zU$GhBJ)C)=rYUDaPa#wiaNj<()E|rXs9y!1pm0siW$EY^Do3JYMSrlhlPW*DEb1n2 z>|$o2Q^ZbuffcdBMs*kZwbx@g-Vq!80;3y?s;vDwMLTRymaaIpI4jA@Bc~}%X7lvz0cjpd@Tvg-|5PXL`W=xB z6Rk0DPsmlT1S`crcc|zfBT4j>TU7D5dm>stOm;6`9Szx3c-omI1UH^48cAfl7S(N3 zn9H7h>GujzF}u6^j{2ve;NV=!c|A|R3)kuL4#d z&Kh?qk3=J^i+w9PUHh{h^hlmrzF#4_-k>NwxF@BRN5O+ol^$NGiepIRVCx^t%H?)$ z|9XB<%AAzRmJKD2B+h6UdrtoO&A;%mg>!eP>Hj0@ALHZxzVClHww;M>+nCsC*rYL< z#H#^fiZ8u*skq-ev`)Zjl@zW=R+Rv zesREAX@As{5`o)X#b)~W{0FD~`nuF@T*{{7WjyEe5TaW-)&UyUaAvynVAY1hVjNY- zpIJocLtql=)*h;#AAOjr$GU{54YcX!{DAE31Uc^PM}{NgGo3I-q?&7Y>#l|T^Q#Ai zQ2CBQXv0}el@K8W6nvjjr7cKoeK97m?z=*E>_K2M`0R5Gv~1$53cYPB5zuC2)hq9Ra}zPpx5|go!HYebh?yUr1*&P;iIc^A_(z!DXL+#Qmsh2#Chqf zRFH@{)qiezXItWwx?FIpDVp+v(cX4V{cR@>|@u8 z{%mtTmy{FPOgKMHRS80zZwyfnn@zj#&vs8NQ(E<3-HEDMlDZ`wR~-_OLxc98yyzNZ zy5oRv8D60|+ZY5uyWj4|9dl-Ya*XKX!)hCF-0#qw)$^#@hnHNiqwshns*=#b|94U$$~ z0H^y!u|eTSiQ;KK@W`e7tcOQ9o% zlb#`!u41rBI(N`6RS5r8uOM6F#{Ib)WtRVl9kWvsjIWG5|2GExFvgfIFc1rq=7`~! zJ|BOHIRFx)Hd+>*)oU|*h~cKvf(Z2H$zA2wK}p1@wIrKWYU1^+h$xzLmI7{<$kc3V zk)1<~kUQ8Sl~PY(rchf!&)0V(ONF-RSD#yzS2QAxL@~7sZtmW|BEy|F4{)j3SdB|- ziFR$D?C&v7+dO^=61+aC$L&Fi<5~ztE}ru+a?*qko^?rL*u<^_yj#tA;&Fo&3MS>9D|<&h$DbaG&Nn3%CxRp*jpRoo5?i2L zm#;6IC^_F$4ucS31)I?S6hYshib`ROCufJ1T-ecym980f53bh}0#yeD z;=gb&c+{w&VV$a|D=q84xYy5LWznpUck7;LIqR;`nS`H6a+|yRewUhW43m_x=Y_1QjSsgqV-L)L!vt^*Z)obQc9h#IlxHQ5=I7mvn`$vCOC z{#3}zjvMS2rn$eC9+5?awDWOHGQ-RHK?#b;FYvtYo;n!)f90G!POMHA1F`=fL6zpC zVE~NwV*yn&dPRHIV1Ks>jcgmUw&hK#S*Zc>u5OgY1UM2R_0ikA8o?epqG1=}8U>mI z-Ah{>xq#}@jM1621oPW<3Gq-BT&rlbBK^yqyr@_hxp#rbhYMfYD|Lx|TKw?547___ z`FkJ&bl*iOQwHh`j-4{{YR3+34|r9>dl%8TqN>`aR{AD?C!2ya6*;8#D}y%`kz@`2 zHBl2}h0Dr=Wj!b+CIlynt`9bpH-ikH7*e;7T;>PSfXx~>%2i)yEAqS?S62|puqgy@ zwf`sdJ7pEOvu>t7GA8|NC7haz%WblmjbZK%waSlZf#N!hXlQ;r%Qy;kc(CC2Ff+2o`6$IH)tOg;l%bqstF!Gs+{MuOoI z7;iY{QIEAXU_$}ZOQZ@GE8VwjgzwxcXiU(M@=#=;2-?K#u+jfteXQ|p1!X~hCK zC3-seUEGZwJ5y9?>5M=V(OkYOygzOn$vVx>3vu5S+C*U%AtTf;vE~GMHdsRJJzUR( z`Q8uRl9=6UPD+TJ+7ugJA-Jz1A`sXBBs+$(ZZTolt3y-{laFJMfk1zO!U>kV181wr z&1qtOI^Tz)58jN2_{A4rhJ!A9s9`(4%`^#v4u6z`BUE87o7%2P03b%xW8Oo%A0&S- z5G32u=X)&e$(mHN5TSX=5pw1G`??UFC;b$UcXO)OpO}nex6PD_=v7sTdG%Swi)B1 znlKzztOa$n2?bdcS{gDf@$UGYj=s)~IkZng5=afy1lJWNU3QjgO~;ex#b*k0%q@UQFIN>}lWAA474b zi)((X%C|37^Zf^&pq5;Q;Kg}nj%+a1`kuydc(aY&s}-C zA@%@M#L&vV-a$;0Hf2{GO@O`A&h;vt)&BYKBUn!%9vkQ zA}H#SBAF2nE+4O;B)^u{U9K@iqKZ*>kU8HD>X{jN_Ip;#1y_9!NOVs#kt3|ucZBxh zI12{6>jEjlt^$ga&U}&F2|2mWF{+1|3(!0ej>)w}ymcVZAt8!%6xugF$1*k3s{9_B znx>3dSr$6jQS0EOCHE^?CMhj}9h8`br=q8C6$H|noNPq9l~tbPIkaOa_p`X&rxH@Y83qGVK==gwHV zPTLhOF2rjN6I0fo9%VydHTz=iEqBC;1S8Nn@qRg5HN!>^0h@BoXZdcx1nsmCdJnbO zZg7Ug8+lY!Tx6iZHC|L$WJjxVU^r5+MA*RkI)05P00QA^)>3dO>|`5$ti|UxE8++H zahFVoWI|k6QszoYVrry_|1KoQ1T+KH+OURvL}8i{e%xo+332ErU>bRDm36D%;!7u( z!Av@{jQ4wr4(Crkv6%am?bw_J7D0?I7_(QvGXymA=mW8&63z>zq|XKmLF^>CVh(SwpU+_nzqf|R~ej3s#2?yCn`#0^r{oXL#FqO`6amuDlT%Q~Us`?&r%vB*l z>S}0~F;O89fzzm@t#E^%5G0o5tF_mnZ#$ud!~Yo>oQzhPH)$M8aywv-q~MIwF1nj3|f+?&_Aa7yc6JA$ zDSccT6GQ%IYId(9Nae+|0vly9D&a%^0hs(YflpuF_KIYBB+%x{;ha;2nv;IDlUDe# z1|tckL$6WaJd?FGCrD6PK-f3VwF$o+Z1x1m0hkyNgLwyVrVlE%K zELo_QzjFgd|E%lBSok1}iTagwWfJU}0J?+E3@C;M>7rJ{GD66>UZhG#Si4QbX;xK|$6)xmlvd;v1NY+=sa+ zz||g95yp`!APAMA!sLO`8i2r10-iUCQ+(sPF96Ey!BB~NNm-AZQ{x~3_gk=)2&ixP z5A1S@9&No@j10wILv$GXRUT^MdJah;+>ju*%dlSsCIVUm=t(Tx1%SOADz z)}asVcr}TD1IjXK+Q@S(IYRNi!o#C%O%BemsQznJ=6+vBT?b^OWaClDSXonT-Fj01 zxmX2ORzxEcr4tcHvG(GGNonOs;v=I86O?F_228&7GztQBYGM*ue3mt*RB8*FGSNbO zqMYPhC}Ete$r1u;u{CoJKALo~uFZgn6@RQRtbI83!VsesMTrCsNg$DNJCeYhF@l=? zAy9tLDsowz4qd>59|YeHKiKa`9IaAH*>^-qpCimUbQg`0W{qs(hd@@JLBa!#*+BRz zO`vJHS6TV@NWb%gdS2A=S0A3t)kiI6zS5rMWaGK(&Z$5uRYvy~#zTk>s47^-OPLmjlQW1vw-F?<=)yoXcBWmZawsB`$n0Q{a%{Zs`Ffy!P~xs!;027C%Mfe@g*>s;5W| zsrYb2;`p@c*A2i{2V22>Vnh$~Fk!OBjsTsWrMa^Pln;c_Bw3L(-I$J7Yy&v0D9q;O zXad7}44V*pc600#)*Nw957Ke+vYXgS*7|jsOJRc~uz8KWdmChP5fdAmaE?zBHSrtb^D?(nc&0 zN#%VJR>?Drxe1QwLv?r}QCDCL3OzaH3{ia+zA(i6)RLqB!#|g=OZ*uyD8a0$nS*|g zAQXv<)n6f&u}Gp6?MaDoklGffe`72xxAR-QxhXVG6XRR3>VC>IHEX4$LK)eY=n)nc z+)@Bf;nxU|KbAaqlEdg7mNj=UE_)44QP`Xu@fs92K(zp$N)B0#-0D}N;B~wuaa=`< zh3r6-8g*pPmr57_G$k;}u@E(C6p7*qBPDU@0tC`E;pc>iZrtlr&#RGX)5_3w4<4J# zZL=GyFbd(7`h%$8VJDJ`bon{RsA4yik7K>TIIP3lmmE>4t8Y7W6dgsMK$<8v-=Px6 zvyB((PB^Pl+7$W@@oaP3+gP$=`*ax5V*P*m&WKrGl7GOYH-CB#DN~tQwe1*C)u2?f6ybC>(bwjr2#Qt{G@u`8M?RUQDvu{2uq~yx% zm-i78%sJrh`_UcQ>T`h)1RM|@VE9?H>$GbKwF7v(nk)RKor-*g$jt{#D(u*WkfzOK zi23!nIr{78TVfEI>>}zKJdEP%#_IQ!>UF7cRAJ7gsBslT_v?+R@xlnD5SZ+YO9{Dy z+*!5PVFHe^kel~REts(shZ<}=ANjzanRGhImH`Tqg8MzY5Olw$kQaw>n#sqfatIfb za11#}&si1GTjFCH1+HhL-@$vf#snQEMRuOj7G#R{q9#0t1V!$}t#Kd+;SA?F+6bxm z_;GN-k^R+;^6-2<9L0=;HR}(Z%7>%W8!9`C#N-%298eg_beB`aUDLeKM8Ra)-^$lE zrTEO>12SvouttuCVE#rEC#I@Gp;%hz#|-zNQrPD;p$m>OzI+qSuH)QKkSO#t?)1e< z*VI5zGck~^53Mex)U0Q>az|K*@6`QjOm~aOG?*kunHX7Wngk<`As8NRCINox!c9D& z08gQuSjQ=Y2)7;5>k?lS-JLD0^8X@fyxq>ObZ~}&Ap_^v}RAS96R+*#c|JAVXL2yC<-UAG*XpO~a z-u_Z?%?-qJ)nU|kV3*}%J?bUZXgKTT#L^|-So!<+jVGYX9m?J%n`|=3)0%bslqK#8 z7w6dxO%kqnnUz`Pyk~y~QWs`iqju%zyZRgij`QKYfK*;8%=Z1sai%Ak=Aa8f?=a*; z{b#Tgy=6yxBB*wf>ZAREFEsMyq0f@B8TZbg#L`E^BY#3u$80(Be!@E&sSayNS%!mL zK@tZXtO#|`qvN^JP;hGT1nJ9FFFA|@Nk!Ma3HD<@uX-1I{?B=q$ za^wd4YHn~4q6jYjdh#*~736q~B)U22@F`9?UBPN!P;mi)?{W~tCY~O4zdbxrk0N~h z@k)+__S&+fUUSI)`z~=GWQ~Yn5S9XZi8lllWQDHqV=4(Hz<`+P-ETEu0o;Iuzwo!o z&>$!3B@Qd@TJpqD#*+voO9E5$@V#J)U0u#f3U8GWWYZh=+cppgs)CX*W_15%9)miM z55hS?5;3ez#7b>DP}kRSzW?=5S3cR5_(*#XVsp@hI{qa-6+f7o1)7l3uA@IB4g{LD z@0CDRlPb}8ytL}To==<*vI^oSb@H5z7aDVacPHIy<)7%c-yG?(lly;EX8SM*Hu=3L zB>6_SdH`YIa?8_ z5VQRWrg;5B4Zpj1PJEzfl|gMFi=%c$V7d|1hns|MHi# zBYmAMylISYjN)}s4cwOF53D)IegQ9B;*(Jpj5#{F$2Y=X2rf04$oK`@N)dilL*g)~ zF6g9iytX^l;!>Q6132r*dke_f3^mQeVs7DZafV}%i@acALy(c~P_`l|UgHGS;c@W2 zop2=5%m|azBlbbTM8??jG($H&1zWko=z?dfwWOb{);kJEsa8Jl!rsYLj5(vEr+m=r<4GIN6; ziaZ!)#S9k$yd`2qGE--8L?SNPhBa9nfcg}P%)_5(L@t7zE5Zn{{`*1pxDC?pFFDh@)1%vZN|H1lf!T1lO?Y)zwl!bsccvcnn^$;ydyF>8rhvw z_jq>Z4a;Hn_{PU37wy;9W#tpUevW&>sA*$o4k=r=2Kx%2eujt0h65Qv!mJqcdyigD zD~WsURD5wW1=fwA0Vy4*WRR41V7~@$b!)$=6G|oFSM?M)C~6}IuF4^t_B%95KQaGo zR#q0ON{&spVdLoRF>U^js?i$wpacZoWm(FyJAY8Q-`jWFc|M|(R;|^1UO=o{^Zg}p zc@AyFoN2SYowJ5daggD^f%J^_c(1r!TT{{XHRqIhALUOU&excd=DWiBWrT&7PFKetV}7L0Pg z1h_Tv+R+pkGKr5ATu8H9HDe8#+Ve^LjU(SzQH7{?)3#xu1lE?j;C#qIw_|_FHi6HM zdgb_FN^51<9Tq;lQ~4wAUtcNgiZmMuXWY0;KP^^xuWL=!9zwTVJzuU7 zJuf}^GOk9cnw2MW>OQBM6Ckn|i(lmtQ(t5Cgj;Bel*@&?^EbURX;t%$lbE)C_ma5+ zO#Np@70+wddUGS?2WP)^wD&jCgvrAvzO46}icyC;9}yM5>TSz;BByUZYPd3O z?hgUIYoWM3m@iXiQtX<1S(q}c2|LA8^xx(5D5us>Vi+JSD^%y%GyT%B={&f%})joyKz|y_h>mp7s98<2#;Sq75BRJdblp>5#=f` znX?MPK}X!Z_|o#%`^nLl&hl&REHFsyHb$V>ir2Q8~* zZ)ts+Vx0UHpS}SPY2%DiE4PSWTo;lid*Ww4=y29v=f!SFmlVfFK=MqR*sfMllj8` z+$wjP?pV|Rdjko+dq!ovC%e@he|4Ji>Sb-CY*tQO+_a1p%wO&Vgs*L@z{d#(8fH`$ zUSimf$AVn@AKsueO=B8GlBxsruKk*i$I>zlOZfQ}NBx6}{nWL+@U^NQm8qsch_=Pq1TY)1LR<_-xf>Vq079zc zc%fQF+V=K6e*FjZI2h=f*Vlp>sb0xauEq`Z2riO`6=QNG@ow$FSc!h@7=c_E5|ToU z{!P2I=aVx#-YRR_*E`>keoLy#CIP37O7LPc+hQyf`!%Tl0nL-DZo35d z7lgd_{y(61l{z?32d>knQ{8L`uihItJigeb6c0Dx@#q!KS~+PeNJHJ|K#k61ZrUll zzN7V09T=mr^islwjs2E_X?ax1uBIw;ux)BTu3fVIg%7UE(kI9_yNI$VEsBs-!k%a2EMTWnJC%kQMwyw&0`!*nqsC(`Y_wr@ zCXVhemV4vWARXZS+Ft7Z;*=K#47a5)r%p#+AViC>Ga=&LrEozI>X7NcwMI1gWBGVy zLJC9(kJf#ufh1xR@_WqmrFEb_Y|19atDRa%8DFhf6%1zOdt6nWt(44Df@eKv7wTM3 z67se0WZ67LImxZJEb&#v28)a;P-auyDrJ0R@vT0GzS+>;{aGQ+J+-pD>O4q6mfd_| zP@yogx}Hjo21aOYlfXR#1uME`gUW6W?m)1Y%``IfOQAUR{*8%Du{v<;d zcLD$d638E{o3=HT5AFB-3+e&NGTY8j6)Q-yDuE3KKAoe$*(Ka43{6ha+TkD}p ze_}iM$|MLr=i9%`V0tI*^X31a*!T_>8&X@TUy{V%Q~MAFD!6K4y{2%TrN8|)`MYTy zZ(Mz07`C$EB8JB$U|MKPeV8C!HyrIMOW9xc zO3PL@X6L4#O;YnptK&CdQJ$Z|-A-)MIcWQnLx90g+7wfn^1Ga%N}FderYvg&;>8rJ z2lx7xxueJE0KbZWaJ=I{wS!gBQI@cM#0EMpRg$j9(3~M^|KnXfAcV}%iFk-`jk zF@?SVgF5VVtE`|s{7c--#f`C`zP>&QN5r@trCA4wvMUo-Txb>j1A77k6ma<5cLm29 zN#Mj~mY5sf)Xu(q*zQiicgkQ3jWNEaZuIEpC9gn3+IP#Kt!{90d0}q-6v;a`emPX= z%asa&A6&?cno96DQ#96^j9<4O;LWCo&Jm~of22M5_bVb&DLG^{JTeqQ{Vnzf>-5LT zlRP81(qj2cWq|z|40z)*lJyy4k%V!>%9yRgK(SYDpPV@R&Qa^;&bqwNfw)zX2;hzQ zm>s7;N9Ug;D`qSdSUpJtR$bw&u&ocwl07-*4nH3o9rneDC>IJ+Dq8Q8+5LK-P3_L& z;maFptnG}2`RMZ>rADDV!~3iW3xBxXJUVCI`g;m1E8E-0Ex1;5P~*^ail?ldIueEJ zJG^t;^^tk+{JX20A=?-Bt@{60r#Whob9fJJ>b}~sMnk{q!@c?_ey%7kZ%4LeeXFjX zsxBClsphHvJBeN}g*8Xoy6~gEsSJfRIIz=gaCnEt9!$2I(Q1o34^Q*_p1e;l!S&+G z%CdUEl;!_%{gNGTdeSr_JG(&?gIU!B-P(=>ps3JZZr`D+Intu`Lsk*e8yHnBs~7`bA5t<|ungWR7q-v?#RhQff zJE#JZ$I2u%>JT!M8=|aVZsN&Z&5JBu*jv^uVo9y1g^DleKXO?M5e4>Py9##ucg`#= z+h2S6UDPXa8`-@E2_Xw(X&4B-L8DL>^K?XT0hp9$qn1< zR}|Lr!81O9nEkP85ObJ?m$cP zq_JE}`>{@iN_mecz}j|kMI(S#$OP)N8LA1pU`vJ-9}W9_J68p}s%OQ?#0FNbG%Ie; zv2pH-FFRM|m58j91Z)`%5W1}bUvFAHkE>I~GOMb?Nc9W73`9_Kdo>pRQzl0pqaDqJ znY6QW4IHT6$>U(LO$!#=DH(U~lJ)BGcvpIhR$-FG#id^uvHmlSQ4nr;ZjUtUz>7lH z$jer*^^l8xYE!kyBpp|?=4Pqj{yoExVXRo*uURNIhUWEB#dEtgN{q?!Bb}Wj{dVJp zN*=!Yw4mRv=O<%L`Y3731vG(wqDQe%h?rTzzwrky#0+AgnFA#f8v6++cK4J#!UJfq zcf)efCQUx&vYE-c6&gdS*3Kh`0i-8oW{T{9<6~4l0LxaU@hov1%%ENWt{m-x2naDg z(QwQsQ*SXzu3!#}SQ>qt+Utvl2j44~ZdIyIjr{rCx(I5fF>U0O8V*Oslx4`41T%n8 zbp#txj}tOwT4_GSRPGftt;COgiFR!uI}bvcJ901il=5((K0tfh@6T|XkxNu?Y@-6i zjF^(Bo}b3Xo%e@LtseLE+qRU7;GtOh4CaPA){0m*4%-r5=4su!!ncRkm-1TCSgkE% z$pbi>Y)}%*O6Y#bTd4A4bDKj^WnLCosHQ2vxg(9RpEDCuCvOm*UQT9mR<@Y?w3_K# z(kBnd)RSfy) zoN;=ez&X1C6w$f#Gg^nwM?s3dGPR?V>d}pYXf1K~SN@ADQrfkN0x45^jo>oB_GT;jBuu5G(fCryMg>RUj36X?O`Z#ey_V2wq)NG8`lita&O~gvkb9pSx zQ##_ih)VNDZ;|_opu>kaZr2V#(@4PX0O3EdE~i?Ma;}g2!JaW?D5wMAmt^|_%DY1z zhJzjI!1~W=eyjRIPf`H$AN_>>B#GCTm{rvonXPO@Odlqm! zJYWFMN#Ce(9c+LokB^Ts?oyjh9;}JTLsae^sb}MEaB51qg(|A7c`;AY&o!M3+k~Yv zB#(miO2V@Q5-T? ziobLu0$}Qq&I4Qgl6pLizP)h~w=$Ss#S9B6w?CsD%V&Y|N@!9;MA{<}wI?2=&*6P4 z4vfp?um&$_LJnSKi~N8e%inmn*5-~bCog6!-d?{D{lJwTTC(p?sf^nB*w{;yyoi9v39^T2-ho5_=AP2+cun%biYCJ*A{ z--cmPF|brYcKj}M>m3-yH{#s$xGGH-;0|f?;E(`oDj}wF|Jd`%FJ1Sx+rJ8?--Xj2 zRS>8i!!vJ<3iqC*o!v}>h1MeN^qfGe@dN1CNkee|Ms=?MEh}Q#!sYO*8CH??=4)^e zIoU&%_VI%Z&RVnIcc%yqCB}zpB%{CM-Vt~wo&nW z$#zx|WQ9CUHr6egAKfFeP~((?#LYBlB?5jZe5`ecB7*gMBFB51jLa8?;7PWf`jCR# z9gz{qRXxZSht^f_b#9!>QINO>c0Am+Zfr?7hIc0a1GbGrlsfo$TLqH3&2|-LhO6i# zFF&Jy8#_#Jvq9!m?)n$3Y~IxRG~Yfy1lI8Lg#7;}bZ)>x=UDasTq)h?zkYk!>jt}a zDb~4k<9J6^B837r%Ax0oh|uu^h2cLs@p=X|p6dskU;q3{pA7pe=wH&?+S^-h^OPti zy6DmrP+?OcwzRM#wk?+E^3{OENk^Whu2GzHGlza}_;F$m|9$piwMn&{FlE zS}$#q(aIcF=6(Xhw`#~!hD-o4v4@w&AB;SOVIk8G9}UY+7rs1~Qi?_@3D>W5;IA?UI@Diwn!t$4!tYZ>q}R9vnRUpUyv@ zDZOHwWGcf3A5JMjpLy)j&2;O3u2dh&!}onxcK)2o&mMhKtg+ab-PWW`iFF-ryu7*L zPkpZMas4hBV}2J}6LkKZ+E%x1m@CH3znXVu8-sqSjH;_q+*380`~d#OrRs|(UlU0* zdTIC<|6khsHHDf#N7wV$QANOG@#Llw&K?(X`>@p4i2a(ITunIRa!M$>f8I$v!Bl#nA}j z?fCvN-cy#5IOb_caK5-Wv+yy^VBFECWZ0p(BRpKAE&DnlfzIHJEn)JndnXpAL(|k@ zWUCP6URsNLd2urfo_uSwOe>vWqru@At3LJo{Co=uK8Ta6Goy8D4iLkh&w>?CO^-&5 zrrK0LKIQ;?I9X!alS4u4fR{*$gUg1S)WJ)f{K_olQGykfmS&Ld1%lc55(3sjd)Ff} z{Oix)(RunH$0|NgR#se+T%(hI#PGar$>*lT0L-EdtQDQOg9SS2Z%f2@vYqa1a`hgN zx@|Q?r~6v&TGdvjl6M^<2jC=T)ErbIQ%|>+R^$)Lt*8D^`7cBB5Q05zp6B)dJnghw zg4-{+Oj@4Jb`I1QR5Wlq&=UZ+1Mh(&{Ag69NH-cS1{}a(ZYn26`8*ljr^4=ic}1gL z64NWZAe>;hUE)0S_eJu??`xq6$3eo*Lj}3l6niz#;LO9MPAj1IB(`uOE|eRf2J)eq2!OyxxU%e zMDTgIpU2Alo6sbpI{%B?fmVp~%k{GmvKcTpH+TH&t=-j!dQ zKmkv#cKY!^4SFe;p^?su#hZYjAbD(cmEg6}rz;iz3Hs5tqIZcsg;?Ryyt5-m8p;$yTn927L0j^O>PFwbKzX4mZtk>uobXDNewA_Ja1lv3!u0?P z@AEPLmD#?>pwIf*U&fr@8xXi=mCm#^hj*#a*>GV{ugi%oKk9MeRGNGu z0{!N3{ySW9T+-y<^)&%=kC|h^EC(;Iurtqj9ua^*l#`oRn2*of*Z7D*=^JgD^;R60 zw}<<8j|QQQETu~+w_WikU0GL$G9K)h@N@T>)lXZGpF$*zID#{8m_K*^^xt$qe@{zU z$US!)Hmj~gOAt!39{rgfiC*R+(!Km__+5B=eWD#%J~LC~_r{(|(`e=lVZyKwJ=&&y zfWAv(d;8j~t*(dhrK3k|tmjFS5-)%wHl>zS+$eua#?^y2H(ut+@Nx#@{Fr#nac(D+ zke7F04hg@d+Q9y4tcJI7*eZHBwv1$pH+xR%!;9*FU1IjkZ(WR3Xn6tXxaC${43iq0 z|6}qQ@$u5F!^b=4QfWlhXf&(tB;K5p8hn0ZE{;q5IolsmQj?MnEsxdFr%){cf(EqJ zH)L&zQ)Fk_ES#v*B}5D4?qlHLrTc#dA!zykG}8Q6@S%8f`M*&Q;rutz>8%O=A9*(S?P9hqR{xgPv;7zAV@}Z@Hy`_`_&zRP9zwE( z`t+yXC4KCZkLDztnhb@V7mDFe;dQQ3*bEf4(uaB%6Pdu@D%W}|bgAMN!PcRRbl06~ zJBeRn&7@cMXz9-O6!ge71@@BVCs!ow^~64k1Rg|G$vH+UMA+T7vZEn&W2Mh;seMEM^2NU{Zm=K3hd5~_4b4#d zVoG#c4(Us6)Prm$N>06bwfrG%OSQ_Z{Tc4`L13(jESWHaE9epSerc8{ElQ@%2no${T6ks$ZJ*OF&FOHBg0QACR1lH-Uq@mum`DLD_rjyKyNtqUBD0n z`5@sy|9~qs>plD9Gj~41Du?^%%sTthXP^9}&n&{B`d7%ocTJ{z9LyT3qA=gI_v$Y$ zO4hIN477|7KSd)|qcMLjRUoKUf!J!6BQ+X^t?jT(#)zxEv0cTe;(t=q%L*{OE}EI@ zdXe4E6ff>f)Gl@o`y8-E9+#;$%oxY+YY|yz9cA-vu^5!Um9#;(pj3E7=@dRzdQ2KV z*vpsu98ExXcuc4+6-d_B@&(_^Uyv@roLz~`JqExW__$u-Bo_qKbQ0COw0bgBV`ckO z&_G-ᥪs6tEe%9dvH<)?^tov`oANA5r?oT3fAqRmzMV+r(=yZ5O;Hj&kM3;14^ zAV@s!9FXk06!b=Iu2k+yN%)OFksCqCiJs26`Mc)L7!0Mi)jXd`pIWV@x6ua37{0l; z_q2W!i|oJ^B`j(Vy5*`yPbr23{`%CrnM|~j7Wr~B6X&n@I8)ycV0fHvZ}Q!>fv0wi4L&)N)$oVQU*TZk zu3P5mh_KYZ%AMM2ORE#kS}PNATD{^T&CYuMw-e{5SwEv6omuZRm%kXwiZT9VI;*%W z(Pcj3*7I2Cu+z_~;`ILtmd8w@~Whb5)w%jWIr74P7nW9kFtid(7uX4_wJQ1&K86&Ge#C+oR}c7MK5{}xoG zjE<1LKJ4y@ea#hs!()!#Fz3}WyL>3Zd?z~n-HrK8^!`QKDYRgM=FzqTUm*E43wK3( zG6i49U)!)TqCO9e$zedWLI&aSU#C>uJcF$+lSisa>nqNxFJ@OQ%N0|F%=Xd4r^Er{ zbL1thQ{WS}>s99Jldr-#t(pVw=g*6=gpI_v^sw#;NFov}(Z{oHy&WsE!wKMs%&$Cku)Glca7Kd8k}1pa4l07V72CzVlC~ zf7O8rkUcu>t)vyTG0nB`4|MxoGaV&udE)lNd39Rf#{PLHY0pru(AK5H(3cPU2mcgQ zUvK)FazIw}fsnUx{dI-Xure+5?#t^pq!P9mn2rCBxVH>z>wDTp3$&#L3Z-~)cY?c= z;_mKFaCa?Qw79#wyF+m;T3mxuAZQ@KNq_%G&Uxf|-)|>b*;zA7X6D|r=7OCiia~_2 z7E!S{ma*a|S1-w(!^o+dCveoipY1UnZ}W2co-;(7u9X~{u6=)%bgG|H()f2LpFzCh zN+&Q@?DuXzTp=2a(jfkfi9XBC5mtnBI_d*%V3P8{lIcZGg* zYpaY6&W`;O^5qD1@I8I!j=jIw6V|-_&(B6;Pr_gDS892owy&D-F4Wc@F&5EnmWi`e zt9Ft=zLb9i+R=OfuYEKVu1e8eP{96h9&B4wjhkqxuUp}Mwv?bCx4sabElW)2cBALK ze0yNul5gxQczM8_Ifsu5^80vU(R%`Co8BqWdp8nhDdZIAeE4GbgnJM>tYdxf0ljP< zfBK_BX?BN8*X4v#+KbFWQo~O%t7Z|%+I54gMb0qqZl=b7fB6!^?X2J_ZC7J#aTmi` z4)8^@46=5s?MFSM>4&CXc0{Ozf0hM&iQtX!O8En~ca0NnBL+BQG`~^_DU>xD*X{Du zr|ItjlWk2Uc?Wjjy0cAHtubL9k+#zdOx&aQ*Z*uy_t<0nNq!QTA;z}y^wnssjrGmi z&0$VphXz4!TT)i9hQlMv&~DWEE7aYx)xevr_mOXh{2E*88aX9b->(g}W;n)Na&LAa zxJ2-%Fpv&@QfA0QnD)bMjdbMNCD?V`lIM2?)DmT8e5ZpoHS#oGTy3T)VC)rKd3R`StGy7pQ_$f8SZiK=s{8HcV_|;rkT6g9p zH^rWZxDx~0aPnx~1c7yiiLLVwDGzFj1CoS`e`+B@{*V>}EFO?%257k3zVrR0bxh?D zn&=`hpG0#8gc%uG5gW@IFcO5y=A*F)jxi478jN~mUaCc%e}r>%q-lrH;-+QLq^jt-;D#?wMe1WLf12Z5Bul)&S6bNUwh`ezqnsLe=3FEG0imsp z6Bpe_Ah$+4^6g^o3Pozc1p0owk4q9iik*RNqN3mq8cNa$$Y9nOyl7wbIxyP;i5jy{k+17EAO0SMOZ{Q7mR(Dlto{V(nnik8>3U>Q*#1S0&{{l$&waYWVV5MjLeO1LYwPj_R(>#XihAN z0*#CeHE~PeEKw^Bmfx&>!Bv0y41>rPOr?2a4K}B31ADcllfmQSy>BJTTu6)yfH_%k z-g^&b@qWjhKHT9z4A~Yod6wq}ZUiWEW0kl;gA<1fLbTGBR$DU59T^uhXS~nEK7Bxy z&r%=z9rF0cSbLCJub!)Q;n-LIpscI)Rv!IBS}?wbAhJ#HKGg`tO8?nn5&&Tpmk&~% zu^JRL5LM92c@5V34@GLtKoY%n#a&VVDsyYY<9G8w-^Lz7H^iaXgkKwK&2o%jrogb% zg?wfft3Xc2INQHvuFU}Fom#9zD>HIjuNv(97AIp5pV@0OfPh_+U1pP6#u2CfsDh|n z&6;yWJ40wp(n+AbUK{c~=N5bYas>!=Xua1PWY>mvwhsQ-G%_F?%iNW69>Yo$lxbJ_ z+2FO{82|8=&^kDYo(sWXfKf#@$J8s7a)LEmr%i5y%00+GV{QBz^};3r5f7~jitQ16 zslSh>2VuVWJ%$!=$1-j9qv1mZmVo!*m_%UB{w>+n^tUPD=bK&%p<%G|4+Zwo3E_Q~ zE#EcyS*IVjtXuS{-RY|qX$?Q`F}1yZU@-K4h#HL-uo)$4HbwKgeg%s`0!}%SaA<;F z)E7*WhkdQ#7QsjK>QsTTEC<|;$HKAmPLtAb_uMU*WjLPkM;K8hsV}_8IPFT~taBxJ zIU)N3V4jg9(1tfi$q0@}B(@8zWY-p|1I}#;8iwZ&@8I(oa<2{L%O&0JqThT&6ryn+ zVCMJUCu+4u6u_5zFxjheXpP8DJK~Fb!xrfNMVr{P`-2B2)VKD`wpW9>J6*>z#?8rq zudOC)3;Ol~xBgQ8Vs5=)#+KT9UjEt@-y!>m_PRSkz>1nb;(}q9t(9+toG>^vxF+xg z<=YFB;m-1)yL(>N1?H~SPzi~DiqBgCRHL^BAJ)cGeazpPka`85$5eN|@`yU}rC)+K z7~xjcHb2)U$#SzhHb^zShCfd&2NyB}+d6=D~BCeGq}exip^xu?x{)6cjs^b(`k# zfX0ci$v}9ze~tvPpq1dBZb+ksM8`-}aLZbX6`H&f%a(2U3_pjtUVuyfiyBwqQe{ro zVECS*B{4PIqO;c{?ow;$U}hKhpq*uk-=r2waq-dI3Iztt1r3=CinAR59-E2HwlBfW zBXfI3phWJfVALfhbF?GzH3X9xl=j3Qgb30a;Sc86@q&EZVs z&(DUH#C%D(dv$Isd+8Uv`}D3c{q;sz*BZK|8A35p?3exVy@DUk?^5&6X@&=tM%sux z!jD+$-gpqZ2qHb71k{+zkI|)wB&-H_lfF1fa=(%F^WYKk=F!=8;_pDdXWj2i*Qo|| zP;95_Vn+AQ$xioH#P-2+A>{PaRGU82^DI{XgnrU9<^PW2Mrn~mzig~wy!bB1xbr9f zLBKE%UvxvJqvSn();vqPk3eh@nS*y^2| zL%ICUk2+hl#k72Kq(tZN-JhGY zc6ic_krjkNh`nrUg5#+}e#(Mx zvlB9T6rA??N3Bn!_IcjhzE8oOD^+j;u%$LhZN2ShFbeg~G!n|(_Ooc+#3NdY@*!-= zH02*>WDjCHMQF&3w&1~^ChJj(Okk8$aM-HPYC7EK*>%I|&3jmIRC z?S)<$**X5Ht5SuaE6y#I5e-GW-hlzBD&{%Oe}D?e!GB1YJ`#~SI<@xPgAQ(Jv*PCBA9vf}Q{x!oI42bxXGIEUS^%H3mImt%}HnOv>8ld$I^A7PH{&16aH8&Nz}oVFl_} zBC;AO2O0%UkOfOyKMw5-gXqQm|2y*g#@FWh>qOx1vHWER`W1Xe>hVUpc79jYvc@w}+tJ5qWPb zXO@2NKirt()4Qlryp6y)X@_1PYuhe6AlPhFY{GCrY4+L4rX+l$bLu%`Y1#j(-O*N` zt2*5k%5idUy*Mc&XQq$(-Pu?lbFgqE^8LKsC2B7z%iwh>&3B$&<+O3ew--P-_HF)^ zlC**7WITRi#HNJRtCz6&6?G2h$e>m>@?;H9>|dNw+9x%7E_oE9m9ms=O=t=exq<-} z@?XLzVgFO?F~Vd21a84Uq+&O$?PHsiPBSaKxAh$HM>|ni!E%UQ!Tu@Lm}FSx?_+A$ zh@Cgb?xkm}CyBu&h%v3Kb!-&1!gzaiWrx1^EFO55cP>Rl3Y472B6W>(&7qTtG{{xC zqZB{JezMtx=Z>vS98{|s&DJt(u?$=TMj67nV=p7gkafz}Q@P6>`$ds9(|KZMn#{a> z+_%FqeB~^9E!a5Q>IQcXx)p9DcwMZu_Q5lVreMuWaz26)#q1kMAMlaEwxOWP1R0-$}1gP zADNWKd6eOs>thrkxmJRE=)nucG%Sd5Y28M0Onvfbg0@UxQ$tiLc7I)KpRXqhjNr3B zS}SoF+{Q+v*j?xKaOHEn;O^HMa66kC#rq?ji6!gdO}<{j;IDAT-#0W0>RO_hyAMw{ z8jnLQ=_@f?mnQPyZ!m}}8Kf9IJ_6go&QlWG2)QcNlELr$bP!M!IpkOi97Jt;mVp>X(exw@%r}p|*vlLv9J-?;NYG>Z(xHacNBV$V@3| zGvpuh@0(G~&ZT1H?mUUwdvCQ?O|0707?kNG9JBd6n@?&aQC7GF=uJ7#~WNbQNECsTh? zArePZ_o}VmN}R4XR+V*@HCFG$S!g`{fUuwSV05h7L1?JGS+J$r%V#jdLSrde*^@(a zFK#Na%P!)eF8)2v7(ITpU7Up&(GE1A>MGKbb-|x=A2*eRs%}dg`SSqSEq-VdsdA^Qo|m9 zMIL~Vz^-S7s>^kWQ{#DWZfihS=5=H|)6_Y$yug(y!|a2-HP6ftaJSEQo<`4Tp}wTt zXov-A*9VX9Y;Z>lLmd!n&1P&@Z9iR2f%k(NInd3sOO$C*O6q6(Yvs13W}`uaB;Ug| zA4gUpC6}H7U(51CBF4$2@wXJUp)29@!A zZx7VzCU;j#<1eGF9ror!zJ?D!=V$XDzc|*lI<#wYvkU0xy2N5lx1uGQUpcq5qA~6v z4=zLdrQCtwbGLncn(S14T{J+sZ**#c0kRHF@6Fp*&b@8lL)HUS6g`ASTAMLOxrjBqn zoX*jt!M2EWmT|np^01-vZ$D%rG#FEu-X1NwO3cg48U|7rW9$fgnsdC{ZcE$QAw$cS2xLj3_9_dOz&VJ-m`j+$z=>J=KtIJOH=PAr{u9#A z4w3O2>gx4dlAc7i(YbDER4Pk5S_Xdp$ZOQiRuqyDDU&`f*N?rX$&2u!BPht$#Vz*q zCE5JXGL(nwdRTQbhkT$)>ku0An`j`xI%s@4%Q;7ziOGozqp0osPQR|_Yh<&oG*8F! zMt+rm&7ADelXx^;Zl9e2S?m&Yos}r`&12j=Y+lVV1%|3gmJbXDi(cRzV=d4EBGpIM z;YcjuL+YM+Ig~K8+cuLw$u{k5r+;jwXZ^VnN~;C=zYU3cd-Hx+OFMRPH|K5VZMSNX zWn`RmZ)wWnai$W~NxT0(d-{+{)9%i+H~oY0Sg?% z{C9={%@4Sh4rM8~<~LJhr-l{!LOflyt$S0`(>Pb4M&VOcmEvEs@HVwA>>9nQ6Ijy> zQwQjkRW=1|Dsvbr@8s^%p!pq&x|xE3wGkcb12U=NvghE-L9$}UnEXQzbaGnt{BJf$ z8tJqQ?G`eMhK`=b@P7o__;(jk+7(TSb%NQIUyJau$jR%>i1!={BAkZ>VMTym*Y+X3 z<6;aL4f+_3Z}Tm)l~+*C$dVl~&smf)FbwCmcLOkU2`#1asrYz_^E*uZ(@3{=`KHeNm5;gDf>y%>I@4Lb$+%2Cjxm|G;<<4EFAMTh4i?J>S4b=ZTvy*J|! zO4(NTE7?j|z(HzC%JE18VpkXWsMn5}<5U1<0kMry2W-ByO0Yk*iZ{Zh`f12h`WZvw z6;AgHgh2}wwzmL*F~nL&KHBGSeWKpElpUe|c)%dXPo1+lnauUYAHg(=fPNrd71aIJA-+vk>8FgJ=1Pps;Z^zK^AWsxI5+vi>=9JI z7*P6YWcwKy`sr-?nF#u6bq{CAJNv1jWF+6Xy<5U-!^3Ihjag11tM>xh%7voZF5yv! zm|DL=R0cWYFa+{7Y;gEQiKjLZxQo#GA#MX|p@T%Y=76b{Yujl*N4!w?j{|}z7JPI} zI2z$5JJKvn)t@wWUpq7Q45V+dfhc-{Qn8o%a@m+i2zny<)%+rxP!RcpuFiNeDRLN| z#rVbe)pP;bRM||~q_BhcD6<*uK2D=^MP&SR9=!T_1^fLAc`)*4t=#4*gEWj`hyTj-6xdedvAhee!*CtA>w+kA{!J8g)0okHnA0kHU}P4~`JJ z5SCDo^Rq7WD^wXO%}?XU=toZUsRyeEqX)Eo^Fg^_o`OT>?I=weMT2QvWxQOy4C*Lt8%4`rTxYxjSO$)kCZrIX zmO-qrbe?Xouyvk_ve1o|wy3aip46;Ro|fKKYJHZImik7rYt{`IHcx#cgD@)(R9vAv zOAakG0>-kFoh6AEu>f-#4ccXSNeB~BrNWBHXO)hej*yO0U5eP5^eFWh^~m+;K}EZ> z!KyzZW(!@urpFf-ofIa_MzPaRN>Kv!c_|qsBWL3q8M2b6BrS@ZXA=skWnRbx#JtK~ zx~|!ej%L{kEu^R8vl-V(1SHy(+NHdzulbK4v&e-w(tvnkM7eUQO4ZkD6vr3YTQ;e{9e^Wn5DoP0s2Rwn*D2Y%r~pb&0gAd6ir<9j(uL7v4#q zCu{)LseHe*>pkSUgk6&!4b1k)5XU`>Jd|Fu9PQ3h7b-~S#6PP%G+yH!HOw9qPRkhl z=%(?NYFBvx95EgB6ai!m;=1XcVy`)lPG;9<1!lPl?WH&4yBXK%eI*{MuLX_-j~-{y z3W=qK;{6!b0Z*b2W!G#+a7PETfIi$=Y5(|V1_6dA zF)z`FifgVTC7>8~J;iuESw+2kbv)N-2FS`YvJ-Z8jx~t)VO+OO*e)?+&wQC=g9QJm z#?ma(Cdsy5&uv8hp+a?;+}kYY6sIN;!ATKylo7Vw{fJVVTFj_po1FZ}nUk{oD6mar zY9z}^{ZD)c$kr+5`B`a0-d~C4ZX5wD@2R*!d7d1$XY^prnf7dDCA&d=o&rcf8$kq# zfQ=qbh#^j}6D?DHiuhrt5tA8+_}h{Zr%>;G(@mrXVSp3)84aj&3VZy29PGvO19IYV z_QX7;^ph3FE%q9~JP;{x0?0ouhfGMVTi-7o>H@(7vw+V zAaB6PAe>P^vH@9-YNxng8ngyH4$>H@NwiNkpzP81i-u}LT)`(Gt`Ymh7dgKKs5yiY ztOIHpwNJ5++a%qj>rwGbf!aX?z}}#{(eo7h1R;`5CV$0lk>?*!BgiHwcI1WBU-dZ^ z>IlIAQ-c&nUugZcpQE5!5NGfK2ry!h*h8^N`;y|50^J0sfNDkzl3pa9)1j^qI|va3 zAIt@^AKgqoPwFA}*LcqM$$|Pp5W#35;!&aG^Avxw7uDx9XaLk1f&&JC3`Wt$dXoLg zg(zOspR=Ie5Hv6`NNChQnK=1{Oo;47?KuNl+WE}|KwFPFi4MS48cZsvG>AzeV@9BGC)GCHwy!+Jx@A%H8nhbpOEgP#o}gA%Qo&-( z#C+DWOvU0vAcz-K$XYN#=PWIirXf#@JeFTy$Ut9`#5Se{$^=t@M#p++6qK^db!+(L zJlnx2ptP}uL<@Q@n(4mcGb&Kq*j3^IJwQ>vv{TZv4*UsJG&Y{-uclw!`PH+?sR2v} zS{SoVT%xN{(XZ(g_ACI~k7Xos(c3F+ly}N`b~r_XQ9FV_9SV zwC=PoRX$pf2(TK+Ke2|^K;w`4AEoX*9~DS4*cPM@;u~{MI;Xv(-PG{Qg(^bgz$PF+ z5cQZsQVuN|4a|A-pvsUWa4y&y#5E=|W}mc4+oSQE3sr(7fGt2qAix;;m_bqxZ7dyq zxgw>SI+mK6t5s6F)Ow|Qh0c7HRkU`+VwqQyzO5qu0#%b1N2&NiVY*tRm6~n2o@=SR zP0m`m1Z+CjLe1Ox+|SB7^R=Iq3alzVtL$23q${q%>MGA!A#!SE{WfEO@2X0ua#!}aFbXSpUZ8BMwBa~YTlru?<@j5BDO1__G4LkJ zOI@HuP|COd0dTA`UsAqwrSLANSWwS5^g;GU>$qV7fBvA9tDLKBS}mtU(7-qF;p>gq zapXcuDL~Dj__^Z2=?3eVej#H)qpU{VprBjbH|xRc=EE`mg1^dUVYilVL3}Z|sBqjqmZ}!sbas&p`YfH`wjWAe<`t=P_duxQ}Bb- zjmoiqd5*eJfuH(Q=7Z-A@-fZ=pv=AerD&t*x#hv^hW=P%;YF#Z*iWxZr%U1~^g-@M z=eT9Td*QrvQ>~|Dqr}hPDeyt$M&dYj;c+3SR7lOgSTOfl_bKE-=0@W<=(uKKvlOkY zN6o+FS^p{MLE=W?IAR#sj4Pi;l?zzhf~7&AvrC=tXTNWPO0K{ zpE@}uLXAzkNy9pGTY5c`XaVooO}0azM9t*$5`o6TBWxSlk_s8D^5Xz?#zY|?6j|F< z(OP%U>MHNMv5}WKRgY(xtSaH`@8s55Lj8a=m+{~Vw3^$-&XqZqDz8r($1Jn=QeWEF zAJ(0vCjOofYd?AK@6jn8326PIZjx5DE27tHtZ~zh%d9L- z*Eg${l!r}Gs)?x}DE z$;#K7x%mVJYLvIXlxPUiM2(!(siYA9;!Ut9(a z)~jHhEdILi^7M%1_g!CXgZcm+fqCpgVtAG@yUF@vSmjpT!iA%>-2<+*g<z2&!w8IhS!vTH; zpjjj6FTV9@W$t(tS)5PwK)~peE7Ov>i3%+Q_V@OT#1&P|qn- zRMW7GI%q8yXwuC;Z?c?Z#4g7Hzd;J$(Yn15ZKhw>m)k^|+((CKBszyBk~8kMjMM#zgJ>TD$Nw*!j*JGwQ!4SIz8i}dgG3Q&Vyy2alN^sPR;$m zejjC3lUJ*1vDNM5>{7wXQ~JP3YRhQ`WA;qy=i)v;eKg)b!e_(r#jB$y#%;tmxQywC z5=BfduFtVqoix!biG9YI|^^eMiP!&Nc-4QBS*^8#9vuv%0m6@aJ)F87O zPk*VV+ou8SDdT7RWAG-3LH#X{9-iqH7!vDL;FXyuBrMbQK%ty2$n-0{W;Uojq4FWB z_+hQy$L%xB4tivjB0Bw-RjwpTdW;#|!fH|R3N3rUQ|Oen^a*2k=f+NvT4ckjVUbiZ zovOqmU6O9m;-6xTvX`3H6SSCu_H+9?sS>^{1>W(Ycfnm>se@ZZZqHV`Rs~eXOAJs& zdBy|QrMHZ;D*0r7FG?lvMbV0}5>idhyjD13ubcaZ0L+^Sp3{G88ig_Gl1_ETd~3SW z7d-EVoW`E`n~Bl%>({k&?~cdyru?1<1+$I2$K~_K?(@5=Zu`5lY>iBn@Y!$_QL6l? z$XO}TRPwWZMc1ejV@#}qQrr+D%uppsz!oKs!P8b=-pzMzr{(mnXR~PxMJg>-=(YM<& z=06^VEB{M(vWYxn)L7@Sj0}Nq2Cx3?MkO0xoT_tY)`UFK8e}q^(i7HhQ-s&m2B=)T zW@FP6;PkWfDTh6rxec}2)@1a7w{w5bncF*mI&wPUV#wZ8!z`fgTl;GIYyt5~1!BCA z=TrBJyck)91FC_0KU@XO`!+{8!YRO~_QpMrETpU2YxBOZKk!(IJ3DR|>DuAh;f5SS zzKel*%g>8&CJAKM+yhkH9YkVkbL=s37YBs|VW#^sv+xP$^$phsg*=(4@k>S@rZS8q zglNNA6dNH{V#muT1<)$i>=10T&27(E0^RmrsUAAK`n>0g5&-{r&&h)g|EA@Td>4@% zy8fhTRPGSaQ(W`L-=Y{jrJ~d|%iC0=THOH$6zMfnZTO*fH*$mnI+$HY}Pw8(ru&BTqNzPfK8zA_V+=rDwuWH}OwD1O4< zew~FXYQ!QmjAXq>qDg{ZRi82{7|wmNH{&3z$&kqQDS2GH$%m5QFo}eFR}mH7U1{-i zDnJOsIsjwo!YGAa>7#J5C4Nm54~|o@(`Ov`2n=@- zr4pXew)ukr6tBKZj#hleaD>1Usrp_ZxD!n`LYg$w&)UPBGs?ys+K)*_uOAO+TtCZP6T0j&0awv<-WxZ{a(`GB zYWw!Wbg{3W34c9o0X1|3=CUoDioV^&X!t}^_q%33+@OJpafAjJbo2Sss2#tvs80$W zf|<8QlVK`?6U^lN7!UO&zM5C5y^t-k0S(&8e{n{i z|4Twj!_{OHffe5UO-LHJZtgf~-O@+@Eg2DEXw3eMDn6=6{PRC2Ox8fcH8DKI%N`u3 zxQKAl+5Zxmv7Ad&MFt7z_7z#eB6w8)25T&5=7~OL!~p^nSSHXr;`odf=5e3ltOYAI z(4vx1eGiyZV%#;VpbNMQhoWQt|MG*gvO3e53+^*+Y9|(}OfPVni{H zdCq-DrI|5fPxB}^Yg(X2wZ5=e!%WOwA6(d+fD}$ntZAB!8xkQ`7mnMgWOH#OMCqIZ zrF$su^pFSVPy>s6cv0(CC9cIFH~r9ewy6+Drq2iPcX>=)`ZVYHD@>K9wnRpa|I;d_>nmf@}-TKDs zkag`>{z= zOoU40>4lreO)~+uDiPg1=gkFL$4z)n>egHZ#+OgD{(v>7ycpc|hMjJClSRT~NXAJ4 zTj=Mm)cw>ELkzyXSk=XAWHj8%1gQ+G;s_)|Qu>Xt9{u-2|SB&#eR?C8X&)Jvjuk}ir? z*WN++gVR>=yL)Y<9+cR;2VQQ!$47eQOeyI$`t;a+TQk3h^d|mi)%8-+q4tQlP}O{m z(Q-A-6Xi0T9F)j|#SE|a#@`r9N+^3`8W$z7OH)L90CcaEkJTx2~}GZOMDfwLsZFRQ`wD%)Kl&ecn61#ij_R zes-KZ1|)~Xk%q74M`(=iUPGQkrxILe+>?nYxdQyY3)-#cGGrC^e6%CJqWN*oLtpBs z_IZ&XbbxdESqwGy<*x8sC&0UWh(+$%_%lY&Q>Ex*?whPrR!M_#k zU)n;+Dv5b8TP$-iE!KH(v{8gVfBkqKE zi^jwxgJ-%O4#tKZEz7D+Rhv|Rt@?+pV5uO0F962{Sw1sniHF3K*9ikIe4dF3ku-qmkv+jQm%f zZ*ExHA9!T=NYGxe$0yNmLhZ*zl?&Y$`MWyZE!dKMo**8lhEaSEDheH<+Z`JBmx2N z?VS*M7&9i4P=nW!bEz>6&$}?5omv34(tnl;Siw%Bc9uuUE0L40hO{o)(%+`YL6D6y z9R_60{BZtm&a#zQ`X zj^!^43)MsrLYiZ#A7+-UX^5V(u-)Ue;63FDh%tr-NT>%LvG-5|jY$#+gd>G3i32zJ zM@(i~iG^YUWx*zvEWi6V->y=?Sf-G(Q%1(oMVkr&TU)y%sS1}SHQpt!GBu_arlv6& zy$sORH;|{Hr+zIz8u@hO+5ssOi6x8SWAcSJGIZmUpM4;)1pRWTusl-Yn>LYL+z|>1 zu#Wmf>3O@<^JmdD1hAGRPM%Wz`#p6_N=H>RHw2@q8QLhy?c^+sux zIuh@InuIo*i3Tl0_=#eWRdsJn)j@S^4Lxg9BnYZ>5{Y8FqGjhT@FYYx{PMtSb&mbU4*0>nqP8Z2e zk?2#A)bU}SQN0>jH6f`3ZGKYy&&N^@^*_KOdWt0(j6$Vc{7+&>cZ8+Xof^=o&ka-Ub!r*$0P%r8~# zh$~KO4weW%6{-24&A+dBdKK%Q*%--fKxz9`L8p!CFuUG~zrQeP^>w)^NICabC(HiZ z=N8`0U6DH}r6GzroVt@<-hUWKXj5d!G9p4F&{K| zOFc-p0cRDYc8aj@Qv$w>Lw@n?EUjc!^UfN*)nG=_xulUYCc3p$hRco`NG1HSVoL1D zoe`99YOGkFXwVqsr3NA4%7)0|+DC^r8BvRt~*5C7hDlUV;NzGzY z+X{UUWPZfgUSxivo}Fixl^@;)1sY<# z9AA>eEivhLB+6Z!I~d@HJ7JaX)Jt!bP88YrXLT{WF#~HU>x(>so*z5L#q<5^_E&t( z*nSyQFJEqLeWUR8lspCi&M2SACqc32v5eA9cY=!5F|IP8P`}xph7R=1aWFAJ+Vo&6 z-z7TMBfo5IhRq{FayCoBr|kQQt%48GGQ5(nv&qp~s1*srW_ z?yX10@7r1Md9+#8UGUIG{>N`?X(?E+r#-u@`F1H z(`%_a#c4YojXeiOUB&^q7F5@oNO`vinS*K_d}3>_t_Vp$yn}IRC*7i6%$Hp~LfE?# znF+X|hPdxlQgK<=VQ1^5=k@C-;+v;yWyS>iZS-Bg|J(%|8ym8a;_eZ!V=>xoSTjfqe$j7V zzUG=KnsUxc;XP9RqxYa-T383O) zW~=@;BjsXb12hq~v#>GyOa7Jj^{c%Hi4OBW%}7{yczFKyrUxstF|u$bVgFYpaiEPE zD+vn+OkrgtLBantf%|_l0VZ8aRK?R7CRNJL+@6G=AE4su;9z5B`&U0^fP#~$nG?{? zf=0>|#sIo_(gKvtEPyc7JZXeskeSiKL;y5MSXuv(_g`QkVfl-jG7{jck+a!f3;tJh zR9uZ+{=y2==5M{f5VQWHo2tEpl&GAM0|_hhf3t|^f41mf=$abYx%}uj$G# zp#HDb_$wae(s0Crzo%$)w-D;G0Svwzydp!+xX^T<4#9u!7+_3Bj}{#$o<_p)3w@5l{F8|^={~d#JW~M-+ zf5srJ0y7CG3o8j14=b!=fP|C1tHa;115kA`vV#R~SU)D701*|~PFoMO7f8@e+5fmhWUH?7${i6>Iby%A(MY`Tx;>v()A6SD8^JwR*k|WByi^N!~kb&9$zB!+#((Own5z(h}G!kmEynylbFb zO_CfH_GTlNj36V76>9 z$d2xX+Ypfb?nn4mHlcJv%H`B~86zu4(BLXLSPthA)eywG-|)G}Bed&&W|&45JvQMb zv!MIkmg6^m@UpNCddAkNm____vTj@nrW)%7MNsQ@rLt;9#1Tqh@b&BZ>d#DkLpN9g z9+D_-yEcR#_wpHacn^ft+3=mXzOGCZNsDtK0Qf`n#4cfB*V~bl-R`n>!{4c}-%*!k zbxBnWBti@mzdAQtN|dd9-*3z%29@NQ5&`a7l`DSpU*o?9RHcQ7vBQJthf_-N9=RXi z+L6P5eiz`BA<8FR)*ihi-DGs+hD()b|4!jng>8fC$G1^g_;p4(!HrgU>4fOJ6@tUS zC@!M$|EJOFd2J$y!Uhk@YNd#x2*MHwq&c{=vpc(q)RdUbqE=g*N(CXbq1ozU&B`Xh zA{Oyj4~ls39}x8*9z1B2f(W9y6)FgYAg!h9Nwi)HrPTK}KiJIX;J~u*F>l_R;rqV# zR!%Iw{9dhx);=aCYLCOK13RoPyl*8pA6>Z-xwP`oKDb$}J7c+bncDXG z{lBPt!2NnLwwipl9NXIWVRr2Ii@CRZ9*i%AFN}Yxox1h6f5*U^iQUfi%;(V4A+l@X z&#`-%+xhb0Cr5_vF6~{M|8aEv)$5VonYk}(&kt>k^ex;O?ClZGoQ-W&6YJ4xcsum1 zKu5b70x}M@&veqJCK4JkWG1?^2yGKOq;px2hAZW1y9nZG_8`=9sU_mnr0bZDdrfRe z%}@5giLHbDZIiYJ0#s%iW(DZ>ViYBLE`QZ>`8ra8(!qrC@lli*=##ERfI?rQF3*=yN#^nGW=zLzp z7 literal 0 HcmV?d00001 From 754915b8aa1b0bcbb83f89560c2155432e0e753a Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Wed, 26 Sep 2018 13:40:58 -0500 Subject: [PATCH 076/193] Remove duplicate dependency in dspace-api --- dspace-api/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index fb6a90d965..3c197da796 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -364,10 +364,6 @@ org.apache.commons commons-collections4
- - org.apache.commons - commons-collections4 - org.apache.commons commons-dbcp2 From 447bea2921e6bd1a6e7f1f97ac9199841cbafdb8 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 8 Oct 2018 17:11:37 +0000 Subject: [PATCH 077/193] Update to using Servlet API spec 3.1.0 in all modules --- dspace-api/pom.xml | 2 +- dspace-oai/pom.xml | 2 +- dspace-rdf/pom.xml | 2 +- dspace-rest/pom.xml | 1 - dspace-services/pom.xml | 2 +- dspace-solr/pom.xml | 2 +- dspace-sword/pom.xml | 2 +- dspace-swordv2/pom.xml | 2 +- dspace/modules/additions/pom.xml | 2 +- dspace/modules/oai/pom.xml | 2 +- dspace/modules/rdf/pom.xml | 2 +- dspace/modules/rest/pom.xml | 2 +- dspace/modules/sword/pom.xml | 2 +- dspace/modules/swordv2/pom.xml | 2 +- dspace/pom.xml | 2 +- pom.xml | 4 ++-- 16 files changed, 16 insertions(+), 17 deletions(-) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 3c197da796..3597126c94 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -395,7 +395,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index 77472986e4..cb44500437 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -185,7 +185,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace-rdf/pom.xml b/dspace-rdf/pom.xml index 5a7eeca9ab..6e5284b85c 100644 --- a/dspace-rdf/pom.xml +++ b/dspace-rdf/pom.xml @@ -64,7 +64,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace-rest/pom.xml b/dspace-rest/pom.xml index ba7a990095..b4f54dbd32 100644 --- a/dspace-rest/pom.xml +++ b/dspace-rest/pom.xml @@ -220,7 +220,6 @@ javax.servlet javax.servlet-api - 3.1.0 provided diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml index 3d82e158fd..a2c99e39bc 100644 --- a/dspace-services/pom.xml +++ b/dspace-services/pom.xml @@ -108,7 +108,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace-solr/pom.xml b/dspace-solr/pom.xml index 42797d4740..f8e825bd13 100644 --- a/dspace-solr/pom.xml +++ b/dspace-solr/pom.xml @@ -249,7 +249,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace-sword/pom.xml b/dspace-sword/pom.xml index fb26286f27..d93519952d 100644 --- a/dspace-sword/pom.xml +++ b/dspace-sword/pom.xml @@ -112,7 +112,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace-swordv2/pom.xml b/dspace-swordv2/pom.xml index 46d9c57f03..4ac9511e58 100644 --- a/dspace-swordv2/pom.xml +++ b/dspace-swordv2/pom.xml @@ -81,7 +81,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/additions/pom.xml b/dspace/modules/additions/pom.xml index ebc3963a0a..d02b33a8b9 100644 --- a/dspace/modules/additions/pom.xml +++ b/dspace/modules/additions/pom.xml @@ -58,7 +58,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/oai/pom.xml b/dspace/modules/oai/pom.xml index 2dc97f96bc..d6af3a4a24 100644 --- a/dspace/modules/oai/pom.xml +++ b/dspace/modules/oai/pom.xml @@ -127,7 +127,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/rdf/pom.xml b/dspace/modules/rdf/pom.xml index 5a5ab808bf..297d165a6d 100644 --- a/dspace/modules/rdf/pom.xml +++ b/dspace/modules/rdf/pom.xml @@ -104,7 +104,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/rest/pom.xml b/dspace/modules/rest/pom.xml index 636adc7e18..4b9c4a2a24 100644 --- a/dspace/modules/rest/pom.xml +++ b/dspace/modules/rest/pom.xml @@ -143,7 +143,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/sword/pom.xml b/dspace/modules/sword/pom.xml index 3ed2e4cc10..a8498483ce 100644 --- a/dspace/modules/sword/pom.xml +++ b/dspace/modules/sword/pom.xml @@ -121,7 +121,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/swordv2/pom.xml b/dspace/modules/swordv2/pom.xml index 63ef48427d..11f0b684b5 100644 --- a/dspace/modules/swordv2/pom.xml +++ b/dspace/modules/swordv2/pom.xml @@ -135,7 +135,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/pom.xml b/dspace/pom.xml index 3780d02fa0..9c22c27523 100644 --- a/dspace/pom.xml +++ b/dspace/pom.xml @@ -321,7 +321,7 @@ command. --> javax.servlet - servlet-api + javax.servlet-api diff --git a/pom.xml b/pom.xml index 88dfeec6d0..1bdfe1dcae 100644 --- a/pom.xml +++ b/pom.xml @@ -1236,8 +1236,8 @@ javax.servlet - servlet-api - 2.5 + javax.servlet-api + 3.1.0 From d3ee089d2e1c435413173a811dbe0e00066716bc Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 8 Oct 2018 12:40:07 -0500 Subject: [PATCH 078/193] Update our DummyHttpServletRequest to Servlet Spec 3.1.0 --- .../util/DummyHttpServletRequest.java | 137 +++++++++++++++++- 1 file changed, 135 insertions(+), 2 deletions(-) diff --git a/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java b/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java index 447e2c7728..7ebf4305f6 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java +++ b/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java @@ -10,16 +10,25 @@ package org.dspace.statistics.util; import java.io.BufferedReader; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.security.Principal; +import java.util.Collection; import java.util.Enumeration; import java.util.Locale; import java.util.Map; +import javax.servlet.AsyncContext; +import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; import javax.servlet.ServletInputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpUpgradeHandler; +import javax.servlet.http.Part; /** * A mock request for testing. @@ -45,6 +54,15 @@ class DummyHttpServletRequest implements HttpServletRequest { this.remoteHost = host; } + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#changeSessionId + */ + @Override + public String changeSessionId() { + // TODO Auto-generated method stub + return null; + } + /* (non-Javadoc) * @see javax.servlet.http.HttpServletRequest#getAuthType() */ @@ -81,6 +99,15 @@ class DummyHttpServletRequest implements HttpServletRequest { return 0; } + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#getDispatcherType() + */ + @Override + public DispatcherType getDispatcherType() { + // TODO Auto-generated method stub + return null; + } + /* (non-Javadoc) * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String) */ @@ -255,6 +282,55 @@ class DummyHttpServletRequest implements HttpServletRequest { return false; } + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#authenticate(javax.servlet.http.HttpServletResponse) + */ + @Override + public boolean authenticate(HttpServletResponse httpServletResponse) { + return false; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#login(java.lang.String,java.lang.String) + */ + @Override + public void login(String s, String s1) { + return; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#logout() + */ + @Override + public void logout() { + return; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#getPart(java.lang.String) + */ + @Override + public Part getPart(String arg0) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#getParts() + */ + @Override + public Collection getParts() { + return null; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#upgrade(java.lang.Class) + */ + @Override + public T upgrade(Class aClass) throws IOException, ServletException { + return null; + } + /* (non-Javadoc) * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid() */ @@ -309,6 +385,14 @@ class DummyHttpServletRequest implements HttpServletRequest { return 0; } + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#getContentLengthLong() + */ + @Override + public long getContentLengthLong() { + return 0; + } + /* (non-Javadoc) * @see javax.servlet.ServletRequest#getContentType() */ @@ -490,10 +574,51 @@ class DummyHttpServletRequest implements HttpServletRequest { */ @Override public void setCharacterEncoding(String arg0) - throws UnsupportedEncodingException { + throws UnsupportedOperationException { throw new UnsupportedOperationException("Not supported yet."); } + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#startAsync + */ + @Override + public AsyncContext startAsync() throws IllegalStateException { + throw new IllegalStateException("Not supported yet."); + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#startAsync(javax.servlet.ServletRequest,javax.servlet.ServletResponse) + */ + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) + throws IllegalStateException { + throw new IllegalStateException("Not supported yet."); + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#isAsyncStarted + */ + @Override + public boolean isAsyncStarted() { + return false; + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#isAsyncSupported + */ + @Override + public boolean isAsyncSupported() { + return false; + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#getAsyncContext + */ + @Override + public AsyncContext getAsyncContext() { + return null; + } + @Override public int getRemotePort() { throw new UnsupportedOperationException("Not supported yet."); @@ -514,4 +639,12 @@ class DummyHttpServletRequest implements HttpServletRequest { throw new UnsupportedOperationException("Not supported yet."); } + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#getServletContext + */ + @Override + public ServletContext getServletContext() { + return null; + } + } From 3fd7cc903dd88766deada750582189746850aee1 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 8 Oct 2018 20:07:44 +0000 Subject: [PATCH 079/193] Fix dependency convergence errors with OAI and SWORDv2 --- dspace-oai/pom.xml | 4 ++++ dspace-swordv2/pom.xml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index cb44500437..a1611abc2c 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -160,6 +160,10 @@ org.apache.commons commons-lang3 + + javax.servlet + servlet-api + diff --git a/dspace-swordv2/pom.xml b/dspace-swordv2/pom.xml index 4ac9511e58..2d923f69d8 100644 --- a/dspace-swordv2/pom.xml +++ b/dspace-swordv2/pom.xml @@ -95,6 +95,10 @@ org.apache.abdera abdera-client + + javax.servlet + servlet-api + From 89ebd2c154515b8bc41ca6fbab199dfb097399e8 Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Mon, 8 Oct 2018 22:29:31 +0200 Subject: [PATCH 080/193] Make LicenseOperation more client friendly --- .../submit/factory/impl/LicenseAddPatchOperation.java | 8 +++++++- .../submit/factory/impl/LicenseReplacePatchOperation.java | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseAddPatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseAddPatchOperation.java index 6038660586..044b27ac3b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseAddPatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseAddPatchOperation.java @@ -52,7 +52,13 @@ public class LicenseAddPatchOperation extends AddPatchOperation { void add(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception { - Boolean grant = BooleanUtils.toBooleanObject((String) value); + Boolean grant = null; + // we are friendly with the client and accept also a string representation for the boolean + if (value instanceof String) { + grant = BooleanUtils.toBooleanObject((String) value); + } else { + grant = (Boolean) value; + } if (grant == null) { throw new IllegalArgumentException( diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java index 30c7558cee..0efa7d0b02 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java @@ -33,7 +33,13 @@ public class LicenseReplacePatchOperation extends ReplacePatchOperation void replace(Context context, Request currentRequest, WorkspaceItem source, String path, Object value) throws Exception { - Boolean grant = BooleanUtils.toBooleanObject((String) value); + Boolean grant = null; + // we are friendly with the client and accept also a string representation for the boolean + if (value instanceof String) { + grant = BooleanUtils.toBooleanObject((String) value); + } else { + grant = (Boolean) value; + } if (grant == null) { throw new IllegalArgumentException( From 2458b5d621d2bcdb732eeea117141f5696994486 Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Mon, 8 Oct 2018 22:30:22 +0200 Subject: [PATCH 081/193] DS-3850 ITs for metadata update, file upload, file update --- .../rest/WorkspaceItemRestRepositoryIT.java | 533 ++++++++++++++++++ .../rest/builder/WorkspaceItemBuilder.java | 31 + 2 files changed, 564 insertions(+) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java index 32b7e6dbed..624152686a 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java @@ -732,6 +732,15 @@ public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegration .withSubject("Subject4") .build(); + WorkspaceItem witemWithTitleDateAndSubjects = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withSubject("Subject1") + .withSubject("Subject2") + .withSubject("Subject3") + .withSubject("Subject4") + .build(); + // try to remove the title List removeTitle = new ArrayList(); removeTitle.add(new RemoveOperation("/sections/traditionalpageone/dc.title/0")); @@ -857,6 +866,28 @@ public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegration .andExpect(jsonPath("$.errors").doesNotExist()) .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) ; + + // remove all the subjects with a single operation + List removeSubjectsAllAtOnce = new ArrayList(); + removeSubjectsAllAtOnce.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject")); + + patchBody = getPatchContent(removeSubjectsAllAtOnce); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemWithTitleDateAndSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemWithTitleDateAndSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) + ; } @Test @@ -1125,4 +1156,506 @@ public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegration ; } + @Test + /** + * Test the acceptance of the deposit license + * + * @throws Exception + */ + public void patchAcceptLicenseTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem witem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 2") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem witem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 3") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem witem4 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 4") + .withIssueDate("2017-10-17") + .build(); + + // check that our workspaceitems come without a license (all are build in the same way, just check the first) + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // try to grant the license with an add operation + List addGrant = new ArrayList(); + addGrant.add(new AddOperation("/sections/license/granted", true)); + + String patchBody = getPatchContent(addGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // try to grant the license with an add operation supplying a string instead than a boolean + List addGrantString = new ArrayList(); + addGrantString.add(new AddOperation("/sections/license/granted", "true")); + + patchBody = getPatchContent(addGrantString); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem2.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem2.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // try to grant the license with a replace operation + List replaceGrant = new ArrayList(); + replaceGrant.add(new ReplaceOperation("/sections/license/granted", true)); + + patchBody = getPatchContent(replaceGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem3.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem3.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // try to grant the license with a replace operation supplying a string + List replaceGrantString = new ArrayList(); + replaceGrant.add(new ReplaceOperation("/sections/license/granted", "true")); + + patchBody = getPatchContent(replaceGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem4.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem4.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + } + + @Test + /** + * Test the reject of the deposit license + * + * @throws Exception + */ + public void patchRejectLicenseTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .grantLicense() + .build(); + + WorkspaceItem witem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 2") + .withIssueDate("2017-10-17") + .grantLicense() + .build(); + + WorkspaceItem witem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 3") + .withIssueDate("2017-10-17") + .grantLicense() + .build(); + + WorkspaceItem witem4 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 4") + .withIssueDate("2017-10-17") + .grantLicense() + .build(); + + // check that our workspaceitems come with a license (all are build in the same way, just check the first) + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // try to reject the license with an add operation + List addGrant = new ArrayList(); + addGrant.add(new AddOperation("/sections/license/granted", false)); + + String patchBody = getPatchContent(addGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // try to reject the license with an add operation supplying a string instead than a boolean + List addGrantString = new ArrayList(); + addGrantString.add(new AddOperation("/sections/license/granted", "false")); + + patchBody = getPatchContent(addGrantString); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem2.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem2.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // try to reject the license with a replace operation + List replaceGrant = new ArrayList(); + replaceGrant.add(new ReplaceOperation("/sections/license/granted", false)); + + patchBody = getPatchContent(replaceGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem3.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem3.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // try to reject the license with a replace operation supplying a string + List replaceGrantString = new ArrayList(); + replaceGrant.add(new ReplaceOperation("/sections/license/granted", "false")); + + patchBody = getPatchContent(replaceGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem4.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem4.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + } + + @Test + /** + * Test update of bitstream metadata in the upload section + * + * @throws Exception + */ + public void patchUploadTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + String authToken = getAuthToken(admin.getEmail(), password); + + InputStream pdf = getClass().getResourceAsStream("simple-article.pdf"); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .withFulltext("simple-article.pdf", "/local/path/simple-article.pdf", pdf) + .build(); + + // check the file metadata + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/simple-article.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("simple-article.pdf"))) + ; + + // try to change the filename and add a description + List addOpts = new ArrayList(); + Map value = new HashMap(); + value.put("value", "newfilename.pdf"); + Map valueDesc = new HashMap(); + valueDesc.put("value", "Description"); + List valueDescs = new ArrayList(); + valueDescs.add(valueDesc); + addOpts.add(new AddOperation("/sections/upload/files/0/metadata/dc.title/0", value)); + addOpts.add(new AddOperation("/sections/upload/files/0/metadata/dc.description", valueDescs)); + + String patchBody = getPatchContent(addOpts); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + // is the source still here? + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/simple-article.pdf"))) + // check the new filename + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("newfilename.pdf"))) + // check the description + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.description'][0].value", + is("Description"))) + ; + + // check that changes persist + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/simple-article.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("newfilename.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.description'][0].value", + is("Description"))) + ; + + // try to remove the description and the source now + List removeOpts = new ArrayList(); + removeOpts.add(new RemoveOperation("/sections/upload/files/0/metadata/dc.source/0")); + removeOpts.add(new RemoveOperation("/sections/upload/files/0/metadata/dc.description")); + + patchBody = getPatchContent(removeOpts); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + // check the removed source + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source']").doesNotExist()) + // check the filename still here + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("newfilename.pdf"))) + // check the removed description + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.description']").doesNotExist()) + ; + + // check that changes persist + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source']").doesNotExist()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("newfilename.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.description']").doesNotExist()) ; + + // try to update the filename with an update opt + List updateOpts = new ArrayList(); + Map updateValue = new HashMap(); + updateValue.put("value", "another-filename.pdf"); + updateOpts.add(new ReplaceOperation("/sections/upload/files/0/metadata/dc.title/0", updateValue)); + + patchBody = getPatchContent(updateOpts); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + // check the filename still here + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("another-filename.pdf"))) + ; + + // check that changes persist + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("another-filename.pdf"))) + ; + } + + @Test + /** + * Test the upload of files in the upload over section + * + * @throws Exception + */ + public void uploadTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .build(); + + InputStream pdf = getClass().getResourceAsStream("simple-article.pdf"); + final MockMultipartFile pdfFile = new MockMultipartFile("file", pdf); + + // upload the file in our workspaceitem + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems/" + witem.getID()) + .file(pdfFile) + .param("extraField", "sample-article.pdf")) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("sample-article.pdf"))) + ; + + // check the file metadata + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("sample-article.pdf"))) + ; + } + } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java index 85e61aa0f0..4d73d23b19 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java @@ -7,13 +7,18 @@ */ package org.dspace.app.rest.builder; +import java.io.InputStream; + +import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.DCDate; import org.dspace.content.Item; +import org.dspace.content.LicenseUtils; import org.dspace.content.MetadataSchema; import org.dspace.content.WorkspaceItem; import org.dspace.content.service.WorkspaceItemService; import org.dspace.core.Context; +import org.dspace.eperson.EPerson; /** * Builder to construct WorkspaceItem objects @@ -111,4 +116,30 @@ public class WorkspaceItemBuilder extends AbstractBuilder Date: Mon, 8 Oct 2018 23:09:04 -0500 Subject: [PATCH 082/193] Added POST method on Communities endpoint to create a Top-Level Community Wrote integration tests for admin, anonymous and normal eperson use cases --- .../dspace/app/rest/model/CommunityRest.java | 2 + .../repository/CommunityRestRepository.java | 42 ++++++- .../app/rest/CommunityRestRepositoryIT.java | 104 ++++++++++++++++++ .../matcher/CommunityMetadataMatcher.java | 6 +- 4 files changed, 150 insertions(+), 4 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/CommunityRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/CommunityRest.java index 2235e51fee..19d3decaee 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/CommunityRest.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/CommunityRest.java @@ -10,6 +10,7 @@ package org.dspace.app.rest.model; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; /** * The Community REST Resource @@ -61,6 +62,7 @@ public class CommunityRest extends DSpaceObjectRest { } @Override + @JsonProperty(access = JsonProperty.Access.READ_ONLY) public String getType() { return NAME; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/CommunityRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/CommunityRestRepository.java index 16c4796af4..dc20cd945f 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/CommunityRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/CommunityRestRepository.java @@ -7,16 +7,24 @@ */ package org.dspace.app.rest.repository; +import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.UUID; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; + +import com.fasterxml.jackson.databind.ObjectMapper; import org.dspace.app.rest.Parameter; import org.dspace.app.rest.SearchRestMethod; import org.dspace.app.rest.converter.CommunityConverter; +import org.dspace.app.rest.exception.UnprocessableEntityException; import org.dspace.app.rest.model.CommunityRest; +import org.dspace.app.rest.model.MetadataEntryRest; import org.dspace.app.rest.model.hateoas.CommunityResource; +import org.dspace.authorize.AuthorizeException; import org.dspace.content.Community; import org.dspace.content.service.CommunityService; import org.dspace.core.Context; @@ -29,7 +37,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Component; /** - * This is the repository responsible to manage Item Rest object + * This is the repository responsible to manage Community Rest object * * @author Andrea Bollini (andrea.bollini at 4science.it) */ @@ -47,6 +55,38 @@ public class CommunityRestRepository extends DSpaceRestRepositorySome cool HTML code here

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

HTML News

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

Some cool HTML code here

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

HTML News

"), + CommunityMetadataMatcher.matchMetadata("dc.rights", + "Custom Copyright Text"), + CommunityMetadataMatcher.matchMetadata("dc.title", + "Title Text") + ))))); + + } + + public void createUnauthorizedTest() throws Exception { + context.turnOffAuthorisationSystem(); + + ObjectMapper mapper = new ObjectMapper(); + CommunityRest comm = new CommunityRest(); + comm.setName("Test Top-Level Community"); + + MetadataEntryRest title = new MetadataEntryRest(); + title.setKey("dc.title"); + title.setValue("Title Text"); + + comm.setMetadata(Arrays.asList(title)); + + // Anonymous user tries to create a community. + // Should fail because user is not authenticated. Error 401. + getClient().perform(post("/api/core/communities") + .content(mapper.writeValueAsBytes(comm)) + .contentType(contentType)) + .andExpect(status().isForbidden()); + + // Non-admin Eperson tries to create a community. + // Should fail because user doesn't have permissions. Error 403. + String authToken = getAuthToken(eperson.getEmail(), password); + getClient(authToken).perform(post("/api/core/communities") + .content(mapper.writeValueAsBytes(comm)) + .contentType(contentType)) + .andExpect(status().isForbidden()); + } + @Test public void findAllTest() throws Exception { //We turn off the authorization system in order to create the structure as defined below diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/CommunityMetadataMatcher.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/CommunityMetadataMatcher.java index 575bd1b386..ec251e86ea 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/CommunityMetadataMatcher.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/CommunityMetadataMatcher.java @@ -17,10 +17,10 @@ public class CommunityMetadataMatcher { private CommunityMetadataMatcher() { } - public static Matcher matchTitle(String title) { + public static Matcher matchMetadata(String key, String value) { return allOf( - hasJsonPath("$.key", is("dc.title")), - hasJsonPath("$.value", is(title)) + hasJsonPath("$.key", is(key)), + hasJsonPath("$.value", is(value)) ); } } From a2e7069d1cf60d91ac0715a6cafc04283be8f7b9 Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Mon, 8 Oct 2018 23:19:53 -0500 Subject: [PATCH 083/193] Fixed missing @Test on ITs Modified CommunityMatcher to use the generic CommunityMetadataMatcher --- .../java/org/dspace/app/rest/CommunityRestRepositoryIT.java | 4 +++- .../java/org/dspace/app/rest/matcher/CommunityMatcher.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java index 3e846be908..a8a0d2f00f 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java @@ -36,6 +36,7 @@ import org.junit.Test; public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest { + @Test public void createTest() throws Exception { context.turnOffAuthorisationSystem(); @@ -101,6 +102,7 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest } + @Test public void createUnauthorizedTest() throws Exception { context.turnOffAuthorisationSystem(); @@ -119,7 +121,7 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest getClient().perform(post("/api/core/communities") .content(mapper.writeValueAsBytes(comm)) .contentType(contentType)) - .andExpect(status().isForbidden()); + .andExpect(status().isUnauthorized()); // Non-admin Eperson tries to create a community. // Should fail because user doesn't have permissions. Error 403. diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/CommunityMatcher.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/CommunityMatcher.java index 3153aade29..585d955c2f 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/CommunityMatcher.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/CommunityMatcher.java @@ -37,7 +37,7 @@ public class CommunityMatcher { hasJsonPath("$.handle", is(handle)), hasJsonPath("$.type", is("community")), hasJsonPath("$.metadata", Matchers.contains( - CommunityMetadataMatcher.matchTitle(name) + CommunityMetadataMatcher.matchMetadata("dc.title", name) )) ); } From 0f0066b0c06628b40c452266a228cb1ba534a82e Mon Sep 17 00:00:00 2001 From: Stefan Date: Tue, 9 Oct 2018 19:04:58 +0200 Subject: [PATCH 084/193] Spilt the createAndRunTest() method in several methods in dependcy of the context what they test and code cleanup. --- .../rest/repository/GroupRestRepository.java | 4 +-- .../app/rest/GroupRestRepositoryIT.java | 34 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java index b9c8596f58..98b9cd7c52 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/GroupRestRepository.java @@ -46,8 +46,8 @@ public class GroupRestRepository extends DSpaceRestRepository { @Autowired GroupConverter converter; - @PreAuthorize("hasAuthority('ADMIN')") @Override + @PreAuthorize("hasAuthority('ADMIN')") protected GroupRest createAndReturn(Context context) throws AuthorizeException, RepositoryMethodNotImplementedException { HttpServletRequest req = getRequestService().getCurrentRequest().getHttpServletRequest(); @@ -57,7 +57,7 @@ public class GroupRestRepository extends DSpaceRestRepository { try { groupRest = mapper.readValue(req.getInputStream(), GroupRest.class); } catch (IOException excIO) { - throw new UnprocessableEntityException("error parsing the body... maybe this is not the right error code"); + throw new UnprocessableEntityException("error parsing the body ..." + excIO.getMessage()); } Group group = null; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java index 44e93eb512..b75c9cf7bb 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java @@ -56,14 +56,40 @@ public class GroupRestRepositoryIT extends AbstractControllerIntegrationTest { GroupMatcher.matchGroupWithName("Administrator"), GroupMatcher.matchGroupWithName("Anonymous")))); - authToken = getAuthToken(eperson.getEmail(), password); - getClient(authToken).perform(post("/api/eperson/groups") - .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) - .andExpect(status().isForbidden()); + } + + @Test + public void createUnauthauthorizedTest() + throws Exception { + ObjectMapper mapper = new ObjectMapper(); + GroupRest groupRest = new GroupRest(); + String groupName = "testGroupUnauth1"; + + groupRest.setName(groupName); + + String authToken = getAuthToken(eperson.getEmail(), password); getClient().perform(post("/api/eperson/groups") .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) .andExpect(status().isUnauthorized()); + + } + + @Test + public void createForbiddenTest() + throws Exception { + ObjectMapper mapper = new ObjectMapper(); + GroupRest groupRest = new GroupRest(); + String groupName = "testGroupForbidden1"; + + groupRest.setName(groupName); + + String authToken = getAuthToken(eperson.getEmail(), password); + + authToken = getAuthToken(eperson.getEmail(), password); + getClient(authToken).perform(post("/api/eperson/groups") + .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) + .andExpect(status().isForbidden()); } @Test From a9bf1d869d40f0ecc6e8b2dc18f0865e563542ad Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Fri, 5 Oct 2018 17:55:56 -0700 Subject: [PATCH 085/193] [DS-4021] Patch processing now operates on the rest model and commits changes after successful completion of all patch operations. Also added new integration tests. Minor changes to error handling and comments. [DS-4021] Updated tests and javadocs. Also updated the string comparison in EPersonRestRespository that triggers the update of the netid after a patch operation is complete. --- .../repository/EPersonRestRepository.java | 47 +++- .../rest/repository/ItemRestRepository.java | 34 ++- .../patch/AbstractResourcePatch.java | 71 +++-- .../rest/repository/patch/EPersonPatch.java | 26 +- .../app/rest/repository/patch/ItemPatch.java | 26 +- .../factories/EPersonOperationFactory.java | 12 +- .../patch/factories/ItemOperationFactory.java | 15 +- .../EPersonCertificateReplaceOperation.java | 44 ++- .../impl/EPersonLoginReplaceOperation.java | 42 ++- .../impl/EPersonNetidReplaceOperation.java | 31 +-- .../impl/EPersonPasswordReplaceOperation.java | 31 +-- .../ItemDiscoverableReplaceOperation.java | 57 ++-- .../impl/ItemWithdrawReplaceOperation.java | 105 +++---- .../patch/factories/impl/PatchOperation.java | 72 +++-- .../impl/ResourcePatchOperation.java | 24 +- .../app/rest/EPersonRestRepositoryIT.java | 256 +++++++++++++++++- 16 files changed, 575 insertions(+), 318 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java index 5da7479903..63392a684f 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java @@ -10,6 +10,7 @@ package org.dspace.app.rest.repository; import java.io.IOException; import java.sql.SQLException; import java.util.List; +import java.util.Objects; import java.util.UUID; import javax.servlet.http.HttpServletRequest; @@ -188,18 +189,52 @@ public class EPersonRestRepository extends DSpaceRestRepository operations = patch.getOperations(); + EPersonRest ePersonRest = findOne(context, uuid); + EPersonRest patchedModel = (EPersonRest) epersonPatch.patch(ePersonRest, operations); + updatePatchedValues(context, patchedModel, eperson); + + } catch (SQLException e) { + throw new RuntimeException(e.getMessage(), e); + } + } + + /** + * Applies changes in the rest model. + * @param context + * @param ePersonRest the updated eperson rest + * @param ePerson the eperson content object + * @throws SQLException + * @throws AuthorizeException + */ + private void updatePatchedValues(Context context, EPersonRest ePersonRest, EPerson ePerson) + throws SQLException, AuthorizeException { + + if (ePersonRest.getPassword() != null) { + es.setPassword(ePerson, ePersonRest.getPassword()); + } + if (ePersonRest.isRequireCertificate() != ePerson.getRequireCertificate()) { + ePerson.setRequireCertificate(ePersonRest.isRequireCertificate()); + } + if (ePersonRest.isCanLogIn() != ePerson.canLogIn()) { + ePerson.setCanLogIn(ePersonRest.isCanLogIn()); + } + if (!Objects.equals(ePersonRest.getNetid(), ePerson.getNetid())) { + ePerson.setNetid(ePersonRest.getNetid()); } - List operations = patch.getOperations(); - epersonPatch.patch(eperson, context, operations); + es.update(context, ePerson); } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java index 48785953f9..f8d19a6ce6 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java @@ -103,13 +103,45 @@ public class ItemRestRepository extends DSpaceRestRepository { ResourceNotFoundException { Item item = is.find(context, uuid); + if (item == null) { throw new ResourceNotFoundException(apiCategory + "." + model + " with id: " + uuid + " not found"); } List operations = patch.getOperations(); - itemPatch.patch(item, context, operations); + ItemRest itemRest = findOne(uuid); + ItemRest patchedModel = (ItemRest) itemPatch.patch(itemRest, operations); + updatePatchedValues(context, patchedModel, item); + } + + /** + * Persists changes to the rest model. + * @param context + * @param itemRest the updated item rest resource + * @param item the item content object + * @throws SQLException + * @throws AuthorizeException + */ + private void updatePatchedValues(Context context, ItemRest itemRest, Item item) + throws SQLException, AuthorizeException { + + try { + if (itemRest.getWithdrawn() != item.isWithdrawn()) { + if (itemRest.getWithdrawn()) { + is.withdraw(context, item); + } else { + is.reinstate(context, item); + } + } + if (itemRest.getDiscoverable() != item.isDiscoverable()) { + item.setDiscoverable(itemRest.getDiscoverable()); + is.update(context, item); + } + } catch (SQLException | AuthorizeException e) { + e.printStackTrace(); + throw e; + } } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java index 15684006f7..8536f84e95 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java @@ -7,100 +7,93 @@ */ package org.dspace.app.rest.repository.patch; -import java.sql.SQLException; import java.util.List; import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.content.DSpaceObject; -import org.dspace.core.Context; /** * The base class for resource PATCH operations. * * @author Michael Spalti */ -public abstract class AbstractResourcePatch { +public abstract class AbstractResourcePatch { /** - * Handles the patch operations, delegating actions to sub-class implementations. If no sub-class method - * is provided, the default method throws a UnprocessableEntityException. + * Handles the patch operations. Patch implementations are provided by subclasses. + * The default methods throw an UnprocessableEntityException. * - * @param dspaceObject the DSO to patch - * @param context - * @param operations + * @param restModel the rest resource to patch + * @param operations list of patch operations * @throws UnprocessableEntityException * @throws PatchBadRequestException - * @throws SQLException - * @throws AuthorizeException */ - public void patch(DSO dspaceObject, Context context, List operations) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - - // List operations = patch.getOperations(); + public RestModel patch(R restModel, List operations) + throws UnprocessableEntityException, PatchBadRequestException { // Note: the list of possible operations is taken from JsonPatchConverter class. Does not implement // test https://tools.ietf.org/html/rfc6902#section-4.6 ops: for (Operation op : operations) { switch (op.getOp()) { case "add": - add(dspaceObject, context, op); + restModel = add(restModel, op); continue ops; case "replace": - replace(dspaceObject, context, op); + restModel = replace(restModel, op); continue ops; case "remove": - remove(dspaceObject, context, op); + restModel = remove(restModel, op); continue ops; case "copy": - copy(dspaceObject, context, op); + restModel = copy(restModel, op); continue ops; case "move": - move(dspaceObject, context, op); + restModel = move(restModel, op); continue ops; default: // JsonPatchConverter should have thrown error before this point. throw new PatchBadRequestException("Missing or illegal patch operation: " + op.getOp()); } } + + return restModel; + } // The default patch methods throw an error when no sub-class implementation is provided. - protected void add(DSO dspaceObject, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + protected R add(R restModel, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException { throw new UnprocessableEntityException( "The add operation is not supported." ); } - protected void replace(DSO dspaceObject, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { - // The replace operation is functionally identical to a "remove" operation for - // a value, followed immediately by an "add" operation at the same - // location with the replacement value. https://tools.ietf.org/html/rfc6902#section-4.3 - remove(dspaceObject, context, operation); - add(dspaceObject, context, operation); - } - - protected void remove(DSO dspaceObject, Context context, Operation operation) - - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + protected R replace(R restModel, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException { throw new UnprocessableEntityException( "The remove operation is not supported." ); } - protected void copy(DSO dspaceObject, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + protected R remove(R restModel, Operation operation) + + throws UnprocessableEntityException, PatchBadRequestException { + throw new UnprocessableEntityException( + "The remove operation is not supported." + ); + } + + protected R copy(R restModel, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException { throw new UnprocessableEntityException( "The copy operation is not supported." ); } - protected void move(DSO dspaceObject, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + protected R move(R restModel, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException { throw new UnprocessableEntityException( "The move operation is not supported." ); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java index 71c27ef508..67acd125f0 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java @@ -7,44 +7,38 @@ */ package org.dspace.app.rest.repository.patch; -import java.sql.SQLException; - import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.repository.patch.factories.EPersonOperationFactory; import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.core.Context; -import org.dspace.eperson.EPerson; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** - * Provides PATCH operation implementations for EPerson updates. + * Provides patch operations for eperson updates. */ @Component -public class EPersonPatch extends AbstractResourcePatch { +public class EPersonPatch extends AbstractResourcePatch { @Autowired EPersonOperationFactory patchFactory; /** * Performs the replace operation. - * @param eperson dspace object - * @param context dspace context + * @param eperson the eperson rest representation * @param operation the replace operation * @throws UnprocessableEntityException * @throws PatchBadRequestException - * @throws SQLException - * @throws AuthorizeException */ - protected void replace(EPerson eperson, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + protected EPersonRest replace(EPersonRest eperson, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException { - // Get the patch operation via the EPerson replace operation factory. - ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); - patchOperation.perform(context, eperson, operation); + ResourcePatchOperation patchOperation = + patchFactory.getReplaceOperationForPath(operation.getPath()); + + return (EPersonRest) patchOperation.perform(eperson, operation); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java index 77203102bb..257604959b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java @@ -7,44 +7,38 @@ */ package org.dspace.app.rest.repository.patch; -import java.sql.SQLException; - import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.ItemRest; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.repository.patch.factories.ItemOperationFactory; import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.content.Item; -import org.dspace.core.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** - * Provides PATCH operation implementations for Items. + * Provides PATCH operations for item updates. */ @Component -public class ItemPatch extends AbstractResourcePatch { +public class ItemPatch extends AbstractResourcePatch { @Autowired ItemOperationFactory patchFactory; /** * Peforms the replace operation. - * @param item dspace object - * @param context dspace context + * @param item the rest representation of the item * @param operation the replace operation * @throws UnprocessableEntityException * @throws PatchBadRequestException - * @throws SQLException - * @throws AuthorizeException */ - protected void replace(Item item, Context context, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + protected ItemRest replace(ItemRest item, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException { - // Get the patch operation via the Item replace operation factory. - ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); - patchOperation.perform(context, item, operation); + ResourcePatchOperation patchOperation = + patchFactory.getReplaceOperationForPath(operation.getPath()); + + return (ItemRest) patchOperation.perform(item, operation); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java index 39e55c8a57..fcd8ec43b4 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java @@ -8,17 +8,17 @@ package org.dspace.app.rest.repository.patch.factories; import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.repository.patch.factories.impl.EPersonCertificateReplaceOperation; import org.dspace.app.rest.repository.patch.factories.impl.EPersonLoginReplaceOperation; import org.dspace.app.rest.repository.patch.factories.impl.EPersonNetidReplaceOperation; import org.dspace.app.rest.repository.patch.factories.impl.EPersonPasswordReplaceOperation; import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation; -import org.dspace.eperson.EPerson; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** - * Provides factory method for retrieving instances of EPerson PatchOperations. + * Provides factory methods for obtaining instances of eperson patch operations. * * @author Michael Spalti */ @@ -43,13 +43,13 @@ public class EPersonOperationFactory { private static final String OPERATION_SET_NETID = "/netid"; /** - * Returns the PatchOperation instance for the replace operation, based on - * the operation path. + * Returns the patch instance for the replace operation (based on the operation path). * * @param path the operation path - * @return + * @return the patch operation implementation */ - public ResourcePatchOperation getReplaceOperationForPath(String path) { + public ResourcePatchOperation getReplaceOperationForPath(String path) + throws PatchBadRequestException { switch (path) { case OPERATION_PASSWORD_CHANGE: diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java index 3596f01c2a..b63897db60 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java @@ -8,15 +8,15 @@ package org.dspace.app.rest.repository.patch.factories; import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.ItemRest; import org.dspace.app.rest.repository.patch.factories.impl.ItemDiscoverableReplaceOperation; import org.dspace.app.rest.repository.patch.factories.impl.ItemWithdrawReplaceOperation; import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation; -import org.dspace.content.Item; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** - * Provides factory method for instances of item PatchOperations. + * Provides factory methods for obtaining instances of item patch operations. * * @author Michael Spalti */ @@ -33,12 +33,13 @@ public class ItemOperationFactory { private static final String OPERATION_PATH_DISCOVERABLE = "/discoverable"; /** - * Returns the PatchOperation instance for the replace operation, based on the - * operation path. - * @param path - * @return + * Returns the patch instance for the replace operation (based on the operation path). + * + * @param path the operation path + * @return the patch operation implementation */ - public ResourcePatchOperation getReplaceOperationForPath(String path) { + public ResourcePatchOperation getReplaceOperationForPath(String path) + throws PatchBadRequestException { switch (path) { case OPERATION_PATH_DISCOVERABLE: diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java index 9ce97ec984..5b486bdc83 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java @@ -7,18 +7,13 @@ */ package org.dspace.app.rest.repository.patch.factories.impl; -import java.sql.SQLException; - -import org.apache.commons.lang.BooleanUtils; import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.core.Context; -import org.dspace.eperson.EPerson; import org.springframework.stereotype.Component; /** - * Implementation for EPerson requres certificate patches. + * Implementation for EPerson requires certificate patches. * * Example: * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H " @@ -29,27 +24,30 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonCertificateReplaceOperation extends PatchOperation - implements ResourcePatchOperation { - @Override - public void perform(Context context, EPerson resource, Operation operation) - throws SQLException, AuthorizeException, PatchBadRequestException { +public class EPersonCertificateReplaceOperation extends PatchOperation + implements ResourcePatchOperation { - replace(context, resource, operation); + /** + * Updates the certificate required status in the eperson rest model. + * @param resource the rest model + * @param operation + * @return the updated rest model + * @throws PatchBadRequestException + */ + @Override + public EPersonRest perform(EPersonRest resource, Operation operation) + throws PatchBadRequestException { + + return replace(resource, operation); } - private void replace(Context context, EPerson eperson, Operation operation) - throws PatchBadRequestException, SQLException, AuthorizeException { - - checkOperationValue((String) operation.getValue()); - Boolean requireCert = BooleanUtils.toBooleanObject((String) operation.getValue()); - - if (requireCert == null) { - // make sure the string was converted to boolean. - throw new PatchBadRequestException("Boolean value not provided for certificate operation."); - } + private EPersonRest replace(EPersonRest eperson, Operation operation) + throws PatchBadRequestException { + checkOperationValue(operation.getValue()); + Boolean requireCert = getBooleanOperationValue(operation.getValue()); eperson.setRequireCertificate(requireCert); + return eperson; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java index a27268a4ce..dbcb291bb5 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java @@ -7,16 +7,9 @@ */ package org.dspace.app.rest.repository.patch.factories.impl; -import java.sql.SQLException; - -import org.apache.commons.lang.BooleanUtils; import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.core.Context; -import org.dspace.eperson.EPerson; -import org.dspace.eperson.service.EPersonService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** @@ -31,30 +24,31 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonLoginReplaceOperation extends PatchOperation - implements ResourcePatchOperation { +public class EPersonLoginReplaceOperation extends PatchOperation + implements ResourcePatchOperation { - @Autowired - EPersonService epersonService; + /** + * Updates the canLogIn status in the eperson rest model. + * @param resource the rest model + * @param operation + * @return the updated rest model + * @throws PatchBadRequestException + */ @Override - public void perform(Context context, EPerson resource, Operation operation) - throws PatchBadRequestException, SQLException, AuthorizeException { + public EPersonRest perform(EPersonRest resource, Operation operation) + throws PatchBadRequestException { - replace(context, resource, operation); + return replace(resource, operation); } - private void replace(Context context, EPerson eperson, Operation operation) - throws PatchBadRequestException, SQLException, AuthorizeException { + private EPersonRest replace(EPersonRest eperson, Operation operation) + throws PatchBadRequestException { - checkOperationValue((String) operation.getValue()); - Boolean canLogin = BooleanUtils.toBooleanObject((String) operation.getValue()); - - if (canLogin == null) { - // make sure string was converted to boolean. - throw new PatchBadRequestException("Boolean value not provided for canLogin operation."); - } + checkOperationValue(operation.getValue()); + Boolean canLogin = getBooleanOperationValue(operation.getValue()); eperson.setCanLogIn(canLogin); + return eperson; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java index 3e97b37cea..0af368fa34 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java @@ -7,13 +7,9 @@ */ package org.dspace.app.rest.repository.patch.factories.impl; -import java.sql.SQLException; - import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.core.Context; -import org.dspace.eperson.EPerson; import org.springframework.stereotype.Component; /** @@ -28,21 +24,24 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonNetidReplaceOperation extends PatchOperation - implements ResourcePatchOperation { +public class EPersonNetidReplaceOperation extends PatchOperation + implements ResourcePatchOperation { + /** + * Updates the netid in the eperson rest model. + * @param resource the rest model + * @param operation + * @return the updated rest model + * @throws PatchBadRequestException + */ @Override - public void perform(Context context, EPerson resource, Operation operation) - throws SQLException, AuthorizeException, PatchBadRequestException { - - replace(context, resource, operation); - } - - private void replace(Context context, EPerson eperson, Operation operation) - throws PatchBadRequestException, SQLException, AuthorizeException { + public EPersonRest perform(EPersonRest resource, Operation operation) + throws PatchBadRequestException { checkOperationValue((String) operation.getValue()); - eperson.setNetid((String) operation.getValue()); + resource.setNetid((String) operation.getValue()); + return resource; + } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java index dbeed653a6..0958193e42 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java @@ -8,11 +8,8 @@ package org.dspace.app.rest.repository.patch.factories.impl; import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.core.Context; -import org.dspace.eperson.EPerson; -import org.dspace.eperson.service.EPersonService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** @@ -27,24 +24,24 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonPasswordReplaceOperation extends PatchOperation - implements ResourcePatchOperation { +public class EPersonPasswordReplaceOperation extends PatchOperation + implements ResourcePatchOperation { - @Autowired - EPersonService epersonService; + /** + * Updates the password in the eperson rest model. + * @param resource the rest model + * @param operation + * @return updated rest model + * @throws PatchBadRequestException + */ @Override - public void perform(Context context, EPerson resource, Operation operation) + public EPersonRest perform( EPersonRest resource, Operation operation) throws PatchBadRequestException { - replace(context, resource, operation); - } - - private void replace(Context context, EPerson ePerson, Operation operation) throws PatchBadRequestException { - - checkOperationValue((String) operation.getValue()); - - epersonService.setPassword(ePerson, (String) operation.getValue()); + checkOperationValue(operation.getValue()); + resource.setPassword((String) operation.getValue()); + return resource; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java index b6eeb2607e..d04ab87af0 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java @@ -7,17 +7,10 @@ */ package org.dspace.app.rest.repository.patch.factories.impl; -import java.sql.SQLException; - -import org.apache.commons.lang.BooleanUtils; import org.apache.log4j.Logger; import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.ItemRest; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.content.Item; -import org.dspace.content.service.ItemService; -import org.dspace.core.Context; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** @@ -32,49 +25,31 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class ItemDiscoverableReplaceOperation extends PatchOperation - implements ResourcePatchOperation { - - @Autowired - ItemService is; +public class ItemDiscoverableReplaceOperation extends PatchOperation + implements ResourcePatchOperation { private static final Logger log = Logger.getLogger(ItemDiscoverableReplaceOperation.class); /** - * Sets discoverable field on the item. - * - * @param item - * @param context - - * @throws SQLException - * @throws AuthorizeException + * Updates the discoverable in the item rest model. + * @param item the rest model + * @param operation + * @return updated rest model + * @throws PatchBadRequestException */ - public void perform(Context context, Item item, Operation operation) - throws SQLException, AuthorizeException, PatchBadRequestException { + public ItemRest perform(ItemRest item, Operation operation) + throws PatchBadRequestException { - replace(context, item, operation.getValue()); + return replace(item, operation); } - private void replace(Context context, Item item, Object value) - throws SQLException, AuthorizeException { + private ItemRest replace(ItemRest item, Operation operation) { - checkOperationValue((String) value); - Boolean discoverable = BooleanUtils.toBooleanObject((String) value); - - if (discoverable == null) { - // make sure string was converted to boolean. - throw new PatchBadRequestException( - "Boolean value not provided for discoverable operation."); - } - - try { - item.setDiscoverable(discoverable); - is.update(context, item); - } catch (SQLException | AuthorizeException e) { - log.error(e.getMessage(), e); - throw e; - } + checkOperationValue(operation.getValue()); + Boolean discoverable = getBooleanOperationValue(operation.getValue()); + item.setDiscoverable(discoverable); + return item; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java index 45b2b6efaa..9b5bce519b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java @@ -7,24 +7,17 @@ */ package org.dspace.app.rest.repository.patch.factories.impl; -import java.sql.SQLException; - -import org.apache.commons.lang.BooleanUtils; import org.apache.log4j.Logger; import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.ItemRest; +import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.content.Item; -import org.dspace.content.service.ItemService; -import org.dspace.core.Context; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - /** * This is the implementation for Item resource patches. - * + *

* Example: * curl -X PATCH http://${dspace.url}/api/item/<:id-item> -H " * Content-Type: application/json" -d '[{ "op": "replace", "path": " @@ -34,82 +27,58 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class ItemWithdrawReplaceOperation extends PatchOperation { +public class ItemWithdrawReplaceOperation extends PatchOperation { private static final Logger log = Logger.getLogger(ItemWithdrawReplaceOperation.class); - @Autowired - ItemService is; - /** - * Implementation of the PATCH replace operation. - * - * @param item - * @param context + * Updates the withdrawn in the item rest model. + * @param item the rest model * @param operation + * @return the updated rest model * @throws UnprocessableEntityException * @throws PatchBadRequestException - * @throws SQLException - * @throws AuthorizeException */ @Override - public void perform(Context context, Item item, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException { + public RestModel perform(ItemRest item, Operation operation) + throws UnprocessableEntityException, PatchBadRequestException { - replace(context, item, (String) operation.getValue()); + return replace(item, operation); } - /** - * Withdraws or reinstates the item based on boolean value provided in the patch request. - * - * @param item - * @param context - * @param value + private RestModel replace(ItemRest item, Operation operation) + throws PatchBadRequestException, UnprocessableEntityException { - * @throws PatchBadRequestException - * @throws SQLException - * @throws AuthorizeException - */ - private void replace(Context context, Item item, Object value) - throws PatchBadRequestException, SQLException, AuthorizeException { + checkOperationValue(operation.getValue()); + Boolean withdraw = getBooleanOperationValue(operation.getValue()); - checkOperationValue((String) value); - Boolean withdraw = BooleanUtils.toBooleanObject((String) value); - - if (withdraw == null) { - // make sure string was converted to boolean. - throw new PatchBadRequestException( - "Boolean value not provided for withdrawn operation.."); - } - - try { - // This is a request to withdraw the item. - if (withdraw) { - // The DSO is currently not withdrawn and also not archived. Is this a possible situation? - if (!item.isWithdrawn() && !item.isArchived()) { - throw new UnprocessableEntityException("Cannot withdraw item when it is not in archive."); - } - // Item is already withdrawn. No-op, 200 response. - // (The operation is not idempotent since it results in a provenance note in the record.) - if (item.isWithdrawn()) { - return; - } - is.withdraw(context, item); - } else { - // No need to reinstate item if it has not previously been not withdrawn. - // No-op, 200 response. (The operation is not idempotent since it results - // in a provenance note in the record.) - if (!item.isWithdrawn()) { - return; - } - is.reinstate(context, item); + // This is a request to withdraw the item. + if (withdraw) { + // The item is currently not withdrawn and also not archived. Is this a possible situation? + if (!item.getWithdrawn() && !item.getInArchive()) { + throw new UnprocessableEntityException("Cannot withdraw item when it is not in archive."); } + // Item is already withdrawn. No-op, 200 response. + // (The operation is not idempotent since it results in a provenance note in the record.) + if (item.getWithdrawn()) { + return item; + } + item.setWithdrawn(true); + return item; - } catch (SQLException | AuthorizeException e) { - log.error(e.getMessage(), e); - throw e; + } else { + // No need to reinstate item if it has not previously been not withdrawn. + // No-op, 200 response. (The operation is not idempotent since it results + // in a provenance note in the record.) + if (!item.getWithdrawn()) { + return item; + } + item.setWithdrawn(false); + return item; } + + } protected Class getArrayClassForEvaluation() { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java index c435a7d0c0..049a7ae045 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java @@ -7,23 +7,63 @@ */ package org.dspace.app.rest.repository.patch.factories.impl; -import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import org.apache.commons.lang.BooleanUtils; import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.content.DSpaceObject; -import org.dspace.core.Context; import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; -public abstract class PatchOperation - implements ResourcePatchOperation { +/** + * This patch class includes abstract and implemented methods that + * can be used to type check objects derived from operation values. + * + * @author Michael Spalti + */ +public abstract class PatchOperation + implements ResourcePatchOperation { - public abstract void perform(Context context, DSO resource, Operation operation) - throws SQLException, AuthorizeException, PatchBadRequestException; + public abstract RestModel perform(R resource, Operation operation) + throws PatchBadRequestException; + /** + * Throws PatchBadRequestException for missing operation value. + * @param value the value to test + */ + public void checkOperationValue(Object value) { + if (value == null) { + throw new PatchBadRequestException("No value provided for the operation."); + } + } + + /** + * Allows clients to use either a boolean or a string representation of boolean value. + * @param value the operation value + * @return the original or derived boolean value + */ + public Boolean getBooleanOperationValue(Object value) throws PatchBadRequestException { + Boolean bool; + + if (value instanceof String) { + bool = BooleanUtils.toBooleanObject((String) value); + if (bool == null) { + // make sure the string was converted to boolean. + throw new PatchBadRequestException("Boolean value not provided."); + } + } else { + bool = (Boolean) value; + } + return bool; + } + + // This is duplicated code (see org.dspace.app.rest.submit.factory.impl.PatchOperation) + // If it stays here, it should be DRY. Current patch resource patch operations do not + // use these methods since operation values are either strings or booleans. + // These methods handle JsonValueEvaluator instances for json objects and arrays, + // as returned by the JsonPatchConverter. A complete implementation of the PatchOperation + // class will need these methods. public List evaluateArrayObject(LateObjectEvaluator value) { List results = new ArrayList(); T[] list = null; @@ -48,17 +88,17 @@ public abstract class PatchOperation } /** - * Throws PatchBadRequestException for missing operation value. - * @param value the value to check + * This method should return the typed array to be used in the + * LateObjectEvaluator evaluation of json arrays. + * @return */ - public void checkOperationValue(T value) { - if (value == null) { - throw new PatchBadRequestException("No value provided for the operation."); - } - } - protected abstract Class getArrayClassForEvaluation(); + /** + * This method should return the object type to be used in the + * LateObjectEvaluator evaluation of json objects. + * @return + */ protected abstract Class getClassForEvaluation(); } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java index 775bf45d90..d72116a720 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java @@ -7,17 +7,25 @@ */ package org.dspace.app.rest.repository.patch.factories.impl; -import java.sql.SQLException; - import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.patch.Operation; -import org.dspace.authorize.AuthorizeException; -import org.dspace.content.DSpaceObject; -import org.dspace.core.Context; -public interface ResourcePatchOperation { +/** + * The interface for repository patch operations. + * + * @author Michael Spalti + */ +public interface ResourcePatchOperation { - void perform(Context context, DSO resource, Operation operation) - throws SQLException, AuthorizeException, PatchBadRequestException; + /** + * Updates the rest model by applying the patch operation. + * @param resource the rest model + * @param operation + * @return the updated rest model + * @throws PatchBadRequestException + */ + RestModel perform(R resource, Operation operation) + throws PatchBadRequestException; } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index cbdeb6394b..f573a845c5 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -11,6 +11,7 @@ import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; @@ -519,6 +520,66 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(status().isOk()); } + @Test + public void patchByForbiddenUser() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(eperson.getEmail(), password); + + // should be forbidden. + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); + + token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is(nullValue()))); + + } + + @Test + public void patchByAnonymousUser() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + // should be unauthorized. + getClient().perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); + + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is(nullValue()))); + + } + @Test public void patchNetId() throws Exception { @@ -540,8 +601,10 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.netid", Matchers.is("newNetId"))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is("newNetId"))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.canLogIn", Matchers.is(false))); } @@ -556,12 +619,27 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .withEmail("Johndoe@fake-email.com") .build(); + String newId = "newId"; + + String token = getAuthToken(admin.getEmail(), password); + List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/netid", null); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", newId); ops.add(replaceOperation); String patchBody = getPatchContent(ops); - String token = getAuthToken(admin.getEmail(), password); + // initialize to true + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is(newId))); + + + List ops2 = new ArrayList(); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/netid", null); + ops2.add(replaceOperation2); + patchBody = getPatchContent(ops2); // should return bad request getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) @@ -569,6 +647,14 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isBadRequest()); + // value should be unchanged. + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is(newId))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.canLogIn", Matchers.is(false))); + + } @Test @@ -593,7 +679,10 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.canLogIn", Matchers.is(true))); + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.netid", Matchers.nullValue())); + } @@ -607,12 +696,25 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .withEmail("Johndoe@fake-email.com") .build(); + String token = getAuthToken(admin.getEmail(), password); + List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/canLogin", null); + ReplaceOperation replaceOperation = new ReplaceOperation("/canLogin", "true"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); - String token = getAuthToken(admin.getEmail(), password); + // initialize to true + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true)));; + + + List ops2 = new ArrayList(); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/canLogin", null); + ops2.add(replaceOperation2); + patchBody = getPatchContent(ops2); // should return bad request getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) @@ -620,6 +722,12 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isBadRequest()); + // value should still be true. + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(false))); } @@ -634,7 +742,8 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .build(); List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/certificate", "false"); + // Boolean operations should accept either string or boolean as value. Try boolean. + ReplaceOperation replaceOperation = new ReplaceOperation("/certificate", false); ops.add(replaceOperation); String patchBody = getPatchContent(ops); @@ -645,7 +754,9 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.requireCertificate", Matchers.is(false))); + .andExpect(jsonPath("$.requireCertificate", Matchers.is(false))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.netid", Matchers.nullValue())); } @@ -659,12 +770,24 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .withEmail("Johndoe@fake-email.com") .build(); + String token = getAuthToken(admin.getEmail(), password); + List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/certificate", null); + ReplaceOperation replaceOperation = new ReplaceOperation("/certificate", "true"); ops.add(replaceOperation); String patchBody = getPatchContent(ops); - String token = getAuthToken(admin.getEmail(), password); + // initialize to true + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(true)));; + + List ops2 = new ArrayList(); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/certificate",null); + ops2.add(replaceOperation2); + patchBody = getPatchContent(ops2); // should return bad request getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) @@ -672,6 +795,14 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isBadRequest()); + // value should still be true. + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(true))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.canLogIn", Matchers.is(false))); + + } @Test @@ -700,7 +831,6 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(status().isOk()); // login with new password - // TODO is this a valid test? token = getAuthToken(ePerson.getEmail(), newPassword); getClient(token).perform(get("/api/")) .andExpect(status().isOk()); @@ -717,13 +847,26 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .withEmail("Johndoe@fake-email.com") .build(); + String token = getAuthToken(admin.getEmail(), password); + + String newPassword = "newpass"; List ops = new ArrayList(); - ReplaceOperation replaceOperation = new ReplaceOperation("/password", null); + ReplaceOperation replaceOperation = new ReplaceOperation("/password", newPassword); ops.add(replaceOperation); String patchBody = getPatchContent(ops); - String token = getAuthToken(admin.getEmail(), password); + // initialize passwd + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()); + + + List ops2 = new ArrayList(); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/password", null); + ops2.add(replaceOperation2); + patchBody = getPatchContent(ops2); // should return bad request getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) @@ -731,6 +874,91 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isBadRequest()); + // login with original password + token = getAuthToken(ePerson.getEmail(), newPassword); + getClient(token).perform(get("/api/")) + .andExpect(status().isOk()); + + } + + @Test + public void patchMultipleOperationsWithSuccess() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + + ReplaceOperation replaceOperation1 = new ReplaceOperation("/canLogin", "true"); + ops.add(replaceOperation1); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/netid", "multitestId"); + ops.add(replaceOperation2); + ReplaceOperation replaceOperation3 = new ReplaceOperation("/certificate", "true"); + ops.add(replaceOperation3); + String patchBody = getPatchContent(ops); + + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))) + .andExpect(jsonPath("$.netid", Matchers.is("multitestId"))) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(true))); + + } + + @Test + public void patchMultipleOperationsWithFailure() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation0 = new ReplaceOperation("/canLogin", "true"); + ops.add(replaceOperation0); + String patchBody = getPatchContent(ops); + + // Initialized canLogIn value is true. + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))); + + // The first operation in the series sets canLogIn to be false. + ReplaceOperation replaceOperation1 = new ReplaceOperation("/canLogin", "false"); + ops.add(replaceOperation1); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/certificate", "true"); + ops.add(replaceOperation2); + // This will fail. + ReplaceOperation replaceOperation3 = new ReplaceOperation("/cert", "false"); + ops.add(replaceOperation3); + ReplaceOperation replaceOperation4 = new ReplaceOperation("/certificate", "false"); + ops.add(replaceOperation4); + patchBody = getPatchContent(ops); + + // The 3rd operations should result in bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + // The value of canLogIn should equal the previously initialized value. + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))); } From 7e4194b3a4d5ff4b5f994c3df213eb42f779921b Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Tue, 9 Oct 2018 14:10:44 -0700 Subject: [PATCH 086/193] [DS-4021] Replace patch operations on a non-existent value now result in a PatchBadRequestException. Added missing license headers. --- .../rest/repository/patch/EPersonPatch.java | 2 +- .../app/rest/repository/patch/ItemPatch.java | 2 +- .../EPersonCertificateReplaceOperation.java | 13 ++--- .../impl/EPersonLoginReplaceOperation.java | 14 ++--- .../impl/EPersonNetidReplaceOperation.java | 22 ++++---- .../impl/EPersonPasswordReplaceOperation.java | 29 ++++++----- .../ItemDiscoverableReplaceOperation.java | 15 ++---- .../impl/ItemWithdrawReplaceOperation.java | 17 ++----- .../patch/factories/impl/PatchOperation.java | 22 ++++++-- .../factories/impl/ReplacePatchOperation.java | 51 +++++++++++++++++++ .../impl/ResourcePatchOperation.java | 14 ++--- .../app/rest/EPersonRestRepositoryIT.java | 34 +++++++++++++ .../app/rest/builder/EPersonBuilder.java | 5 ++ 13 files changed, 157 insertions(+), 83 deletions(-) create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java index 67acd125f0..f7196ed512 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java @@ -38,7 +38,7 @@ public class EPersonPatch extends AbstractResourcePatch { ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); - return (EPersonRest) patchOperation.perform(eperson, operation); + return patchOperation.perform(eperson, operation); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java index 257604959b..b2126bfdbc 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java @@ -38,7 +38,7 @@ public class ItemPatch extends AbstractResourcePatch { ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); - return (ItemRest) patchOperation.perform(item, operation); + return patchOperation.perform(item, operation); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java index 5b486bdc83..2450f28478 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java @@ -24,16 +24,9 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonCertificateReplaceOperation extends PatchOperation +public class EPersonCertificateReplaceOperation extends ReplacePatchOperation implements ResourcePatchOperation { - /** - * Updates the certificate required status in the eperson rest model. - * @param resource the rest model - * @param operation - * @return the updated rest model - * @throws PatchBadRequestException - */ @Override public EPersonRest perform(EPersonRest resource, Operation operation) throws PatchBadRequestException { @@ -41,10 +34,12 @@ public class EPersonCertificateReplaceOperation extends PatchOperation +public class EPersonLoginReplaceOperation extends ReplacePatchOperation implements ResourcePatchOperation { - - /** - * Updates the canLogIn status in the eperson rest model. - * @param resource the rest model - * @param operation - * @return the updated rest model - * @throws PatchBadRequestException - */ @Override public EPersonRest perform(EPersonRest resource, Operation operation) throws PatchBadRequestException { @@ -42,10 +34,12 @@ public class EPersonLoginReplaceOperation extends PatchOperation +public class EPersonNetidReplaceOperation extends ReplacePatchOperation implements ResourcePatchOperation { - /** - * Updates the netid in the eperson rest model. - * @param resource the rest model - * @param operation - * @return the updated rest model - * @throws PatchBadRequestException - */ @Override public EPersonRest perform(EPersonRest resource, Operation operation) throws PatchBadRequestException { - checkOperationValue((String) operation.getValue()); - resource.setNetid((String) operation.getValue()); - return resource; + return replace(resource, operation); } + @Override + EPersonRest replace(EPersonRest eperson, Operation operation) throws PatchBadRequestException { + + checkOperationValue(operation.getValue()); + checkModelForExistingValue(eperson.getNetid()); + eperson.setNetid((String) operation.getValue()); + return eperson; + } + @Override protected Class getArrayClassForEvaluation() { return String[].class; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java index 0958193e42..9ce38ae006 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java @@ -24,25 +24,28 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonPasswordReplaceOperation extends PatchOperation - implements ResourcePatchOperation { +public class EPersonPasswordReplaceOperation extends ReplacePatchOperation { - - /** - * Updates the password in the eperson rest model. - * @param resource the rest model - * @param operation - * @return updated rest model - * @throws PatchBadRequestException - */ @Override public EPersonRest perform( EPersonRest resource, Operation operation) throws PatchBadRequestException { - checkOperationValue(operation.getValue()); - resource.setPassword((String) operation.getValue()); - return resource; + return replace(resource, operation); + } + @Override + EPersonRest replace(EPersonRest eperson, Operation operation) throws PatchBadRequestException { + + // The value must not be null. + checkOperationValue(operation.getValue()); + /* + * TODO: the password field in eperson rest model is always null (initially) since + * the password value is not set by eperson converter.fromModel() method. So for now, + * not calling checkModelForExistingValue() or throwing error when replacing what + * appears to be a non-existent value. + */ + eperson.setPassword((String) operation.getValue()); + return eperson; } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java index d04ab87af0..38921ab4fe 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java @@ -25,18 +25,11 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class ItemDiscoverableReplaceOperation extends PatchOperation - implements ResourcePatchOperation { +public class ItemDiscoverableReplaceOperation extends ReplacePatchOperation { private static final Logger log = Logger.getLogger(ItemDiscoverableReplaceOperation.class); - /** - * Updates the discoverable in the item rest model. - * @param item the rest model - * @param operation - * @return updated rest model - * @throws PatchBadRequestException - */ + @Override public ItemRest perform(ItemRest item, Operation operation) throws PatchBadRequestException { @@ -44,9 +37,11 @@ public class ItemDiscoverableReplaceOperation extends PatchOperation { +public class ItemWithdrawReplaceOperation extends ReplacePatchOperation { private static final Logger log = Logger.getLogger(ItemWithdrawReplaceOperation.class); - /** - * Updates the withdrawn in the item rest model. - * @param item the rest model - * @param operation - * @return the updated rest model - * @throws UnprocessableEntityException - * @throws PatchBadRequestException - */ @Override - public RestModel perform(ItemRest item, Operation operation) + public ItemRest perform(ItemRest item, Operation operation) throws UnprocessableEntityException, PatchBadRequestException { return replace(item, operation); } - private RestModel replace(ItemRest item, Operation operation) + @Override + public ItemRest replace(ItemRest item, Operation operation) throws PatchBadRequestException, UnprocessableEntityException { checkOperationValue(operation.getValue()); + checkModelForExistingValue(item.getWithdrawn()); Boolean withdraw = getBooleanOperationValue(operation.getValue()); // This is a request to withdraw the item. diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java index 049a7ae045..170d4c6362 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java @@ -17,22 +17,31 @@ import org.dspace.app.rest.model.patch.Operation; import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; /** - * This patch class includes abstract and implemented methods that - * can be used to type check objects derived from operation values. + * Base class for all patch operations. This class includes methods that + * can be used to type check objects that are converted from json. * * @author Michael Spalti */ public abstract class PatchOperation implements ResourcePatchOperation { - public abstract RestModel perform(R resource, Operation operation) + /** + * Updates the rest model by applying the patch operation. + * + * @param resource the rest model + * @param operation + * @return the updated rest model + * @throws PatchBadRequestException + */ + public abstract R perform(R resource, Operation operation) throws PatchBadRequestException; /** * Throws PatchBadRequestException for missing operation value. + * * @param value the value to test */ - public void checkOperationValue(Object value) { + void checkOperationValue(Object value) { if (value == null) { throw new PatchBadRequestException("No value provided for the operation."); } @@ -40,10 +49,11 @@ public abstract class PatchOperation /** * Allows clients to use either a boolean or a string representation of boolean value. + * * @param value the operation value * @return the original or derived boolean value */ - public Boolean getBooleanOperationValue(Object value) throws PatchBadRequestException { + Boolean getBooleanOperationValue(Object value) throws PatchBadRequestException { Boolean bool; if (value instanceof String) { @@ -90,6 +100,7 @@ public abstract class PatchOperation /** * This method should return the typed array to be used in the * LateObjectEvaluator evaluation of json arrays. + * * @return */ protected abstract Class getArrayClassForEvaluation(); @@ -97,6 +108,7 @@ public abstract class PatchOperation /** * This method should return the object type to be used in the * LateObjectEvaluator evaluation of json objects. + * * @return */ protected abstract Class getClassForEvaluation(); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java new file mode 100644 index 0000000000..f8f71acfd5 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java @@ -0,0 +1,51 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.factories.impl; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.RestModel; +import org.dspace.app.rest.model.patch.Operation; + +/** + * The base class for replace operations. + * + * @param + * @param + */ +public abstract class ReplacePatchOperation + extends PatchOperation { + + @Override + public abstract R perform(R resource, Operation operation) + throws PatchBadRequestException; + + /** + * Executes the replace patch operation. + * + * @param resource + * @param operation + * @return + * @throws PatchBadRequestException + */ + abstract R replace(R resource, Operation operation) + throws PatchBadRequestException; + + /** + * Replace operations are not allowed on non-existent values. + * Null values may exist in the RestModel for certain fields + * (usually non-boolean). + * + * @param value the rest model value to be replaced. + * @throws PatchBadRequestException + */ + void checkModelForExistingValue(Object value) throws PatchBadRequestException { + if (value == null) { + throw new PatchBadRequestException("Attempting to replace a non-existent value."); + } + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java index d72116a720..dc531b40fe 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java @@ -12,20 +12,12 @@ import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.patch.Operation; /** - * The interface for repository patch operations. - * - * @author Michael Spalti + * The patch interface used by repository classes. + * @param */ public interface ResourcePatchOperation { - /** - * Updates the rest model by applying the patch operation. - * @param resource the rest model - * @param operation - * @return the updated rest model - * @throws PatchBadRequestException - */ - RestModel perform(R resource, Operation operation) + R perform(R resource, Operation operation) throws PatchBadRequestException; } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index f573a845c5..c109f6b752 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -588,6 +588,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withNetId("testId") .build(); List ops = new ArrayList(); @@ -608,6 +609,35 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { } + @Test + public void replaceOnNonExistentValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // update of netId should fail. + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.netid", Matchers.nullValue())); + + } @Test public void patchNetIdMissingValue() throws Exception { @@ -617,6 +647,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withNetId("testId") .build(); String newId = "newId"; @@ -813,6 +844,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withPassword("7Testpass") .build(); String newPassword = "newpassword"; @@ -845,6 +877,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withPassword("testpass79bC") .build(); String token = getAuthToken(admin.getEmail(), password); @@ -889,6 +922,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withNetId("testId") .build(); String token = getAuthToken(admin.getEmail(), password); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java index 78e9d858bf..10c04479e9 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java @@ -78,6 +78,11 @@ public class EPersonBuilder extends AbstractDSpaceObjectBuilder { return this; } + public EPersonBuilder withNetId(final String netId) { + ePerson.setNetid(netId); + return this; + } + public EPersonBuilder withPassword(final String password) { ePerson.setCanLogIn(true); ePersonService.setPassword(ePerson, password); From b6a35ebaf767b58dff4587d32a1543e4b4d25e30 Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Wed, 10 Oct 2018 11:35:36 +0200 Subject: [PATCH 087/193] DS-3580 simplify the interface retrieving the filename from the multipartfile upload Add additional Javadoc Better align the interface with the Angular implementation --- .../app/rest/RestResourceController.java | 20 +++-------- .../rest/repository/DSpaceRestRepository.java | 14 +++----- .../WorkspaceItemRestRepository.java | 8 ++--- .../app/rest/submit/UploadableStep.java | 19 +++++++++- .../rest/submit/step/ExtractMetadataStep.java | 4 +-- .../app/rest/submit/step/UploadStep.java | 5 +-- .../java/org/dspace/app/rest/utils/Utils.java | 36 +++++++++++++++++++ .../rest/WorkspaceItemRestRepositoryIT.java | 29 +++++++++------ 8 files changed, 89 insertions(+), 46 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index bb9964e20b..f9e80125e3 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -444,8 +444,6 @@ public class RestResourceController implements InitializingBean { * the rest model that identify the REST resource collection * @param id * the id of the specific rest resource - * @param extraField - * the original name of the uploaded file * @param uploadfile * the file to upload * @return the created resource @@ -457,12 +455,10 @@ public class RestResourceController implements InitializingBean { @PathVariable String apiCategory, @PathVariable String model, @PathVariable Integer id, - @RequestParam(required = false, value = - "extraField") String extraField, @RequestParam("file") MultipartFile uploadfile) throws HttpRequestMethodNotSupportedException { - return uploadInternal(request, apiCategory, model, id, extraField, uploadfile); + return uploadInternal(request, apiCategory, model, id, uploadfile); } /** @@ -478,8 +474,6 @@ public class RestResourceController implements InitializingBean { * the rest model that identify the REST resource collection * @param id * the id of the specific rest resource - * @param extraField - * the original name of the uploaded file * @param uploadfile * the file to upload * @return the created resource @@ -491,12 +485,10 @@ public class RestResourceController implements InitializingBean { @PathVariable String apiCategory, @PathVariable String model, @PathVariable UUID id, - @RequestParam(required = false, value = - "extraField") String extraField, @RequestParam("file") MultipartFile uploadfile) throws HttpRequestMethodNotSupportedException { - return uploadInternal(request, apiCategory, model, id, extraField, uploadfile); + return uploadInternal(request, apiCategory, model, id, uploadfile); } /** @@ -506,21 +498,19 @@ public class RestResourceController implements InitializingBean { * @param apiCategory * @param model * @param id - * @param extraField * @param uploadfile * @return */ private ResponseEntity uploadInternal(HttpServletRequest request, String apiCategory, String model, ID id, - String extraField, MultipartFile uploadfile) { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); RestAddressableModel modelObject = null; try { - modelObject = repository.upload(request, apiCategory, model, id, extraField, uploadfile); + modelObject = repository.upload(request, apiCategory, model, id, uploadfile); } catch (Exception e) { log.error(e.getMessage(), e); return ControllerUtils.toEmptyResponse(HttpStatus.INTERNAL_SERVER_ERROR); @@ -552,8 +542,6 @@ public class RestResourceController implements InitializingBean { public ResponseEntity upload(HttpServletRequest request, @PathVariable String apiCategory, @PathVariable String model, - @RequestParam(required = false) - String extraField, @RequestParam("file") MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { @@ -561,7 +549,7 @@ public class RestResourceController implements InitializingBean { checkModelPluralForm(apiCategory, model); DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model); - Iterable content = repository.upload(request, extraField, uploadfile); + Iterable content = repository.upload(request, uploadfile); List resources = new ArrayList<>(); for (T modelObject : content) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java index 181af6b2e1..e853121c6f 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java @@ -298,15 +298,13 @@ public abstract class DSpaceRestRepository upload(HttpServletRequest request, String extraField, MultipartFile uploadfile) + public Iterable upload(HttpServletRequest request, MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { Context context = obtainContext(); - Iterable entity = upload(context, request, extraField, uploadfile); + Iterable entity = upload(context, request, uploadfile); context.commit(); return entity; } @@ -396,8 +392,6 @@ public abstract class DSpaceRestRepository upload(Context context, HttpServletRequest request, String extraField, + protected Iterable upload(Context context, HttpServletRequest request, MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java index 98ce42b614..036405bfa3 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java @@ -219,7 +219,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository upload(Context context, HttpServletRequest request, String extraField, + public Iterable upload(Context context, HttpServletRequest request, MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { File file = Utils.getFile(uploadfile, "upload-loader", "filedataloader"); @@ -467,7 +467,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository Date: Wed, 10 Oct 2018 16:38:43 +0200 Subject: [PATCH 088/193] introduces tests for OpenSearchController --- .../test/data/dspaceFolder/config/local.cfg | 31 +++ .../dspace/app/rest/OpenSearchController.java | 109 +++++----- .../OpenSearchControllerDisabledTest.java | 200 ++++++++++++++++++ .../opensearch/OpenSearchControllerTest.java | 145 +++++++++++++ 4 files changed, 428 insertions(+), 57 deletions(-) create mode 100644 dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java create mode 100644 dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java diff --git a/dspace-api/src/test/data/dspaceFolder/config/local.cfg b/dspace-api/src/test/data/dspaceFolder/config/local.cfg index 96ebb8b5e7..5f360ea693 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/local.cfg +++ b/dspace-api/src/test/data/dspaceFolder/config/local.cfg @@ -105,3 +105,34 @@ plugin.sequence.java.util.Collection = \ java.util.LinkedList, \ java.util.Stack, \ java.util.TreeSet + +#### OpenSearch Settings #### +# NB: for result data formatting, OpenSearch uses Syndication Feed Settings +# so even if Syndication Feeds are not enabled, they must be configured +# enable open search +websvc.opensearch.enable = true +# context for html request URLs - change only for non-standard servlet mapping +websvc.opensearch.uicontext = simple-search +# context for RSS/Atom request URLs - change only for non-standard servlet mapping +websvc.opensearch.svccontext = open-search/ +# present autodiscovery link in every page head +websvc.opensearch.autolink = true +# number of hours to retain results before recalculating +websvc.opensearch.validity = 48 +# short name used in browsers for search service +# should be 16 or fewer characters +websvc.opensearch.shortname = DS7 OpenSearch +# longer (up to 48 characters) name +websvc.opensearch.longname = DSpace 7 OpenSearch Service +# brief service description +websvc.opensearch.description = OpenSearch Service for DSpace 7 +# location of favicon for service, if any must be 16X16 pixels +websvc.opensearch.faviconurl = http://www.dspace.org/images/favicon.ico +# sample query - should return results +websvc.opensearch.samplequery = cats +# tags used to describe search service +websvc.opensearch.tags = IR DSpace +# result formats offered - use 1 or more comma-separated from: html,atom,rss +# NB: html is required for autodiscovery in browsers to function, +# and must be the first in the list if present +websvc.opensearch.formats = html,atom,rss diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java index b260559053..f764dd1e1b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java @@ -18,39 +18,39 @@ import javax.servlet.http.HttpServletResponse; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; -import javax.xml.transform.stream.StreamResult; import javax.xml.transform.dom.DOMSource; -import org.w3c.dom.Document; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.boot.autoconfigure.web.ErrorController; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.beans.factory.annotation.Autowired; +import javax.xml.transform.stream.StreamResult; import org.apache.log4j.Logger; -import org.dspace.app.rest.utils.ScopeResolver; import org.dspace.app.rest.utils.ContextUtil; +import org.dspace.app.rest.utils.ScopeResolver; +import org.dspace.app.util.SyndicationFeed; +import org.dspace.app.util.factory.UtilServiceFactory; import org.dspace.app.util.service.OpenSearchService; -import org.dspace.core.LogManager; -import org.dspace.core.Context; +import org.dspace.authorize.factory.AuthorizeServiceFactory; +import org.dspace.authorize.service.AuthorizeService; +import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; import org.dspace.content.service.CommunityService; -import org.dspace.content.DSpaceObject; -import org.dspace.app.util.SyndicationFeed; -import org.dspace.app.util.factory.UtilServiceFactory; -import org.dspace.discovery.SearchUtils; -import org.dspace.discovery.configuration.DiscoveryConfiguration; +import org.dspace.core.Context; +import org.dspace.core.LogManager; import org.dspace.discovery.DiscoverQuery; import org.dspace.discovery.DiscoverResult; import org.dspace.discovery.SearchServiceException; +import org.dspace.discovery.SearchUtils; +import org.dspace.discovery.configuration.DiscoveryConfiguration; import org.dspace.discovery.configuration.DiscoverySearchFilter; -import org.dspace.authorize.factory.AuthorizeServiceFactory; -import org.dspace.authorize.service.AuthorizeService; + +import org.springframework.boot.autoconfigure.web.ErrorController; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import org.w3c.dom.Document; /** * This class provides a controller for OpenSearch support. @@ -80,10 +80,10 @@ public class OpenSearchController implements ErrorController { @GetMapping("/search") public void search(HttpServletRequest request, HttpServletResponse response, - @RequestParam(name="query", required=false) String query, - @RequestParam(name="start", required=false) Integer start, - @RequestParam(name="rpp", required=false) Integer count, - @RequestParam(name="format", required=false) String format, + @RequestParam(name = "query", required = false) String query, + @RequestParam(name = "start", required = false) Integer start, + @RequestParam(name = "rpp", required = false) Integer count, + @RequestParam(name = "format", required = false) String format, Model model) throws IOException, ServletException { context = ContextUtil.obtainContext(request); if (start == null) { @@ -92,22 +92,23 @@ public class OpenSearchController implements ErrorController { if (count == null) { count = -1; } - openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + if (openSearchService == null) { + openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + } if (openSearchService.isEnabled()) { + init(); // get enough request parameters to decide on action to take - if (format == null || "".equals(format)) - { + if (format == null || "".equals(format)) { // default to atom format = "atom"; } - log.debug("Searching for "+query+" in format "+format); + log.debug("Searching for " + query + " in format " + format); // do some sanity checking // TODO: make that work correctly - if (!openSearchService.getFormats().contains(format)) - { - String err = "Format "+format+" is not supported."; + if (!openSearchService.getFormats().contains(format)) { + String err = "Format " + format + " is not supported."; response.setContentType("text/html"); response.setContentLength(err.length()); response.getWriter().write(err); @@ -126,13 +127,10 @@ public class OpenSearchController implements ErrorController { // Perform the search DiscoverResult qResults = null; - try - { + try { qResults = SearchUtils.getSearchService().search(context, container, queryArgs); - } - catch (SearchServiceException e) - { + } catch (SearchServiceException e) { log.error( LogManager.getHeader(context, "opensearch", "query=" + queryArgs.getQuery() @@ -150,20 +148,16 @@ public class OpenSearchController implements ErrorController { Document resultsDoc = openSearchService.getResultsDoc(context, format, query, (int) qResults.getTotalSearchResults(), qResults.getStart(), qResults.getMaxResults(), container, dsoResults, labelMap); - try - { + try { Transformer xf = TransformerFactory.newInstance().newTransformer(); response.setContentType(openSearchService.getContentType(format)); xf.transform(new DOMSource(resultsDoc), new StreamResult(response.getWriter())); - } - catch (TransformerException e) - { + } catch (TransformerException e) { log.error(e); throw new ServletException(e.toString()); } - } - else { + } else { log.debug("OpenSearch Service is disabled"); String err = "OpenSearch Service is disabled"; response.setContentType("text/html"); @@ -180,16 +174,17 @@ public class OpenSearchController implements ErrorController { public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { log.debug("Show OpenSearch Service document"); - openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + if (openSearchService == null) { + openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + } if (openSearchService.isEnabled()) { String svcDescrip = openSearchService.getDescription(null); - log.debug("opensearchdescription is "+svcDescrip); + log.debug("opensearchdescription is " + svcDescrip); response.setContentType(openSearchService .getContentType("opensearchdescription")); response.setContentLength(svcDescrip.length()); response.getWriter().write(svcDescrip); - } - else { + } else { log.debug("OpenSearch Service is disabled"); String err = "OpenSearch Service is disabled"; response.setContentType("text/html"); @@ -212,16 +207,13 @@ public class OpenSearchController implements ErrorController { * Internal method for controller initialization * Not used currently */ - private void init() - { - if (searchIndices == null) - { + private void init() { + if (searchIndices == null) { searchIndices = new ArrayList(); DiscoveryConfiguration discoveryConfiguration = SearchUtils .getDiscoveryConfiguration(); searchIndices.add("any"); - for (DiscoverySearchFilter sFilter : discoveryConfiguration.getSearchFilters()) - { + for (DiscoverySearchFilter sFilter : discoveryConfiguration.getSearchFilters()) { searchIndices.add(sFilter.getIndexFieldName()); } } @@ -230,19 +222,22 @@ public class OpenSearchController implements ErrorController { authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); } + public void setOpenSearchService(OpenSearchService oSS) { + openSearchService = oSS; + } + + /** * Internal method to get labels for the returned document */ - private Map getLabels(HttpServletRequest request) - { + private Map getLabels(HttpServletRequest request) { // TODO: get strings from translation file or configuration Map labelMap = new HashMap(); labelMap.put(SyndicationFeed.MSG_UNTITLED, "notitle"); labelMap.put(SyndicationFeed.MSG_LOGO_TITLE, "logo.title"); labelMap.put(SyndicationFeed.MSG_FEED_DESCRIPTION, "general-feed.description"); labelMap.put(SyndicationFeed.MSG_UITYPE, SyndicationFeed.UITYPE_JSPUI); - for (String selector : SyndicationFeed.getDescriptionSelectors()) - { + for (String selector : SyndicationFeed.getDescriptionSelectors()) { labelMap.put("metadata." + selector, selector); } return labelMap; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java new file mode 100644 index 0000000000..6571477f3c --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java @@ -0,0 +1,200 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.opensearch; + +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.springframework.mock.web.MockHttpServletResponse; + +/* +import org.dspace.app.rest.OpenSearchController; +import org.dspace.services.ConfigurationService; +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.util.service.OpenSearchService; +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.Item; +import org.dspace.eperson.Group; +*/ +import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.junit.Test; +import org.junit.Before; +import org.springframework.test.web.servlet.MockMvc; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; + +/** + * Integration test to test the /opensearch endpoint + * (Class has to start or end with IT to be picked up by the failsafe plugin) + * + * @author Oliver Goldschmidt (o dot goldschmidt at tuhh dot de) + */ +public class OpenSearchControllerDisabledTest extends AbstractControllerIntegrationTest { + + private ConfigurationService configurationService; + + @Before + public void init() throws Exception { + configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + configurationService.setProperty("websvc.opensearch.enable", false); +/* +System.out.println("Testing OpenSearch"); +MockHttpServletResponse resp2 = getClient().perform(get("/opensearch/search") + .param("query", "dog")) + .andReturn().getResponse(); +System.out.println("Response from Test 2: "+resp2.getContentAsString()); +*/ + } + + @Test + public void searchTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "dog")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType("text/html")) +/* + //Our default Discovery config has 4 browse indexes so we expect this to be reflected in the page + // object + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(4))) + .andExpect(jsonPath("$.page.totalPages", is(1))) + .andExpect(jsonPath("$.page.number", is(0))) + + //The array of browse index should have a size 4 + .andExpect(jsonPath("$._embedded.browses", hasSize(4))) + + //Check that all (and only) the default browse indexes are present + .andExpect(jsonPath("$._embedded.browses", containsInAnyOrder( + BrowseIndexMatcher.dateIssuedBrowseIndex("asc"), + BrowseIndexMatcher.contributorBrowseIndex("asc"), + BrowseIndexMatcher.titleBrowseIndex("asc"), + BrowseIndexMatcher.subjectBrowseIndex("asc") + ))) +*/ + ; + } + + @Test + public void serviceDocumentTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/service")) + //The status has to be 200 OK + .andExpect(status().isOk()) + .andExpect(content().contentType("text/html")) + //We expect the content type to be "application/hal+json;charset=UTF-8" +// .andExpect(content().contentType(contentType)) +/* + //Check that the JSON root matches the expected browse index + .andExpect(jsonPath("$", BrowseIndexMatcher.titleBrowseIndex("asc"))) +*/ + ; + } + +/* + @Test + public void findItemsWithOU() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("Public item 2") + .withIssueDate("2016-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("Public item 2") + .withIssueDate("2016-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + + //** WHEN ** + //An anonymous user browses this endpoint to find which subjects are currently in the repository + getClient().perform(get("/api/discover/browses/subject/entries")) + + //** THEN ** + //The status has to be 200 + .andExpect(status().isOk()) + + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$.page.size", is(20))) + //Check that there are indeed 3 different subjects + .andExpect(jsonPath("$.page.totalElements", is(3))) + //Check the embedded resources and that they're sorted alphabetically + //Check that the subject matches as expected + //Verify that they're sorted alphabetically + .andExpect(jsonPath("$._embedded.browseEntries", + contains(BrowseEntryResourceMatcher.matchBrowseEntry("AnotherTest", 1), + BrowseEntryResourceMatcher.matchBrowseEntry("ExtraEntry", 3), + BrowseEntryResourceMatcher.matchBrowseEntry("TestingForMore", 2) + ))); + + getClient().perform(get("/api/discover/browses/subject/entries") + .param("sort", "value,desc")) + + //** THEN ** + //The status has to be 200 + .andExpect(status().isOk()) + .andDo(MockMvcResultHandlers.print()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$.page.size", is(20))) + //Check that there are indeed 3 different subjects + .andExpect(jsonPath("$.page.totalElements", is(3))) + //Check the embedded resources and that they're sorted alphabetically + //Check that the subject matches as expected + //Verify that they're sorted alphabetically + .andExpect(jsonPath("$._embedded.browseEntries", + contains(BrowseEntryResourceMatcher.matchBrowseEntry("TestingForMore", 2), + BrowseEntryResourceMatcher.matchBrowseEntry("ExtraEntry", 3), + BrowseEntryResourceMatcher.matchBrowseEntry("AnotherTest", 1) + ))); + } +*/ +} \ No newline at end of file diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java new file mode 100644 index 0000000000..34ec434377 --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -0,0 +1,145 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.opensearch; + +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.springframework.mock.web.MockHttpServletResponse; + +/* +import org.dspace.app.rest.OpenSearchController; +import org.dspace.services.ConfigurationService; +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.util.service.OpenSearchService; +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.Item; +import org.dspace.eperson.Group; +*/ +import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.junit.Test; +import org.junit.Before; +import org.springframework.test.web.servlet.MockMvc; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import org.springframework.test.web.servlet.result.XpathResultMatchers; + +/** + * Integration test to test the /opensearch endpoint + * (Class has to start or end with IT to be picked up by the failsafe plugin) + * + * @author Oliver Goldschmidt (o dot goldschmidt at tuhh dot de) + */ +public class OpenSearchControllerTest extends AbstractControllerIntegrationTest { + + // configuration is taken from dspace-api/src/test/data/dspaceFolder/config/local.cfg + private ConfigurationService configurationService; + + @Before + public void init() throws Exception { + // override the configuration settings here if other settings are required for test + // configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + // configurationService.setProperty("websvc.opensearch.enable", true); + /* + System.out.println("Testing OpenSearch"); + MockHttpServletResponse resp2 = getClient().perform(get("/opensearch/search") + .param("query", "cats")) + .andReturn().getResponse(); + System.out.println("Response from Test 2: "+resp2.getContentAsString()); + */ + } + + @Test + public void searchAtomTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "cats")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + ; + } + + /* HTML is an open issue in OpenSearch, so skip this test at the moment + @Test + public void searchHtmlTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "cats") + .param("format", "html")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("text/html;charset=UTF-8")) + ; + } + */ + + @Test + public void searchRssTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "cats") + .param("format", "rss")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/rss+xml;charset=UTF-8" + .andExpect(content().contentType("application/rss+xml;charset=UTF-8")) + ; + } + + @Test + public void serviceDocumentTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/service")) + //The status has to be 200 OK + .andExpect(status().isOk()) + // and the contentType has to be an opensearchdescription + .andExpect(content().contentType("application/opensearchdescription+xml;charset=UTF-8")) + // and there need to be some values taken from the test configuration + .andExpect(xpath("OpenSearchDescription/ShortName").string("DS7 OpenSearch")) + .andExpect(xpath("OpenSearchDescription/LongName").string("DSpace 7 OpenSearch Service")) + .andExpect(xpath("OpenSearchDescription/Description").string("OpenSearch Service for DSpace 7")) + .andExpect(xpath("OpenSearchDescription/ShortName").string("DS7 OpenSearch")) + ; + /* Expected response for the service document is: + + + DS7 OpenSearch + DSpace 7 OpenSearch Service + OpenSearch Service for DSpace 7 + UTF-8 + UTF-8 + + IR DSpace + dspace-help@myu.edu + http://www.dspace.org/images/favicon.ico + + + + + */ + } +} \ No newline at end of file From 4c5b82c95a110717e00c7e779d1781397482529a Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Wed, 10 Oct 2018 08:28:02 -0700 Subject: [PATCH 089/193] review comments --- Dockerfile.jdk8 | 6 +++--- Dockerfile.jdk8-test | 6 +++--- dspace/src/main/docker/test/rest_web.xml | 4 ++++ dspace/src/main/docker/test/solr_web.xml | 4 ++++ 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Dockerfile.jdk8 b/Dockerfile.jdk8 index 1f9ade84fc..c404ad451f 100644 --- a/Dockerfile.jdk8 +++ b/Dockerfile.jdk8 @@ -2,7 +2,7 @@ # See https://dspace-labs.github.io/DSpace-Docker-Images/ for usage details # # This version is JDK8 compatible -# - tomcat:8 +# - tomcat:8-jre8 # - ANT 1.10.5 # - maven:latest # - note: @@ -19,7 +19,7 @@ COPY dspace/src/main/docker/local.cfg /app/local.cfg RUN mvn package # Step 2 - Run Ant Deploy -FROM tomcat:8 as ant_build +FROM tomcat:8-jre8 as ant_build ARG TARGET_DIR=dspace-installer COPY --from=build /app /dspace-src WORKDIR /dspace-src/dspace/target/${TARGET_DIR} @@ -36,7 +36,7 @@ RUN ant update_configs update_code update_webapps update_solr_indexes # Step 3 - Run tomcat # Create a new tomcat image that does not retain the the build directory contents -FROM tomcat:8 +FROM tomcat:8-jre8 COPY --from=ant_build /dspace /dspace EXPOSE 8080 8009 diff --git a/Dockerfile.jdk8-test b/Dockerfile.jdk8-test index 6732567e55..3cae9e4b66 100644 --- a/Dockerfile.jdk8-test +++ b/Dockerfile.jdk8-test @@ -2,7 +2,7 @@ # See https://dspace-labs.github.io/DSpace-Docker-Images/ for usage details # # This version is JDK8 compatible -# - tomcat:8 +# - tomcat:8-jre8 # - ANT 1.10.5 # - maven:latest # - note: expose /solr to any host; provide /rest over http @@ -23,7 +23,7 @@ COPY dspace/src/main/docker/test/rest_web.xml /app/dspace-rest/src/main/webapp/W RUN mvn package # Step 2 - Run Ant Deploy -FROM tomcat:8 as ant_build +FROM tomcat:8-jre8 as ant_build ARG TARGET_DIR=dspace-installer COPY --from=build /app /dspace-src WORKDIR /dspace-src/dspace/target/${TARGET_DIR} @@ -40,7 +40,7 @@ RUN ant update_configs update_code update_webapps update_solr_indexes # Step 3 - Run tomcat # Create a new tomcat image that does not retain the the build directory contents -FROM tomcat:8 +FROM tomcat:8-jre8 COPY --from=ant_build /dspace /dspace EXPOSE 8080 8009 diff --git a/dspace/src/main/docker/test/rest_web.xml b/dspace/src/main/docker/test/rest_web.xml index 842e7695ab..05a6268692 100644 --- a/dspace/src/main/docker/test/rest_web.xml +++ b/dspace/src/main/docker/test/rest_web.xml @@ -8,6 +8,10 @@ http://www.dspace.org/license/ --> + + From 2f1f45f8a8f4393c283053837b1e7f1fd4ac9df8 Mon Sep 17 00:00:00 2001 From: Bill Tantzen Date: Wed, 10 Oct 2018 11:09:28 -0500 Subject: [PATCH 090/193] /api/config/submissiondefinitions/traditional/collections should return empty list rather than 204 #2189 --- .../java/org/dspace/app/rest/RestResourceController.java | 8 +++++--- .../app/rest/SubmissionDefinitionsControllerIT.java | 7 ++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index bfd5296e22..a84d007969 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -757,10 +757,12 @@ public class RestResourceController implements InitializingBean { } else { if (resource.getEmbeddedResources().get(rel) == null) { - response.setStatus(HttpServletResponse.SC_NO_CONTENT); + PageImplemptyPage = new PageImpl(new ArrayList(), page, 0); + return assembler.toResource ( emptyPage ); } - - return (ResourceSupport) resource.getEmbeddedResources().get(rel); + else { + return (ResourceSupport) resource.getEmbeddedResources().get(rel); + } } } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java index 1069e95f51..553251633f 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java @@ -129,11 +129,8 @@ public class SubmissionDefinitionsControllerIT extends AbstractControllerIntegra //Match only that a section exists with a submission configuration behind getClient(token).perform(get("/api/config/submissiondefinitions/traditional/collections")) - //TODO - this method should return an empty page - .andExpect(status().isNoContent()); - //this is the expected result - //.andExpect(status().isOk()) - //.andExpect(jsonPath("$.page.totalElements", is(0))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test From 77f4b9db6ecf801d255a4a9bbd39194846f82530 Mon Sep 17 00:00:00 2001 From: Bill Tantzen Date: Wed, 10 Oct 2018 11:18:03 -0500 Subject: [PATCH 091/193] minor format changes --- .../java/org/dspace/app/rest/RestResourceController.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index a84d007969..34760dd38a 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -757,12 +757,11 @@ public class RestResourceController implements InitializingBean { } else { if (resource.getEmbeddedResources().get(rel) == null) { - PageImplemptyPage = new PageImpl(new ArrayList(), page, 0); - return assembler.toResource ( emptyPage ); + PageImpl emptyPage = new PageImpl(new ArrayList(), page, 0); + return assembler.toResource(emptyPage); + } else { + return (ResourceSupport) resource.getEmbeddedResources().get(rel); } - else { - return (ResourceSupport) resource.getEmbeddedResources().get(rel); - } } } From d794c203854460f29e073572ec23cc97fa4c12bc Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Wed, 10 Oct 2018 19:29:40 +0200 Subject: [PATCH 092/193] DS-3937 remove unused methods, improve javadoc and testing --- .../java/org/dspace/app/util/DCInput.java | 31 +++++++++---- .../org/dspace/app/util/DCInputsReader.java | 21 --------- .../converter/SubmissionFormConverter.java | 1 + .../rest/model/SubmissionFormFieldRest.java | 9 ++++ .../app/rest/SubmissionFormsControllerIT.java | 38 ++++++++++------ .../rest/matcher/MetadataFieldMatcher.java | 1 + .../matcher/SubmissionFormFieldMatcher.java | 43 +++++++++++++++++++ 7 files changed, 103 insertions(+), 41 deletions(-) create mode 100644 dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/SubmissionFormFieldMatcher.java diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInput.java b/dspace-api/src/main/java/org/dspace/app/util/DCInput.java index 24c2c598ee..5564b66806 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DCInput.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DCInput.java @@ -63,6 +63,12 @@ public class DCInput { */ private String label = null; + /** + * a style instruction to apply to the input. The exact way to use the style value is UI depending that receive the + * value from the REST API as is + */ + private String style = null; + /** * the input type */ @@ -199,7 +205,7 @@ public class DCInput { typeBind.add(type.trim()); } } - + style = fieldMap.get("style"); } /** @@ -262,7 +268,7 @@ public class DCInput { } /** - * Get the DC element for this form row. + * Get the DC element for this form field. * * @return the DC element */ @@ -271,7 +277,7 @@ public class DCInput { } /** - * Get the DC namespace prefix for this form row. + * Get the DC namespace prefix for this form field. * * @return the DC namespace prefix */ @@ -290,7 +296,7 @@ public class DCInput { } /** - * Is there a required string for this form row? + * Is there a required string for this form field? * * @return true if a required string is set */ @@ -299,7 +305,7 @@ public class DCInput { } /** - * Get the DC qualifier for this form row. + * Get the DC qualifier for this form field. * * @return the DC qualifier */ @@ -308,7 +314,7 @@ public class DCInput { } /** - * Get the language for this form row. + * Get the language for this form field. * * @return the language state */ @@ -317,7 +323,7 @@ public class DCInput { } /** - * Get the hint for this form row, formatted for an HTML table + * Get the hint for this form field * * @return the hints */ @@ -326,7 +332,7 @@ public class DCInput { } /** - * Get the label for this form row. + * Get the label for this form field. * * @return the label */ @@ -334,6 +340,15 @@ public class DCInput { return label; } + /** + * Get the style for this form field + * + * @return the style + */ + public String getStyle() { + return style; + } + /** * Get the name of the pairs type * diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java b/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java index 2f1ec19875..b473e602b8 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java @@ -87,8 +87,6 @@ public class DCInputsReader { */ private DCInputSet lastInputSet = null; - private Map> mappedValuePairs = new HashMap>(); - /** * Parse an XML encoded submission forms template file, and create a hashmap * containing all the form information. This hashmap will contain three top @@ -367,22 +365,6 @@ public class DCInputsReader { if (StringUtils.isNotBlank(qualifier)) { metadataField += "." + qualifier; } - - if (mappedValuePairs.containsKey( - key)) { - if (!mappedValuePairs - .get(key).contains(metadataField)) { - mappedValuePairs - .get(key).add(metadataField); - } - - } else { - List newval = new ArrayList(); - newval.add(metadataField); - mappedValuePairs.put( - key, - newval); - } } // we omit the duplicate validation, allowing multiple @@ -701,7 +683,4 @@ public class DCInputsReader { throw new DCInputsReaderException("No field configuration found!"); } - public Map> getMappedValuePairs() { - return mappedValuePairs; - } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionFormConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionFormConverter.java index c9ec1268b2..240b845cc1 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionFormConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionFormConverter.java @@ -80,6 +80,7 @@ public class SubmissionFormConverter extends DSpaceConverter selectableMetadata; private List languageCodes; @@ -86,6 +87,14 @@ public class SubmissionFormFieldRest { this.hints = hints; } + public String getStyle() { + return style; + } + + public void setStyle(String style) { + this.style = style; + } + public List getLanguageCodes() { if (languageCodes == null) { languageCodes = new ArrayList(); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java index 3e3d993602..1d1b0d5ac8 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java @@ -7,7 +7,8 @@ */ package org.dspace.app.rest; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -15,6 +16,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import org.dspace.app.rest.matcher.SubmissionFormFieldMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.hamcrest.Matchers; import org.junit.Test; @@ -25,7 +27,6 @@ import org.junit.Test; */ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTest { - @Test public void findAll() throws Exception { //When we call the root endpoint as anonymous user @@ -42,18 +43,15 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe .andExpect(status().isOk()) //We expect the content type to be "application/hal+json;charset=UTF-8" .andExpect(content().contentType(contentType)) - - //By default we expect at least 1 submission forms so this to be reflected in the page object + //The configuration file for the test env includes 3 forms .andExpect(jsonPath("$.page.size", is(20))) - .andExpect(jsonPath("$.page.totalElements", greaterThanOrEqualTo(1))) - .andExpect(jsonPath("$.page.totalPages", greaterThanOrEqualTo(1))) + .andExpect(jsonPath("$.page.totalElements", equalTo(3))) + .andExpect(jsonPath("$.page.totalPages", equalTo(1))) .andExpect(jsonPath("$.page.number", is(0))) .andExpect( jsonPath("$._links.self.href", Matchers.startsWith(REST_SERVER_URL + "config/submissionforms"))) - - //The array of browse index should have a size greater or equals to 1 - .andExpect(jsonPath("$._embedded.submissionforms", hasSize(greaterThanOrEqualTo(1)))) - + //The array of submissionforms should have a size of 3 + .andExpect(jsonPath("$._embedded.submissionforms", hasSize(equalTo(3)))) ; } @@ -64,7 +62,6 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe //The status has to be 403 Not Authorized .andExpect(status().isUnauthorized()); - String token = getAuthToken(admin.getEmail(), password); getClient(token).perform(get("/api/config/submissionforms/traditionalpageone")) @@ -72,13 +69,30 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe .andExpect(status().isOk()) //We expect the content type to be "application/hal+json;charset=UTF-8" .andExpect(content().contentType(contentType)) - //Check that the JSON root matches the expected "traditionalpageone" input forms .andExpect(jsonPath("$.id", is("traditionalpageone"))) .andExpect(jsonPath("$.name", is("traditionalpageone"))) .andExpect(jsonPath("$.type", is("submissionform"))) .andExpect(jsonPath("$._links.self.href", Matchers .startsWith(REST_SERVER_URL + "config/submissionforms/traditionalpageone"))) + // check the first two rows + .andExpect(jsonPath("$.rows[0].fields", contains( + SubmissionFormFieldMatcher.matchFormFieldDefinition("name", "Authors", null, true, + "Enter the names of the authors of this item.", "dc.contributor.author")))) + .andExpect(jsonPath("$.rows[1].fields", contains( + SubmissionFormFieldMatcher.matchFormFieldDefinition("onebox", "Title", + "You must enter a main title for this item.", false, + "Enter the main title of the item.", "dc.title")))) + // check a row with multiple fields + .andExpect(jsonPath("$.rows[3].fields", + contains( + SubmissionFormFieldMatcher.matchFormFieldDefinition("date", "Date of Issue", + "You must enter at least the year.", false, + "Please give the date", "col-sm-4", + "dc.date.issued"), + SubmissionFormFieldMatcher.matchFormFieldDefinition("onebox", "Publisher", null, false, + "Enter the name of", "col-sm-8", + "dc.publisher")))) ; } } \ No newline at end of file diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/MetadataFieldMatcher.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/MetadataFieldMatcher.java index 56be9aba49..59f609cdfa 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/MetadataFieldMatcher.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/MetadataFieldMatcher.java @@ -51,4 +51,5 @@ public class MetadataFieldMatcher { hasJsonPath("$._links.self.href", Matchers.containsString("/api/core/metadatafields")) ); } + } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/SubmissionFormFieldMatcher.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/SubmissionFormFieldMatcher.java new file mode 100644 index 0000000000..30485c0e25 --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/SubmissionFormFieldMatcher.java @@ -0,0 +1,43 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.matcher; + +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasNoJsonPath; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; + +import org.hamcrest.Matcher; + +public class SubmissionFormFieldMatcher { + + private SubmissionFormFieldMatcher() { } + + public static Matcher matchFormFieldDefinition(String type, String label, String mandatoryMessage, + boolean repeatable, String hints, String metadata) { + return matchFormFieldDefinition(type, label, mandatoryMessage, repeatable, hints, null, metadata); + } + + public static Matcher matchFormFieldDefinition(String type, String label, String mandatoryMessage, + boolean repeatable, String hints, String style, String metadata) { + return allOf( + // check each field definition + hasJsonPath("$.input.type", is(type)), + hasJsonPath("$.label", containsString(label)), + hasJsonPath("$.selectableMetadata[0].metadata", is(metadata)), + mandatoryMessage != null ? hasJsonPath("$.mandatoryMessage", containsString(mandatoryMessage)) : + hasNoJsonPath("$.mandatoryMessage"), + hasJsonPath("$.mandatory", is(mandatoryMessage != null)), + hasJsonPath("$.repeatable", is(repeatable)), + style != null ? hasJsonPath("$.style", is(style)) : + hasNoJsonPath("$.style"), + hasJsonPath("$.hints", containsString(hints)) + ); + } +} From ed8f245e7dd70e1013833bc8954c3844bcc04051 Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Tue, 9 Oct 2018 14:10:44 -0700 Subject: [PATCH 093/193] [DS-4021] Replace patch operations on a non-existent value now result in a PatchBadRequestException. Added missing license headers. Added FIXME. --- .../rest/repository/patch/EPersonPatch.java | 2 +- .../app/rest/repository/patch/ItemPatch.java | 2 +- .../EPersonCertificateReplaceOperation.java | 18 +++---- .../impl/EPersonLoginReplaceOperation.java | 15 ++---- .../impl/EPersonNetidReplaceOperation.java | 24 +++++----- .../impl/EPersonPasswordReplaceOperation.java | 32 ++++++++----- .../ItemDiscoverableReplaceOperation.java | 16 +++---- .../impl/ItemWithdrawReplaceOperation.java | 18 +++---- .../patch/factories/impl/PatchOperation.java | 24 +++++++--- .../factories/impl/ReplacePatchOperation.java | 47 +++++++++++++++++++ .../impl/ResourcePatchOperation.java | 14 ++---- .../app/rest/EPersonRestRepositoryIT.java | 34 ++++++++++++++ .../app/rest/builder/EPersonBuilder.java | 5 ++ 13 files changed, 165 insertions(+), 86 deletions(-) create mode 100644 dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java index 67acd125f0..f7196ed512 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java @@ -38,7 +38,7 @@ public class EPersonPatch extends AbstractResourcePatch { ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); - return (EPersonRest) patchOperation.perform(eperson, operation); + return patchOperation.perform(eperson, operation); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java index 257604959b..b2126bfdbc 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java @@ -38,7 +38,7 @@ public class ItemPatch extends AbstractResourcePatch { ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); - return (ItemRest) patchOperation.perform(item, operation); + return patchOperation.perform(item, operation); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java index 5b486bdc83..bcc62b1abe 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java @@ -24,16 +24,9 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonCertificateReplaceOperation extends PatchOperation +public class EPersonCertificateReplaceOperation extends ReplacePatchOperation implements ResourcePatchOperation { - /** - * Updates the certificate required status in the eperson rest model. - * @param resource the rest model - * @param operation - * @return the updated rest model - * @throws PatchBadRequestException - */ @Override public EPersonRest perform(EPersonRest resource, Operation operation) throws PatchBadRequestException { @@ -41,10 +34,13 @@ public class EPersonCertificateReplaceOperation extends PatchOperation getArrayClassForEvaluation() { - return null; + return String[].class; } @Override protected Class getClassForEvaluation() { - return null; + return String.class; } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java index dbcb291bb5..36661bb4de 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java @@ -24,17 +24,9 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonLoginReplaceOperation extends PatchOperation +public class EPersonLoginReplaceOperation extends ReplacePatchOperation implements ResourcePatchOperation { - - /** - * Updates the canLogIn status in the eperson rest model. - * @param resource the rest model - * @param operation - * @return the updated rest model - * @throws PatchBadRequestException - */ @Override public EPersonRest perform(EPersonRest resource, Operation operation) throws PatchBadRequestException { @@ -42,10 +34,13 @@ public class EPersonLoginReplaceOperation extends PatchOperation +public class EPersonNetidReplaceOperation extends ReplacePatchOperation implements ResourcePatchOperation { - /** - * Updates the netid in the eperson rest model. - * @param resource the rest model - * @param operation - * @return the updated rest model - * @throws PatchBadRequestException - */ @Override public EPersonRest perform(EPersonRest resource, Operation operation) throws PatchBadRequestException { - checkOperationValue((String) operation.getValue()); - resource.setNetid((String) operation.getValue()); - return resource; + return replace(resource, operation); } + @Override + EPersonRest replace(EPersonRest eperson, Operation operation) throws PatchBadRequestException { + + checkOperationValue(operation.getValue()); + checkModelForExistingValue(eperson.getNetid()); + + eperson.setNetid((String) operation.getValue()); + + return eperson; + } + @Override protected Class getArrayClassForEvaluation() { return String[].class; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java index 0958193e42..957017ec0a 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java @@ -24,25 +24,31 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class EPersonPasswordReplaceOperation extends PatchOperation - implements ResourcePatchOperation { +public class EPersonPasswordReplaceOperation extends ReplacePatchOperation { - - /** - * Updates the password in the eperson rest model. - * @param resource the rest model - * @param operation - * @return updated rest model - * @throws PatchBadRequestException - */ @Override public EPersonRest perform( EPersonRest resource, Operation operation) throws PatchBadRequestException { - checkOperationValue(operation.getValue()); - resource.setPassword((String) operation.getValue()); - return resource; + return replace(resource, operation); + } + @Override + EPersonRest replace(EPersonRest eperson, Operation operation) throws PatchBadRequestException { + + checkOperationValue(operation.getValue()); + if (eperson.getPassword() == null) { + /* + * FIXME: the password field in eperson rest model is always null because + * the value is not set in the rest converter. + * We would normally throw an exception here since replace operations are + * not allowed on non-existent values. + * There is a utility method in ReplacePatchOperation that does a null + * check and throws the error. + */ + } + eperson.setPassword((String) operation.getValue()); + return eperson; } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java index d04ab87af0..5d7fb65a92 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java @@ -25,18 +25,11 @@ import org.springframework.stereotype.Component; * @author Michael Spalti */ @Component -public class ItemDiscoverableReplaceOperation extends PatchOperation - implements ResourcePatchOperation { +public class ItemDiscoverableReplaceOperation extends ReplacePatchOperation { private static final Logger log = Logger.getLogger(ItemDiscoverableReplaceOperation.class); - /** - * Updates the discoverable in the item rest model. - * @param item the rest model - * @param operation - * @return updated rest model - * @throws PatchBadRequestException - */ + @Override public ItemRest perform(ItemRest item, Operation operation) throws PatchBadRequestException { @@ -44,9 +37,12 @@ public class ItemDiscoverableReplaceOperation extends PatchOperation { +public class ItemWithdrawReplaceOperation extends ReplacePatchOperation { private static final Logger log = Logger.getLogger(ItemWithdrawReplaceOperation.class); - /** - * Updates the withdrawn in the item rest model. - * @param item the rest model - * @param operation - * @return the updated rest model - * @throws UnprocessableEntityException - * @throws PatchBadRequestException - */ @Override - public RestModel perform(ItemRest item, Operation operation) + public ItemRest perform(ItemRest item, Operation operation) throws UnprocessableEntityException, PatchBadRequestException { return replace(item, operation); } - private RestModel replace(ItemRest item, Operation operation) + @Override + public ItemRest replace(ItemRest item, Operation operation) throws PatchBadRequestException, UnprocessableEntityException { checkOperationValue(operation.getValue()); + checkModelForExistingValue(item.getWithdrawn()); + Boolean withdraw = getBooleanOperationValue(operation.getValue()); // This is a request to withdraw the item. diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java index 049a7ae045..e2f6a66cc6 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java @@ -17,22 +17,31 @@ import org.dspace.app.rest.model.patch.Operation; import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; /** - * This patch class includes abstract and implemented methods that - * can be used to type check objects derived from operation values. + * Base class for all patch operations. This class includes methods that + * can be used to type check objects that are converted from json. * * @author Michael Spalti */ -public abstract class PatchOperation +public abstract class PatchOperation implements ResourcePatchOperation { - public abstract RestModel perform(R resource, Operation operation) + /** + * Updates the rest model by applying the patch operation. + * + * @param resource the rest model + * @param operation + * @return the updated rest model + * @throws PatchBadRequestException + */ + public abstract R perform(R resource, Operation operation) throws PatchBadRequestException; /** * Throws PatchBadRequestException for missing operation value. + * * @param value the value to test */ - public void checkOperationValue(Object value) { + void checkOperationValue(Object value) { if (value == null) { throw new PatchBadRequestException("No value provided for the operation."); } @@ -40,10 +49,11 @@ public abstract class PatchOperation /** * Allows clients to use either a boolean or a string representation of boolean value. + * * @param value the operation value * @return the original or derived boolean value */ - public Boolean getBooleanOperationValue(Object value) throws PatchBadRequestException { + Boolean getBooleanOperationValue(Object value) throws PatchBadRequestException { Boolean bool; if (value instanceof String) { @@ -90,6 +100,7 @@ public abstract class PatchOperation /** * This method should return the typed array to be used in the * LateObjectEvaluator evaluation of json arrays. + * * @return */ protected abstract Class getArrayClassForEvaluation(); @@ -97,6 +108,7 @@ public abstract class PatchOperation /** * This method should return the object type to be used in the * LateObjectEvaluator evaluation of json objects. + * * @return */ protected abstract Class getClassForEvaluation(); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java new file mode 100644 index 0000000000..872c8db1b0 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java @@ -0,0 +1,47 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.rest.repository.patch.factories.impl; + +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.RestModel; +import org.dspace.app.rest.model.patch.Operation; + +/** + * The base class for replace operations. + * + * @param + * @param + */ +public abstract class ReplacePatchOperation + extends PatchOperation { + + /** + * Executes the replace patch operation. + * + * @param resource + * @param operation + * @return + * @throws PatchBadRequestException + */ + abstract R replace(R resource, Operation operation) + throws PatchBadRequestException; + + /** + * Replace operations are not allowed on non-existent values. + * Null values may exist in the RestModel for certain fields + * (usually non-boolean). + * + * @param value the rest model value to be replaced. + * @throws PatchBadRequestException + */ + void checkModelForExistingValue(Object value) throws PatchBadRequestException { + if (value == null) { + throw new PatchBadRequestException("Attempting to replace a non-existent value."); + } + } +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java index d72116a720..dc531b40fe 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java @@ -12,20 +12,12 @@ import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.patch.Operation; /** - * The interface for repository patch operations. - * - * @author Michael Spalti + * The patch interface used by repository classes. + * @param */ public interface ResourcePatchOperation { - /** - * Updates the rest model by applying the patch operation. - * @param resource the rest model - * @param operation - * @return the updated rest model - * @throws PatchBadRequestException - */ - RestModel perform(R resource, Operation operation) + R perform(R resource, Operation operation) throws PatchBadRequestException; } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index f573a845c5..c109f6b752 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -588,6 +588,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withNetId("testId") .build(); List ops = new ArrayList(); @@ -608,6 +609,35 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { } + @Test + public void replaceOnNonExistentValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // update of netId should fail. + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.netid", Matchers.nullValue())); + + } @Test public void patchNetIdMissingValue() throws Exception { @@ -617,6 +647,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withNetId("testId") .build(); String newId = "newId"; @@ -813,6 +844,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withPassword("7Testpass") .build(); String newPassword = "newpassword"; @@ -845,6 +877,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withPassword("testpass79bC") .build(); String token = getAuthToken(admin.getEmail(), password); @@ -889,6 +922,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { EPerson ePerson = EPersonBuilder.createEPerson(context) .withNameInMetadata("John", "Doe") .withEmail("Johndoe@fake-email.com") + .withNetId("testId") .build(); String token = getAuthToken(admin.getEmail(), password); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java index 78e9d858bf..10c04479e9 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java @@ -78,6 +78,11 @@ public class EPersonBuilder extends AbstractDSpaceObjectBuilder { return this; } + public EPersonBuilder withNetId(final String netId) { + ePerson.setNetid(netId); + return this; + } + public EPersonBuilder withPassword(final String password) { ePerson.setCanLogIn(true); ePersonService.setPassword(ePerson, password); From 4652bb8cab304b0c038cd13d97faa18ef5891b47 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Wed, 10 Oct 2018 18:32:18 +0000 Subject: [PATCH 094/193] Dependency fixes for OAI-PMH using Servlet API 3.1 --- dspace-oai/pom.xml | 9 +++------ dspace/modules/oai/pom.xml | 8 ++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index a1611abc2c..136b8fc1dc 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -16,7 +16,6 @@ ${basedir}/.. - 3.2.5.RELEASE 3.2.10 2.0.1 @@ -144,10 +143,6 @@ jtwig-spring ${jtwig.version} - - org.ow2.asm - asm - com.google.guava guava @@ -228,10 +223,12 @@ junit test + + org.hamcrest hamcrest-all - test + compile org.mockito diff --git a/dspace/modules/oai/pom.xml b/dspace/modules/oai/pom.xml index d6af3a4a24..441846e8ce 100644 --- a/dspace/modules/oai/pom.xml +++ b/dspace/modules/oai/pom.xml @@ -146,6 +146,14 @@ + + + + + org.hamcrest + hamcrest-all + compile + From ac788aacee46915d90e555d5cf3dd0d049d68e3f Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Thu, 11 Oct 2018 09:57:54 +0200 Subject: [PATCH 095/193] fixes style issues in tests --- .../OpenSearchControllerDisabledTest.java | 14 +++++++------- .../opensearch/OpenSearchControllerTest.java | 17 ++++++++--------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java index 6571477f3c..3cfdf55fc6 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java @@ -7,19 +7,18 @@ */ package org.dspace.app.opensearch; +/* import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; +*/ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.springframework.mock.web.MockHttpServletResponse; - /* import org.dspace.app.rest.OpenSearchController; import org.dspace.services.ConfigurationService; @@ -36,13 +35,14 @@ import org.dspace.content.Community; import org.dspace.content.Item; import org.dspace.eperson.Group; */ + import org.dspace.app.rest.test.AbstractControllerIntegrationTest; -import org.junit.Test; -import org.junit.Before; -import org.springframework.test.web.servlet.MockMvc; + import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; -import org.springframework.test.web.servlet.result.MockMvcResultHandlers; + +import org.junit.Before; +import org.junit.Test; /** * Integration test to test the /opensearch endpoint diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index 34ec434377..00ccc7cec0 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -7,18 +7,18 @@ */ package org.dspace.app.opensearch; +/* import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; +*/ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.springframework.mock.web.MockHttpServletResponse; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath; /* import org.dspace.app.rest.OpenSearchController; @@ -36,14 +36,13 @@ import org.dspace.content.Community; import org.dspace.content.Item; import org.dspace.eperson.Group; */ + import org.dspace.app.rest.test.AbstractControllerIntegrationTest; -import org.junit.Test; -import org.junit.Before; -import org.springframework.test.web.servlet.MockMvc; + import org.dspace.services.ConfigurationService; -import org.dspace.services.factory.DSpaceServicesFactory; -import org.springframework.test.web.servlet.result.MockMvcResultHandlers; -import org.springframework.test.web.servlet.result.XpathResultMatchers; + +import org.junit.Before; +import org.junit.Test; /** * Integration test to test the /opensearch endpoint From e64101a5e940ffc45bac7076c0b3b9a80f918fca Mon Sep 17 00:00:00 2001 From: Bill Tantzen Date: Thu, 11 Oct 2018 07:41:56 -0500 Subject: [PATCH 096/193] modified two additional ITs reflecting the changes to RestResourceController --- .../org/dspace/app/rest/CommunityRestRepositoryIT.java | 9 ++++++--- .../java/org/dspace/app/rest/ItemRestRepositoryIT.java | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java index 83befe969c..ce12563f56 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java @@ -187,11 +187,13 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest .andExpect(content().contentType(contentType)); getClient().perform(get("/api/core/communities/" + child1.getID().toString() + "/logo")) - .andExpect(status().isNoContent()); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); //Main community has no collections, therefore contentType is not set getClient().perform(get("/api/core/communities/" + parentCommunity.getID().toString() + "/collections")) - .andExpect(status().isNoContent()); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); getClient().perform(get("/api/core/communities/" + child1.getID().toString() + "/collections")) .andExpect(status().isOk()) @@ -203,7 +205,8 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest //child1 subcommunity has no subcommunities, therefore contentType is not set getClient().perform(get("/api/core/communities/" + child1.getID().toString() + "/subcommunities")) - .andExpect(status().isNoContent()); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java index cf0cbfc429..f2aa5aeb36 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java @@ -301,7 +301,8 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { ; getClient().perform(get("/api/core/items/" + publicItem1.getID() + "/templateItemOf")) - .andExpect(status().isNoContent()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); ; } From e2608f79bf5979e9cb59f8a70f876d133f72e6a8 Mon Sep 17 00:00:00 2001 From: Bill Tantzen Date: Thu, 11 Oct 2018 11:05:35 -0500 Subject: [PATCH 097/193] return null/204 when endpoints return null (or empty list) and a single item is requested; return empty list/200 when endpoints return null (or empty list) and an array of items is requested. --- .../org/dspace/app/rest/RestResourceController.java | 11 +++++------ .../dspace/app/rest/model/hateoas/DSpaceResource.java | 4 +++- .../dspace/app/rest/CommunityRestRepositoryIT.java | 3 +-- .../org/dspace/app/rest/ItemRestRepositoryIT.java | 3 +-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index 34760dd38a..b2568e99ca 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -736,8 +736,9 @@ public class RestResourceController implements InitializingBean { EmbeddedPage ep = (EmbeddedPage) resource.getEmbeddedResources().get(rel); List fullList = ep.getFullList(); if (fullList == null || fullList.size() == 0) { - response.setStatus(HttpServletResponse.SC_NO_CONTENT); - return null; + PageImpl pageResult = new PageImpl(fullList, page, 0); + result = assembler.toResource(pageResult); + return result; } int start = page.getOffset(); int end = (start + page.getPageSize()) > fullList.size() ? fullList.size() : (start + page.getPageSize()); @@ -757,11 +758,9 @@ public class RestResourceController implements InitializingBean { } else { if (resource.getEmbeddedResources().get(rel) == null) { - PageImpl emptyPage = new PageImpl(new ArrayList(), page, 0); - return assembler.toResource(emptyPage); - } else { - return (ResourceSupport) resource.getEmbeddedResources().get(rel); + response.setStatus(HttpServletResponse.SC_NO_CONTENT); } + return (ResourceSupport) resource.getEmbeddedResources().get(rel); } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceResource.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceResource.java index 87635c548c..dda7e76922 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceResource.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceResource.java @@ -129,7 +129,9 @@ public abstract class DSpaceResource extends HAL page.map(resourceRepository::wrapResource), linkedRMList, name); } else { - wrapObject = null; + PageImpl page = new PageImpl(linkedRMList); + wrapObject = new EmbeddedPage(linkToSubResource.getHref(), page, + linkedRMList, name); } } } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java index ce12563f56..0ac3f9f845 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java @@ -187,8 +187,7 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest .andExpect(content().contentType(contentType)); getClient().perform(get("/api/core/communities/" + child1.getID().toString() + "/logo")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.page.totalElements", is(0))); + .andExpect(status().isNoContent()); //Main community has no collections, therefore contentType is not set getClient().perform(get("/api/core/communities/" + parentCommunity.getID().toString() + "/collections")) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java index f2aa5aeb36..9b9d43782c 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java @@ -301,8 +301,7 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { ; getClient().perform(get("/api/core/items/" + publicItem1.getID() + "/templateItemOf")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.page.totalElements", is(0))); + .andExpect(status().isNoContent()); ; } From 837814b596c57f945c6b1b7100388b1d9255c1e1 Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Thu, 11 Oct 2018 14:54:29 -0700 Subject: [PATCH 098/193] [DS-4021] Added a bit of IOC that helps to assure consistent checks before applying patch replace operations. --- .../patch/AbstractResourcePatch.java | 5 +- .../rest/repository/patch/EPersonPatch.java | 3 +- .../app/rest/repository/patch/ItemPatch.java | 3 +- .../factories/EPersonOperationFactory.java | 4 +- .../patch/factories/ItemOperationFactory.java | 4 +- .../EPersonCertificateReplaceOperation.java | 35 +++++++------ .../impl/EPersonLoginReplaceOperation.java | 32 ++++++------ .../impl/EPersonNetidReplaceOperation.java | 19 +++---- .../impl/EPersonPasswordReplaceOperation.java | 30 ++++------- .../ItemDiscoverableReplaceOperation.java | 29 +++++------ .../impl/ItemWithdrawReplaceOperation.java | 33 ++++++------ .../patch/factories/impl/PatchOperation.java | 15 +++--- .../factories/impl/ReplacePatchOperation.java | 50 +++++++++++++------ .../impl/ResourcePatchOperation.java | 4 +- 14 files changed, 127 insertions(+), 139 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java index 8536f84e95..4033718941 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java @@ -30,8 +30,7 @@ public abstract class AbstractResourcePatch { * @throws UnprocessableEntityException * @throws PatchBadRequestException */ - public RestModel patch(R restModel, List operations) - throws UnprocessableEntityException, PatchBadRequestException { + public RestModel patch(R restModel, List operations) { // Note: the list of possible operations is taken from JsonPatchConverter class. Does not implement // test https://tools.ietf.org/html/rfc6902#section-4.6 @@ -73,7 +72,7 @@ public abstract class AbstractResourcePatch { protected R replace(R restModel, Operation operation) throws UnprocessableEntityException, PatchBadRequestException { throw new UnprocessableEntityException( - "The remove operation is not supported." + "The replace operation is not supported." ); } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java index f7196ed512..2204c98cc8 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java @@ -32,8 +32,7 @@ public class EPersonPatch extends AbstractResourcePatch { * @throws UnprocessableEntityException * @throws PatchBadRequestException */ - protected EPersonRest replace(EPersonRest eperson, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException { + protected EPersonRest replace(EPersonRest eperson, Operation operation) { ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java index b2126bfdbc..d68edbf444 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java @@ -32,8 +32,7 @@ public class ItemPatch extends AbstractResourcePatch { * @throws UnprocessableEntityException * @throws PatchBadRequestException */ - protected ItemRest replace(ItemRest item, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException { + protected ItemRest replace(ItemRest item, Operation operation) { ResourcePatchOperation patchOperation = patchFactory.getReplaceOperationForPath(operation.getPath()); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java index fcd8ec43b4..27cee32ee4 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java @@ -47,9 +47,9 @@ public class EPersonOperationFactory { * * @param path the operation path * @return the patch operation implementation + * @throws PatchBadRequestException */ - public ResourcePatchOperation getReplaceOperationForPath(String path) - throws PatchBadRequestException { + public ResourcePatchOperation getReplaceOperationForPath(String path) { switch (path) { case OPERATION_PASSWORD_CHANGE: diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java index b63897db60..3360e85036 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java @@ -37,9 +37,9 @@ public class ItemOperationFactory { * * @param path the operation path * @return the patch operation implementation + * @throws PatchBadRequestException */ - public ResourcePatchOperation getReplaceOperationForPath(String path) - throws PatchBadRequestException { + public ResourcePatchOperation getReplaceOperationForPath(String path) { switch (path) { case OPERATION_PATH_DISCOVERABLE: diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java index bcc62b1abe..8f75a1fd8c 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java @@ -18,28 +18,17 @@ import org.springframework.stereotype.Component; * Example: * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H " * Content-Type: application/json" -d '[{ "op": "replace", "path": " - * /certificate", "value": "true|false"]' + * /certificate", "value": true|false]' * * * @author Michael Spalti */ @Component -public class EPersonCertificateReplaceOperation extends ReplacePatchOperation +public class EPersonCertificateReplaceOperation extends ReplacePatchOperation implements ResourcePatchOperation { @Override - public EPersonRest perform(EPersonRest resource, Operation operation) - throws PatchBadRequestException { - - return replace(resource, operation); - } - - @Override - public EPersonRest replace(EPersonRest eperson, Operation operation) - throws PatchBadRequestException { - - checkOperationValue(operation.getValue()); - checkModelForExistingValue(eperson.isRequireCertificate()); + public EPersonRest replace(EPersonRest eperson, Operation operation) { Boolean requireCert = getBooleanOperationValue(operation.getValue()); eperson.setRequireCertificate(requireCert); @@ -48,12 +37,22 @@ public class EPersonCertificateReplaceOperation extends ReplacePatchOperation getArrayClassForEvaluation() { - return String[].class; + void checkModelForExistingValue(EPersonRest resource) { + // TODO: many (all?) boolean values on the rest model should never be null. + // So perhaps the error to throw in this case is different...IllegalStateException? + // Or perhaps do nothing (no check is required). + if ((Object) resource.isRequireCertificate() == null) { + throw new PatchBadRequestException("Attempting to replace a non-existent value."); + } } @Override - protected Class getClassForEvaluation() { - return String.class; + protected Class getArrayClassForEvaluation() { + return Boolean[].class; + } + + @Override + protected Class getClassForEvaluation() { + return Boolean.class; } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java index 36661bb4de..78ff834ab6 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java @@ -18,42 +18,38 @@ import org.springframework.stereotype.Component; * Example: * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H " * Content-Type: application/json" -d '[{ "op": "replace", "path": " - * /canLogin", "value": "true|false"]' + * /canLogin", "value": true|false]' * * * @author Michael Spalti */ @Component -public class EPersonLoginReplaceOperation extends ReplacePatchOperation +public class EPersonLoginReplaceOperation extends ReplacePatchOperation implements ResourcePatchOperation { - @Override - public EPersonRest perform(EPersonRest resource, Operation operation) - throws PatchBadRequestException { - - return replace(resource, operation); - } @Override - public EPersonRest replace(EPersonRest eperson, Operation operation) - throws PatchBadRequestException { - - checkOperationValue(operation.getValue()); - checkModelForExistingValue(eperson.isCanLogIn()); + public EPersonRest replace(EPersonRest eperson, Operation operation) { Boolean canLogin = getBooleanOperationValue(operation.getValue()); eperson.setCanLogIn(canLogin); return eperson; - } @Override - protected Class getArrayClassForEvaluation() { - return String[].class; + void checkModelForExistingValue(EPersonRest resource) { + if ((Object) resource.isCanLogIn() == null) { + throw new PatchBadRequestException("Attempting to replace a non-existent value."); + } } @Override - protected Class getClassForEvaluation() { - return String.class; + protected Class getArrayClassForEvaluation() { + return Boolean[].class; + } + + @Override + protected Class getClassForEvaluation() { + return Boolean.class; } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java index 2474ece8a9..3d131754a2 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java @@ -28,22 +28,17 @@ public class EPersonNetidReplaceOperation extends ReplacePatchOperation { @Override - public EPersonRest perform(EPersonRest resource, Operation operation) - throws PatchBadRequestException { - - return replace(resource, operation); + EPersonRest replace(EPersonRest eperson, Operation operation) { + eperson.setNetid((String) operation.getValue()); + return eperson; } @Override - EPersonRest replace(EPersonRest eperson, Operation operation) throws PatchBadRequestException { - - checkOperationValue(operation.getValue()); - checkModelForExistingValue(eperson.getNetid()); - - eperson.setNetid((String) operation.getValue()); - - return eperson; + void checkModelForExistingValue(EPersonRest resource) { + if (resource.getNetid() == null) { + throw new PatchBadRequestException("Attempting to replace a non-existent value."); + } } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java index 957017ec0a..5be3d5e8a4 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java @@ -7,7 +7,6 @@ */ package org.dspace.app.rest.repository.patch.factories.impl; -import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.patch.Operation; import org.springframework.stereotype.Component; @@ -27,28 +26,21 @@ import org.springframework.stereotype.Component; public class EPersonPasswordReplaceOperation extends ReplacePatchOperation { @Override - public EPersonRest perform( EPersonRest resource, Operation operation) - throws PatchBadRequestException { + EPersonRest replace(EPersonRest eperson, Operation operation) { - return replace(resource, operation); + eperson.setPassword((String) operation.getValue()); + return eperson; } @Override - EPersonRest replace(EPersonRest eperson, Operation operation) throws PatchBadRequestException { - - checkOperationValue(operation.getValue()); - if (eperson.getPassword() == null) { - /* - * FIXME: the password field in eperson rest model is always null because - * the value is not set in the rest converter. - * We would normally throw an exception here since replace operations are - * not allowed on non-existent values. - * There is a utility method in ReplacePatchOperation that does a null - * check and throws the error. - */ - } - eperson.setPassword((String) operation.getValue()); - return eperson; + void checkModelForExistingValue(EPersonRest resource) { + /* + * FIXME: the password field in eperson rest model is always null because + * the value is not set in the rest converter. + * We would normally throw an exception here since replace + * operations are not allowed on non-existent values, but that + * would prevent the password update from ever taking place. + */ } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java index 5d7fb65a92..fca3f31b36 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java @@ -19,42 +19,39 @@ import org.springframework.stereotype.Component; * Example: * curl -X PATCH http://${dspace.url}/api/item/<:id-item> -H " * Content-Type: application/json" -d '[{ "op": "replace", "path": " - * /discoverable", "value": "true|false"]' + * /discoverable", "value": true|false]' * * * @author Michael Spalti */ @Component -public class ItemDiscoverableReplaceOperation extends ReplacePatchOperation { +public class ItemDiscoverableReplaceOperation extends ReplacePatchOperation { private static final Logger log = Logger.getLogger(ItemDiscoverableReplaceOperation.class); - @Override - public ItemRest perform(ItemRest item, Operation operation) - throws PatchBadRequestException { - - return replace(item, operation); - - } @Override public ItemRest replace(ItemRest item, Operation operation) { - checkOperationValue(operation.getValue()); - checkModelForExistingValue(item.getDiscoverable()); - Boolean discoverable = getBooleanOperationValue(operation.getValue()); item.setDiscoverable(discoverable); return item; } - protected Class getArrayClassForEvaluation() { - return String[].class; + @Override + void checkModelForExistingValue(ItemRest resource) { + if ((Object) resource.getDiscoverable() == null) { + throw new PatchBadRequestException("Attempting to replace a non-existent value."); + } } - protected Class getClassForEvaluation() { - return String.class; + protected Class getArrayClassForEvaluation() { + return Boolean[].class; + } + + protected Class getClassForEvaluation() { + return Boolean.class; } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java index 4aec023a71..9f0b081a89 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java @@ -20,30 +20,18 @@ import org.springframework.stereotype.Component; * Example: * curl -X PATCH http://${dspace.url}/api/item/<:id-item> -H " * Content-Type: application/json" -d '[{ "op": "replace", "path": " - * /withdrawn", "value": "true|false"]' + * /withdrawn", "value": true|false]' * * * @author Michael Spalti */ @Component -public class ItemWithdrawReplaceOperation extends ReplacePatchOperation { +public class ItemWithdrawReplaceOperation extends ReplacePatchOperation { private static final Logger log = Logger.getLogger(ItemWithdrawReplaceOperation.class); @Override - public ItemRest perform(ItemRest item, Operation operation) - throws UnprocessableEntityException, PatchBadRequestException { - - return replace(item, operation); - - } - - @Override - public ItemRest replace(ItemRest item, Operation operation) - throws PatchBadRequestException, UnprocessableEntityException { - - checkOperationValue(operation.getValue()); - checkModelForExistingValue(item.getWithdrawn()); + public ItemRest replace(ItemRest item, Operation operation) { Boolean withdraw = getBooleanOperationValue(operation.getValue()); @@ -75,12 +63,19 @@ public class ItemWithdrawReplaceOperation extends ReplacePatchOperation getArrayClassForEvaluation() { - return String[].class; + @Override + void checkModelForExistingValue(ItemRest resource) { + if ((Object) resource.getWithdrawn() == null) { + throw new PatchBadRequestException("Attempting to replace a non-existent value."); + } } - protected Class getClassForEvaluation() { - return String.class; + protected Class getArrayClassForEvaluation() { + return Boolean[].class; + } + + protected Class getClassForEvaluation() { + return Boolean.class; } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java index e2f6a66cc6..2549967be5 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java @@ -17,8 +17,7 @@ import org.dspace.app.rest.model.patch.Operation; import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; /** - * Base class for all patch operations. This class includes methods that - * can be used to type check objects that are converted from json. + * Base class for all resource patch operations. * * @author Michael Spalti */ @@ -28,13 +27,12 @@ public abstract class PatchOperation /** * Updates the rest model by applying the patch operation. * - * @param resource the rest model - * @param operation - * @return the updated rest model + * @param resource the rest model. + * @param operation the patch operation. + * @return the updated rest model. * @throws PatchBadRequestException */ - public abstract R perform(R resource, Operation operation) - throws PatchBadRequestException; + public abstract R perform(R resource, Operation operation); /** * Throws PatchBadRequestException for missing operation value. @@ -52,8 +50,9 @@ public abstract class PatchOperation * * @param value the operation value * @return the original or derived boolean value + * @throws PatchBadRequestException */ - Boolean getBooleanOperationValue(Object value) throws PatchBadRequestException { + Boolean getBooleanOperationValue(Object value) { Boolean bool; if (value instanceof String) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java index 872c8db1b0..b8fe75faac 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java @@ -8,40 +8,58 @@ package org.dspace.app.rest.repository.patch.factories.impl; import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.exception.UnprocessableEntityException; import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.patch.Operation; /** - * The base class for replace operations. + * Base class for replace patch operations. * - * @param - * @param + * @author Michael Spalti */ public abstract class ReplacePatchOperation extends PatchOperation { + /** + * Implements the patch operation for replace operations. + * Before performing the replace operation this method checks + * for a non-null operation value and a non-null value on the rest model + * (replace operations should only be applied to an existing value). + * @param resource the rest model. + * @param operation the replace patch operation. + * @return the updated rest model. + * @throws PatchBadRequestException + * @throws UnprocessableEntityException + */ + @Override + public R perform(R resource, Operation operation) + throws PatchBadRequestException { + + checkOperationValue(operation.getValue()); + checkModelForExistingValue(resource); + return replace(resource, operation); + + } + /** * Executes the replace patch operation. * - * @param resource - * @param operation - * @return + * @param resource the rest model. + * @param operation the replace patch operation. + * @return the updated rest model. * @throws PatchBadRequestException + * @throws UnprocessableEntityException */ - abstract R replace(R resource, Operation operation) - throws PatchBadRequestException; + abstract R replace(R resource, Operation operation); /** * Replace operations are not allowed on non-existent values. * Null values may exist in the RestModel for certain fields - * (usually non-boolean). - * - * @param value the rest model value to be replaced. + * (usually non-boolean). This method should be implemented + * to assure that the replace operation acts only on an existing value. + * @param resource the rest model. * @throws PatchBadRequestException */ - void checkModelForExistingValue(Object value) throws PatchBadRequestException { - if (value == null) { - throw new PatchBadRequestException("Attempting to replace a non-existent value."); - } - } + abstract void checkModelForExistingValue(R resource); + } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java index dc531b40fe..ef28bf08f5 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java @@ -14,10 +14,10 @@ import org.dspace.app.rest.model.patch.Operation; /** * The patch interface used by repository classes. * @param + * @throws PatchBadRequestException */ public interface ResourcePatchOperation { - R perform(R resource, Operation operation) - throws PatchBadRequestException; + R perform(R resource, Operation operation); } From 0c6690aa82eca13ffc93cc3aa8e452b97d8daed7 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Fri, 12 Oct 2018 09:36:15 +0200 Subject: [PATCH 099/193] cleaning up --- .../test/data/dspaceFolder/config/local.cfg | 20 +-- .../dspace/app/rest/OpenSearchController.java | 7 +- .../OpenSearchControllerDisabledTest.java | 155 +----------------- .../opensearch/OpenSearchControllerTest.java | 47 +----- dspace/config/local.cfg.EXAMPLE | 6 - dspace/config/log4j.properties | 2 +- 6 files changed, 29 insertions(+), 208 deletions(-) diff --git a/dspace-api/src/test/data/dspaceFolder/config/local.cfg b/dspace-api/src/test/data/dspaceFolder/config/local.cfg index 5f360ea693..62c077ff6c 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/local.cfg +++ b/dspace-api/src/test/data/dspaceFolder/config/local.cfg @@ -114,25 +114,25 @@ websvc.opensearch.enable = true # context for html request URLs - change only for non-standard servlet mapping websvc.opensearch.uicontext = simple-search # context for RSS/Atom request URLs - change only for non-standard servlet mapping -websvc.opensearch.svccontext = open-search/ +#websvc.opensearch.svccontext = open-search/ # present autodiscovery link in every page head -websvc.opensearch.autolink = true +#websvc.opensearch.autolink = true # number of hours to retain results before recalculating -websvc.opensearch.validity = 48 +#websvc.opensearch.validity = 48 # short name used in browsers for search service # should be 16 or fewer characters -websvc.opensearch.shortname = DS7 OpenSearch +#websvc.opensearch.shortname = DS7 OpenSearch # longer (up to 48 characters) name -websvc.opensearch.longname = DSpace 7 OpenSearch Service +#websvc.opensearch.longname = DSpace 7 OpenSearch Service # brief service description -websvc.opensearch.description = OpenSearch Service for DSpace 7 +#websvc.opensearch.description = OpenSearch Service for DSpace 7 # location of favicon for service, if any must be 16X16 pixels -websvc.opensearch.faviconurl = http://www.dspace.org/images/favicon.ico +#websvc.opensearch.faviconurl = http://www.dspace.org/images/favicon.ico # sample query - should return results -websvc.opensearch.samplequery = cats +#websvc.opensearch.samplequery = cats # tags used to describe search service -websvc.opensearch.tags = IR DSpace +#websvc.opensearch.tags = IR DSpace # result formats offered - use 1 or more comma-separated from: html,atom,rss # NB: html is required for autodiscovery in browsers to function, # and must be the first in the list if present -websvc.opensearch.formats = html,atom,rss +#websvc.opensearch.formats = html,atom,rss diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java index f764dd1e1b..39a0950c86 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java @@ -106,20 +106,17 @@ public class OpenSearchController implements ErrorController { log.debug("Searching for " + query + " in format " + format); // do some sanity checking - // TODO: make that work correctly if (!openSearchService.getFormats().contains(format)) { String err = "Format " + format + " is not supported."; response.setContentType("text/html"); response.setContentLength(err.length()); response.getWriter().write(err); - //response.sendError(HttpServletResponse.SC_BAD_REQUEST); - //return "error"; } // then the rest - we are processing the query DSpaceObject container = null; - // TODO: support pagination parameters + // support pagination parameters DiscoverQuery queryArgs = new DiscoverQuery(); queryArgs.setQuery(query); queryArgs.setStart(start); @@ -160,6 +157,7 @@ public class OpenSearchController implements ErrorController { } else { log.debug("OpenSearch Service is disabled"); String err = "OpenSearch Service is disabled"; + response.setStatus(404); response.setContentType("text/html"); response.setContentLength(err.length()); response.getWriter().write(err); @@ -187,6 +185,7 @@ public class OpenSearchController implements ErrorController { } else { log.debug("OpenSearch Service is disabled"); String err = "OpenSearch Service is disabled"; + response.setStatus(404); response.setContentType("text/html"); response.setContentLength(err.length()); response.getWriter().write(err); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java index 3cfdf55fc6..874519860a 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java @@ -7,35 +7,10 @@ */ package org.dspace.app.opensearch; -/* -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasItem; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -*/ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -/* -import org.dspace.app.rest.OpenSearchController; -import org.dspace.services.ConfigurationService; -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.util.service.OpenSearchService; -import org.dspace.content.Collection; -import org.dspace.content.Community; -import org.dspace.content.Item; -import org.dspace.eperson.Group; -*/ - import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.services.ConfigurationService; @@ -46,7 +21,6 @@ import org.junit.Test; /** * Integration test to test the /opensearch endpoint - * (Class has to start or end with IT to be picked up by the failsafe plugin) * * @author Oliver Goldschmidt (o dot goldschmidt at tuhh dot de) */ @@ -56,15 +30,9 @@ public class OpenSearchControllerDisabledTest extends AbstractControllerIntegrat @Before public void init() throws Exception { + // disable OpenSearch by configuration to test the disabled behaviour although its active in test config configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); configurationService.setProperty("websvc.opensearch.enable", false); -/* -System.out.println("Testing OpenSearch"); -MockHttpServletResponse resp2 = getClient().perform(get("/opensearch/search") - .param("query", "dog")) - .andReturn().getResponse(); -System.out.println("Response from Test 2: "+resp2.getContentAsString()); -*/ } @Test @@ -72,29 +40,11 @@ System.out.println("Response from Test 2: "+resp2.getContentAsString()); //When we call the root endpoint getClient().perform(get("/opensearch/search") .param("query", "dog")) - //The status has to be 200 OK - .andExpect(status().isOk()) - //We expect the content type to be "application/hal+json;charset=UTF-8" + //The status has to be 404 Not Found + .andExpect(status().isNotFound()) + //We expect the content type to be "application/html" .andExpect(content().contentType("text/html")) -/* - //Our default Discovery config has 4 browse indexes so we expect this to be reflected in the page - // object - .andExpect(jsonPath("$.page.size", is(20))) - .andExpect(jsonPath("$.page.totalElements", is(4))) - .andExpect(jsonPath("$.page.totalPages", is(1))) - .andExpect(jsonPath("$.page.number", is(0))) - - //The array of browse index should have a size 4 - .andExpect(jsonPath("$._embedded.browses", hasSize(4))) - - //Check that all (and only) the default browse indexes are present - .andExpect(jsonPath("$._embedded.browses", containsInAnyOrder( - BrowseIndexMatcher.dateIssuedBrowseIndex("asc"), - BrowseIndexMatcher.contributorBrowseIndex("asc"), - BrowseIndexMatcher.titleBrowseIndex("asc"), - BrowseIndexMatcher.subjectBrowseIndex("asc") - ))) -*/ + .andExpect(content().string("OpenSearch Service is disabled")) ; } @@ -102,99 +52,10 @@ System.out.println("Response from Test 2: "+resp2.getContentAsString()); public void serviceDocumentTest() throws Exception { //When we call the root endpoint getClient().perform(get("/opensearch/service")) - //The status has to be 200 OK - .andExpect(status().isOk()) + //The status has to be 404 Not Found + .andExpect(status().isNotFound()) .andExpect(content().contentType("text/html")) - //We expect the content type to be "application/hal+json;charset=UTF-8" -// .andExpect(content().contentType(contentType)) -/* - //Check that the JSON root matches the expected browse index - .andExpect(jsonPath("$", BrowseIndexMatcher.titleBrowseIndex("asc"))) -*/ + .andExpect(content().string("OpenSearch Service is disabled")) ; } - -/* - @Test - public void findItemsWithOU() throws Exception { - context.turnOffAuthorisationSystem(); - - //** GIVEN ** - //1. A community-collection structure with one parent community with sub-community and two collections. - parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); - Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); - Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); - Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); - - //2. Three public items that are readable by Anonymous with different subjects - Item publicItem1 = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); - - Item publicItem2 = ItemBuilder.createItem(context, col2) - .withTitle("Public item 2") - .withIssueDate("2016-02-13") - .withAuthor("Smith, Maria").withAuthor("Doe, Jane") - .withSubject("TestingForMore").withSubject("ExtraEntry") - .build(); - - Item publicItem3 = ItemBuilder.createItem(context, col2) - .withTitle("Public item 2") - .withIssueDate("2016-02-13") - .withAuthor("Smith, Maria").withAuthor("Doe, Jane") - .withSubject("AnotherTest").withSubject("TestingForMore") - .withSubject("ExtraEntry") - .build(); - - //** WHEN ** - //An anonymous user browses this endpoint to find which subjects are currently in the repository - getClient().perform(get("/api/discover/browses/subject/entries")) - - //** THEN ** - //The status has to be 200 - .andExpect(status().isOk()) - - //We expect the content type to be "application/hal+json;charset=UTF-8" - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$.page.size", is(20))) - //Check that there are indeed 3 different subjects - .andExpect(jsonPath("$.page.totalElements", is(3))) - //Check the embedded resources and that they're sorted alphabetically - //Check that the subject matches as expected - //Verify that they're sorted alphabetically - .andExpect(jsonPath("$._embedded.browseEntries", - contains(BrowseEntryResourceMatcher.matchBrowseEntry("AnotherTest", 1), - BrowseEntryResourceMatcher.matchBrowseEntry("ExtraEntry", 3), - BrowseEntryResourceMatcher.matchBrowseEntry("TestingForMore", 2) - ))); - - getClient().perform(get("/api/discover/browses/subject/entries") - .param("sort", "value,desc")) - - //** THEN ** - //The status has to be 200 - .andExpect(status().isOk()) - .andDo(MockMvcResultHandlers.print()) - //We expect the content type to be "application/hal+json;charset=UTF-8" - .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$.page.size", is(20))) - //Check that there are indeed 3 different subjects - .andExpect(jsonPath("$.page.totalElements", is(3))) - //Check the embedded resources and that they're sorted alphabetically - //Check that the subject matches as expected - //Verify that they're sorted alphabetically - .andExpect(jsonPath("$._embedded.browseEntries", - contains(BrowseEntryResourceMatcher.matchBrowseEntry("TestingForMore", 2), - BrowseEntryResourceMatcher.matchBrowseEntry("ExtraEntry", 3), - BrowseEntryResourceMatcher.matchBrowseEntry("AnotherTest", 1) - ))); - } -*/ } \ No newline at end of file diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index 00ccc7cec0..a4a9d1842c 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -7,36 +7,11 @@ */ package org.dspace.app.opensearch; -/* -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasItem; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.not; -*/ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath; -/* -import org.dspace.app.rest.OpenSearchController; -import org.dspace.services.ConfigurationService; -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.util.service.OpenSearchService; -import org.dspace.content.Collection; -import org.dspace.content.Community; -import org.dspace.content.Item; -import org.dspace.eperson.Group; -*/ - import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.services.ConfigurationService; @@ -60,13 +35,6 @@ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest // override the configuration settings here if other settings are required for test // configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); // configurationService.setProperty("websvc.opensearch.enable", true); - /* - System.out.println("Testing OpenSearch"); - MockHttpServletResponse resp2 = getClient().perform(get("/opensearch/search") - .param("query", "cats")) - .andReturn().getResponse(); - System.out.println("Response from Test 2: "+resp2.getContentAsString()); - */ } @Test @@ -118,20 +86,19 @@ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest // and the contentType has to be an opensearchdescription .andExpect(content().contentType("application/opensearchdescription+xml;charset=UTF-8")) // and there need to be some values taken from the test configuration - .andExpect(xpath("OpenSearchDescription/ShortName").string("DS7 OpenSearch")) - .andExpect(xpath("OpenSearchDescription/LongName").string("DSpace 7 OpenSearch Service")) - .andExpect(xpath("OpenSearchDescription/Description").string("OpenSearch Service for DSpace 7")) - .andExpect(xpath("OpenSearchDescription/ShortName").string("DS7 OpenSearch")) + .andExpect(xpath("OpenSearchDescription/ShortName").string("DSpace")) + .andExpect(xpath("OpenSearchDescription/LongName").string("DSpace at My University")) + .andExpect(xpath("OpenSearchDescription/Description").string("DSpace at My University DSpace repository")) ; /* Expected response for the service document is: - DS7 OpenSearch - DSpace 7 OpenSearch Service - OpenSearch Service for DSpace 7 + DSpace + DSpace at My University + DSpace at My University DSpace repository UTF-8 UTF-8 - + IR DSpace dspace-help@myu.edu http://www.dspace.org/images/favicon.ico diff --git a/dspace/config/local.cfg.EXAMPLE b/dspace/config/local.cfg.EXAMPLE index 37261acb04..2bf60a0281 100644 --- a/dspace/config/local.cfg.EXAMPLE +++ b/dspace/config/local.cfg.EXAMPLE @@ -199,9 +199,3 @@ db.schema = public # Authentication by Password (encrypted in DSpace's database). See authentication-password.cfg for default configuration. # Enabled by default in authentication.cfg #plugin.sequence.org.dspace.authenticate.AuthenticationMethod = org.dspace.authenticate.PasswordAuthentication - -#### OpenSearch Settings #### -# NB: for result data formatting, OpenSearch uses Syndication Feed Settings -# so even if Syndication Feeds are not enabled, they must be configured -# enable open search -websvc.opensearch.enable = true diff --git a/dspace/config/log4j.properties b/dspace/config/log4j.properties index 30e69fc137..5acdacd310 100644 --- a/dspace/config/log4j.properties +++ b/dspace/config/log4j.properties @@ -22,7 +22,7 @@ log.dir=${dspace.dir}/log # Log level for all DSpace-specific code (org.dspace.*) # Possible values (from most to least info): DEBUG, INFO, WARN, ERROR, FATAL # Defaults to INFO -loglevel.dspace=DEBUG +loglevel.dspace=INFO # loglevel.other # Log level for other third-party tools/APIs used by DSpace From c7cde57c3a2920d882f5ca607d146bc8707706c8 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Fri, 12 Oct 2018 09:38:57 +0200 Subject: [PATCH 100/193] removing unnecessary settings in test configuration --- .../test/data/dspaceFolder/config/local.cfg | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/dspace-api/src/test/data/dspaceFolder/config/local.cfg b/dspace-api/src/test/data/dspaceFolder/config/local.cfg index 62c077ff6c..4be509b8b7 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/local.cfg +++ b/dspace-api/src/test/data/dspaceFolder/config/local.cfg @@ -107,32 +107,5 @@ plugin.sequence.java.util.Collection = \ java.util.TreeSet #### OpenSearch Settings #### -# NB: for result data formatting, OpenSearch uses Syndication Feed Settings -# so even if Syndication Feeds are not enabled, they must be configured # enable open search websvc.opensearch.enable = true -# context for html request URLs - change only for non-standard servlet mapping -websvc.opensearch.uicontext = simple-search -# context for RSS/Atom request URLs - change only for non-standard servlet mapping -#websvc.opensearch.svccontext = open-search/ -# present autodiscovery link in every page head -#websvc.opensearch.autolink = true -# number of hours to retain results before recalculating -#websvc.opensearch.validity = 48 -# short name used in browsers for search service -# should be 16 or fewer characters -#websvc.opensearch.shortname = DS7 OpenSearch -# longer (up to 48 characters) name -#websvc.opensearch.longname = DSpace 7 OpenSearch Service -# brief service description -#websvc.opensearch.description = OpenSearch Service for DSpace 7 -# location of favicon for service, if any must be 16X16 pixels -#websvc.opensearch.faviconurl = http://www.dspace.org/images/favicon.ico -# sample query - should return results -#websvc.opensearch.samplequery = cats -# tags used to describe search service -#websvc.opensearch.tags = IR DSpace -# result formats offered - use 1 or more comma-separated from: html,atom,rss -# NB: html is required for autodiscovery in browsers to function, -# and must be the first in the list if present -#websvc.opensearch.formats = html,atom,rss From d421942321a289aebab665e64c067583f1d38c8b Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Fri, 12 Oct 2018 10:10:13 +0200 Subject: [PATCH 101/193] fixes style issue --- .../org/dspace/app/opensearch/OpenSearchControllerTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index a4a9d1842c..5494e9194d 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -88,7 +88,9 @@ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest // and there need to be some values taken from the test configuration .andExpect(xpath("OpenSearchDescription/ShortName").string("DSpace")) .andExpect(xpath("OpenSearchDescription/LongName").string("DSpace at My University")) - .andExpect(xpath("OpenSearchDescription/Description").string("DSpace at My University DSpace repository")) + .andExpect(xpath("OpenSearchDescription/Description") + .string("DSpace at My University DSpace repository") + ) ; /* Expected response for the service document is: From fa3af00e4df6d6d591e33fbd853031e40e409c51 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Fri, 12 Oct 2018 16:55:00 +0200 Subject: [PATCH 102/193] removes unnecessary init method --- .../app/opensearch/OpenSearchControllerTest.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index 5494e9194d..201f7a169e 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -14,8 +14,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import org.dspace.app.rest.test.AbstractControllerIntegrationTest; -import org.dspace.services.ConfigurationService; - import org.junit.Before; import org.junit.Test; @@ -27,16 +25,6 @@ import org.junit.Test; */ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest { - // configuration is taken from dspace-api/src/test/data/dspaceFolder/config/local.cfg - private ConfigurationService configurationService; - - @Before - public void init() throws Exception { - // override the configuration settings here if other settings are required for test - // configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); - // configurationService.setProperty("websvc.opensearch.enable", true); - } - @Test public void searchAtomTest() throws Exception { //When we call the root endpoint From b702582fb273379ad6b5fb3ea9537b3e2412bee8 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Mon, 15 Oct 2018 17:04:27 +0200 Subject: [PATCH 103/193] removes unnecessary import --- .../java/org/dspace/app/opensearch/OpenSearchControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index 201f7a169e..3181112c4f 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -14,7 +14,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import org.dspace.app.rest.test.AbstractControllerIntegrationTest; -import org.junit.Before; import org.junit.Test; /** From f9861ec5ca58c794b67ff98d7aefb8bed6a59f45 Mon Sep 17 00:00:00 2001 From: Michael W Spalti Date: Mon, 15 Oct 2018 13:22:43 -0700 Subject: [PATCH 104/193] [DS-4021] Corrected minor typo in integration test. --- .../repository/patch/factories/impl/ReplacePatchOperation.java | 1 - .../test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java index d14825b20f..64a1615437 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java @@ -8,7 +8,6 @@ package org.dspace.app.rest.repository.patch.factories.impl; import org.dspace.app.rest.exception.PatchBadRequestException; - import org.dspace.app.rest.exception.UnprocessableEntityException; import org.dspace.app.rest.model.RestModel; import org.dspace.app.rest.model.patch.Operation; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index 6579b49694..ab84107706 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -1022,7 +1022,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { ReplaceOperation replaceOperation2 = new ReplaceOperation("/certificate", true); ops.add(replaceOperation2); // This will fail. The path does not exist. - ReplaceOperation replaceOperation3 = new ReplaceOperation("/nonexistentPath\"", "somevalue"); + ReplaceOperation replaceOperation3 = new ReplaceOperation("/nonexistentPath", "somevalue"); ops.add(replaceOperation3); ReplaceOperation replaceOperation4 = new ReplaceOperation("/certificate", false); ops.add(replaceOperation4); From 8b0db601b07e542c1e36757c5a8569d01be9f00e Mon Sep 17 00:00:00 2001 From: Andrea Bollini Date: Wed, 17 Oct 2018 16:50:41 +0200 Subject: [PATCH 105/193] Improved javadoc about new submission conf concepts --- .../submit/model/LanguageFormField.java | 14 +- .../org/dspace/app/rest/model/ScopeEnum.java | 2 +- .../rest/model/SubmissionFormFieldRest.java | 136 +++++++++++++++++- .../model/SubmissionFormInputTypeRest.java | 2 +- .../app/rest/model/SubmissionFormRest.java | 29 +++- .../app/rest/model/SubmissionFormRowRest.java | 12 ++ .../rest/model/SubmissionVisibilityRest.java | 10 +- .../dspace/app/rest/model/VisibilityEnum.java | 2 +- 8 files changed, 198 insertions(+), 9 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/submit/model/LanguageFormField.java b/dspace-api/src/main/java/org/dspace/submit/model/LanguageFormField.java index bbfdf0cb18..6a746844bc 100644 --- a/dspace-api/src/main/java/org/dspace/submit/model/LanguageFormField.java +++ b/dspace-api/src/main/java/org/dspace/submit/model/LanguageFormField.java @@ -7,10 +7,22 @@ */ package org.dspace.submit.model; +/** + * A simple POJO to store information about the available languages for a field + * + * @author Andrea Bollini (andrea.bollini at 4science.it) + * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * + */ public class LanguageFormField { - + /** + * The value to present to the user + */ private String display; + /** + * The internal iso code to store in the database + */ private String code; public LanguageFormField(String code, String display) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ScopeEnum.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ScopeEnum.java index 79fcea3d80..8f729f39a3 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ScopeEnum.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ScopeEnum.java @@ -10,7 +10,7 @@ package org.dspace.app.rest.model; /** * The possible restriction options for the scope attributes in the - * SubmissionPanel resource and InputFormPage resource + * SubmissionPanel resource and SubmissionForm's fields * * @author Andrea Bollini (andrea.bollini at 4science.it) */ diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormFieldRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormFieldRest.java index ca4088d077..a07ce52f71 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormFieldRest.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormFieldRest.java @@ -17,84 +17,194 @@ import org.dspace.submit.model.LanguageFormField; import org.dspace.submit.model.SelectableMetadata; /** - * The InputFormField REST Resource. It is not addressable directly, only used + * The SubmissionFormField REST Resource. It is not addressable directly, only used * as inline object in the InputForm resource * * @author Andrea Bollini (andrea.bollini at 4science.it) */ @JsonInclude(value = Include.NON_NULL) public class SubmissionFormFieldRest { - + /** + * The SubmissionFormInputType for this field + */ private SubmissionFormInputTypeRest input; + + /** + * The main scope of the field + */ private ScopeEnum scope; + + /** + * The visibility restriction for the field + */ private SubmissionVisibilityRest visibility; + /** + * The label of the field + */ private String label; + + /** + * true if the field is required + */ private boolean mandatory; + + /** + * true if the field allows multiple value + */ private boolean repeatable; + + /** + * The message to return if the information is missing + */ private String mandatoryMessage; + + /** + * A text to help field input + */ private String hints; + + /** + * Extra information to be used by the UI to customize the presentation of the field. The format is dependent from + * the UI implementation, the default Angular UI expects whitespace separated CSS class to add to the field + */ private String style; + /** + * The list of metadata, often a single element, to offer for the storage of the information. This map the DSpace < + * 7 concepts of qualdrop + */ private List selectableMetadata; + + /** + * The list of language that can be used to fill the field + */ private List languageCodes; + /** + * Getter for {@link #selectableMetadata} + * + * @return {@link #selectableMetadata} + */ public List getSelectableMetadata() { return selectableMetadata; } + /** + * Setter for {@link #selectableMetadata} + * + */ public void setSelectableMetadata(List selectableMetadata) { this.selectableMetadata = selectableMetadata; } + /** + * Getter for {@link #label} + * + * @return {@link #label} + */ public String getLabel() { return label; } + /** + * Setter for {@link #label} + * + */ public void setLabel(String label) { this.label = label; } + /** + * Getter for {@link #mandatory} + * + * @return {@link #mandatory} + */ public boolean isMandatory() { return mandatory; } + /** + * Setter for {@link #mandatory} + * + */ public void setMandatory(boolean mandatory) { this.mandatory = mandatory; } + /** + * Getter for {@link #repeatable} + * + * @return {@link #repeatable} + */ public boolean isRepeatable() { return repeatable; } + /** + * Setter for {@link #repeatable} + * + */ public void setRepeatable(boolean repeatable) { this.repeatable = repeatable; } + /** + * Getter for {@link #mandatoryMessage} + * + * @return {@link #mandatoryMessage} + */ public String getMandatoryMessage() { return mandatoryMessage; } + /** + * Setter for {@link #mandatoryMessage} + * + */ public void setMandatoryMessage(String mandatoryMessage) { this.mandatoryMessage = mandatoryMessage; } + /** + * Getter for {@link #hints} + * + * @return {@link #hints} + */ public String getHints() { return hints; } + /** + * Setter for {@link #hints} + * + */ public void setHints(String hints) { this.hints = hints; } + /** + * Getter for {@link #style} + * + * @return {@link #style} + */ public String getStyle() { return style; } + /** + * Setter for {@link #style} + * + */ public void setStyle(String style) { this.style = style; } + /** + * Getter for {@link #languageCodes} + * + * @return {@link #languageCodes} + */ public List getLanguageCodes() { if (languageCodes == null) { languageCodes = new ArrayList(); @@ -102,22 +212,44 @@ public class SubmissionFormFieldRest { return languageCodes; } + /** + * Setter for {@link #languageCodes} + * + */ public void setLanguageCodes(List languageCodes) { this.languageCodes = languageCodes; } + /** + * Getter for {@link #input} + * + * @return {@link #input} + */ public SubmissionFormInputTypeRest getInput() { return input; } + /** + * Setter for {@link #input} + * + */ public void setInput(SubmissionFormInputTypeRest input) { this.input = input; } + /** + * Getter for {@link #scope} + * + * @return {@link #selectableMetadata} + */ public ScopeEnum getScope() { return scope; } + /** + * Setter for {@link #scope} + * + */ public void setScope(ScopeEnum scope) { this.scope = scope; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormInputTypeRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormInputTypeRest.java index 07c20da2eb..594d715b22 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormInputTypeRest.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormInputTypeRest.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; /** - * The InputFormField REST Resource. It is not addressable directly, only used + * The SubmissionFormInputType REST Resource. It is not addressable directly, only used * as inline object in the InputForm resource * * @author Andrea Bollini (andrea.bollini at 4science.it) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRest.java index a49295bd80..8dededdabb 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRest.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRest.java @@ -12,7 +12,7 @@ import java.util.List; import org.dspace.app.rest.RestResourceController; /** - * The Input Form REST Resource + * The Submission Form REST Resource * * @author Andrea Bollini (andrea.bollini at 4science.it) */ @@ -21,19 +21,37 @@ public class SubmissionFormRest extends BaseObjectRest { public static final String NAME_LINK_ON_PANEL = RestAddressableModel.CONFIGURATION; public static final String CATEGORY = RestAddressableModel.CONFIGURATION; + /** + * An unique name identifying the submission form + */ private String name; + /** + * The list of row in the submission form + */ private List rows; @Override + /** + * The id of the submission form is its name + */ public String getId() { return name; } + /** + * Setter for {@link #name} + * + */ public void setName(String name) { this.name = name; } + /** + * Getter for {@link #name} + * + * @return {@link #name} + */ public String getName() { return name; } @@ -53,10 +71,19 @@ public class SubmissionFormRest extends BaseObjectRest { return CATEGORY; } + /** + * Getter for {@link #rows} + * + * @return {@link #rows} + */ public List getRows() { return rows; } + /** + * Setter for {@link #rows} + * + */ public void setRows(List rows) { this.rows = rows; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java index 49062270a9..250b282e6b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java @@ -17,12 +17,24 @@ import java.util.List; * @author Andrea Bollini (andrea.bollini at 4science.it) */ public class SubmissionFormRowRest { + /** + * The list of fields in the row + */ private List fields; + /** + * Getter for {@link #fields} + * + * @return {@link #fields} + */ public List getFields() { return fields; } + /** + * Setter for {@link #fields} + * + */ public void setFields(List fields) { this.fields = fields; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionVisibilityRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionVisibilityRest.java index 8cb45975a7..40f71a97f4 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionVisibilityRest.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionVisibilityRest.java @@ -12,13 +12,19 @@ import java.util.Objects; /** * The SubmissionVisibility REST Resource. It is not addressable directly, only - * used as inline object in the SubmissionPanel resource and InputFormPage - * resource + * used as inline object in the SubmissionPanel resource and SubmissionForm's fields * * @author Andrea Bollini (andrea.bollini at 4science.it) */ public class SubmissionVisibilityRest { + /** + * The visibility to apply within the main scope + */ private VisibilityEnum main; + + /** + * The visibility to apply outside the main scope + */ private VisibilityEnum other; public SubmissionVisibilityRest(VisibilityEnum main, VisibilityEnum other) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/VisibilityEnum.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/VisibilityEnum.java index c8d5bcf3f4..fbad9069a3 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/VisibilityEnum.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/VisibilityEnum.java @@ -10,7 +10,7 @@ package org.dspace.app.rest.model; /** * The possible restriction options for the visibility attributes in the - * SubmissionPanel resource and InputFormPage resource + * SubmissionPanel resource and SubmissionForm's fields * * @author Andrea Bollini (andrea.bollini at 4science.it) */ From 6dc6102325457031efefc1f62215223abde08f71 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Wed, 17 Oct 2018 09:53:46 -0500 Subject: [PATCH 106/193] Update all web.xml files to use Servlet 3.1. Requires minor reorg in older webapps. --- dspace-oai/src/main/webapp/WEB-INF/web.xml | 4 +- dspace-rdf/src/main/webapp/WEB-INF/web.xml | 7 ++- dspace-rest/src/main/webapp/WEB-INF/web.xml | 9 ++-- dspace-sword/src/main/webapp/WEB-INF/web.xml | 18 +++----- .../src/main/webapp/WEB-INF/web.xml | 43 ++++++------------- 5 files changed, 27 insertions(+), 54 deletions(-) diff --git a/dspace-oai/src/main/webapp/WEB-INF/web.xml b/dspace-oai/src/main/webapp/WEB-INF/web.xml index 33d3c2c31b..54d207c099 100644 --- a/dspace-oai/src/main/webapp/WEB-INF/web.xml +++ b/dspace-oai/src/main/webapp/WEB-INF/web.xml @@ -8,9 +8,9 @@ http://www.dspace.org/license/ --> - + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> XOAI Data Provider diff --git a/dspace-rdf/src/main/webapp/WEB-INF/web.xml b/dspace-rdf/src/main/webapp/WEB-INF/web.xml index 222e17de2c..65f22b637b 100644 --- a/dspace-rdf/src/main/webapp/WEB-INF/web.xml +++ b/dspace-rdf/src/main/webapp/WEB-INF/web.xml @@ -8,10 +8,9 @@ http://www.dspace.org/license/ --> - + RDF Data Provider diff --git a/dspace-rest/src/main/webapp/WEB-INF/web.xml b/dspace-rest/src/main/webapp/WEB-INF/web.xml index 90d68ac6a2..df639b9b08 100644 --- a/dspace-rest/src/main/webapp/WEB-INF/web.xml +++ b/dspace-rest/src/main/webapp/WEB-INF/web.xml @@ -8,10 +8,9 @@ http://www.dspace.org/license/ --> - + dspace.request @@ -109,4 +108,4 @@ - \ No newline at end of file + diff --git a/dspace-sword/src/main/webapp/WEB-INF/web.xml b/dspace-sword/src/main/webapp/WEB-INF/web.xml index 733de69745..3d721e9744 100644 --- a/dspace-sword/src/main/webapp/WEB-INF/web.xml +++ b/dspace-sword/src/main/webapp/WEB-INF/web.xml @@ -8,35 +8,29 @@ http://www.dspace.org/license/ --> - - + DSpace SWORD Server + The location of the DSpace home directory dspace.dir ${dspace.dir} - - The location of the DSpace home directory - + The SWORDServer class name sword-server-class org.dspace.sword.DSpaceSWORDServer - - The SWORDServer class name - + The type of authentication used : [Basic|None] authentication-method Basic - - The type of authentication used : [Basic|None] - - - - + DSpace SWORD 2.0 Server + The location of the DSpace home directory dspace.dir ${dspace.dir} - - The location of the DSpace home directory - + The ServiceDocumentManager server implementation class name service-document-impl org.dspace.sword2.ServiceDocumentManagerDSpace - - The ServiceDocumentManager server implementation class name - + The CollectionListManager server implementation class name collection-list-impl org.dspace.sword2.CollectionListManagerDSpace - - The CollectionListManager server implementation class name - + The CollectionDepositManager server implementation class name collection-deposit-impl org.dspace.sword2.CollectionDepositManagerDSpace - - The CollectionDepositManager server implementation class name - + The MediaResourceManager server implementation class name media-resource-impl org.dspace.sword2.MediaResourceManagerDSpace - - The MediaResourceManager server implementation class name - + The ContainerManager server implementation class name container-impl org.dspace.sword2.ContainerManagerDSpace - - The ContainerManager server implementation class name - + The StatementManager server implementation class name statement-impl org.dspace.sword2.StatementManagerDSpace - - The StatementManager server implementation class name - + The SwordConfiguration server implementation class name config-impl org.dspace.sword2.SwordConfigurationDSpace - - The SwordConfiguration server implementation class name - + The type of authentication used : [Basic|None] authentication-method Basic - - The type of authentication used : [Basic|None] - From 9c242087a7633ebf5aee9e72e4b72394d99ac2a4 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Thu, 25 Oct 2018 15:34:21 -0400 Subject: [PATCH 110/193] [DS-3433] Silence exceptions when named Session not found or there is no JNDI initial context. --- .../services/email/EmailServiceImpl.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java b/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java index 1d8eff903f..f20458f51a 100644 --- a/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java +++ b/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java @@ -12,7 +12,9 @@ import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.naming.InitialContext; +import javax.naming.NameNotFoundException; import javax.naming.NamingException; +import javax.naming.NoInitialContextException; import org.dspace.kernel.mixins.InitializedService; import org.dspace.services.ConfigurationService; @@ -33,7 +35,7 @@ import org.springframework.beans.factory.annotation.Required; public class EmailServiceImpl extends Authenticator implements EmailService, InitializedService { - private static final Logger logger = (Logger) LoggerFactory.getLogger(EmailServiceImpl.class); + private static final Logger logger = LoggerFactory.getLogger(EmailServiceImpl.class); private Session session = null; @@ -53,7 +55,7 @@ public class EmailServiceImpl /** * Provide a reference to the JavaMail session. * - * @return the managed Session, or null if none could be created. + * @return the managed Session, or {@code null} if none could be created. */ @Override public Session getSession() { @@ -67,12 +69,16 @@ public class EmailServiceImpl if (null == sessionName) { sessionName = "Session"; } + String sessionUri = "java:comp/env/mail/" + sessionName; + logger.debug("Looking up Session as {}", sessionUri); try { InitialContext ctx = new InitialContext(null); - session = (Session) ctx.lookup("java:comp/env/mail/" + sessionName); + session = (Session) ctx.lookup(sessionUri); + } catch (NameNotFoundException | NoInitialContextException ex) { + // Not a problem -- build a new Session from configuration. } catch (NamingException ex) { - logger.warn("Couldn't get an email session from environment: {}", - ex.getMessage()); + logger.warn("Couldn't get an email session from environment: {}: {}", + ex.getClass().getName(), ex.getMessage()); } if (null != session) { @@ -106,8 +112,6 @@ public class EmailServiceImpl props.put("mail.smtp.auth", "true"); session = Session.getInstance(props, this); } - - } } From 110f6c2a8d05f16422fd1d68d4bed35c9544abc9 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Mon, 29 Oct 2018 09:31:33 +0100 Subject: [PATCH 111/193] ignore test instead of having it commented out --- .../org/dspace/app/opensearch/OpenSearchControllerTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index 3181112c4f..dc3151a8e2 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -14,6 +14,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.junit.Ignore; import org.junit.Test; /** @@ -36,8 +37,9 @@ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest ; } - /* HTML is an open issue in OpenSearch, so skip this test at the moment + // HTML is an open issue in OpenSearch, so skip this test at the moment @Test + @Ignore public void searchHtmlTest() throws Exception { //When we call the root endpoint getClient().perform(get("/opensearch/search") @@ -49,7 +51,6 @@ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest .andExpect(content().contentType("text/html;charset=UTF-8")) ; } - */ @Test public void searchRssTest() throws Exception { From c08fb4af1dc1f4f3a5d4d43f3e82be1ab87a4204 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Mon, 29 Oct 2018 13:53:20 +0100 Subject: [PATCH 112/193] removes wrong line from comment --- .../src/main/java/org/dspace/app/rest/OpenSearchController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java index 39a0950c86..ebba89fff9 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java @@ -204,7 +204,6 @@ public class OpenSearchController implements ErrorController { /** * Internal method for controller initialization - * Not used currently */ private void init() { if (searchIndices == null) { From 0a9f5efcdcf688e07a1e0e1e12abe4664f74ab09 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Mon, 29 Oct 2018 13:53:51 +0100 Subject: [PATCH 113/193] adds some tests --- .../opensearch/OpenSearchControllerTest.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index dc3151a8e2..1ffda81f89 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -12,8 +12,17 @@ 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.GroupBuilder; +import org.dspace.app.rest.builder.ItemBuilder; + import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.Item; + import org.junit.Ignore; import org.junit.Test; @@ -65,6 +74,111 @@ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest ; } + @Test + public void noResultsTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "this query is not supposed to have a result")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/totalResults").string("0")) + .andExpect(xpath("feed/Query/@searchTerms").string("this+query+is+not+supposed+to+have+a+result")) + ; + } + + @Test + public void findResultSimpleTest() throws Exception { + //Turn off the authorization system, otherwise we can't make the objects + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Boars at Yellowstonepark") + .withIssueDate("2017-10-17") + .withAuthor("Ballini, Andreas").withAuthor("Moriarti, Susan") + .build(); + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "Boars")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/Query/@searchTerms").string("Boars")) + .andExpect(xpath("feed/totalResults").string("1")) + ; + } + + @Test + public void findResultWithSpecialCharsTest() throws Exception { + //Turn off the authorization system, otherwise we can't make the objects + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Bären im Yellowstonepark") + .withIssueDate("2017-10-17") + .withAuthor("Bäcker, Nick") + .build(); + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "Bär")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/Query/@searchTerms").string("B%C3%A4r")) + .andExpect(xpath("feed/totalResults").string("0")) + ; + } + + @Test + public void invalidQueryTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "urn::nbn:de:fake-123")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/Query/@searchTerms").string("urn:nbn:de:fake-123")) + .andExpect(xpath("feed/totalResults").string("0")) + ; + } + + @Test + public void emptyQueryTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/totalResults").string("0")) + ; + } + @Test public void serviceDocumentTest() throws Exception { //When we call the root endpoint From b283d5d9e42bd60d525ef4c6f7e72e6df1d0abb5 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 29 Oct 2018 17:07:54 +0000 Subject: [PATCH 114/193] Fix DS-4066 by update all IDs to string type in schema --- dspace/solr/statistics/conf/schema.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dspace/solr/statistics/conf/schema.xml b/dspace/solr/statistics/conf/schema.xml index 6386beee53..428ade7fc5 100644 --- a/dspace/solr/statistics/conf/schema.xml +++ b/dspace/solr/statistics/conf/schema.xml @@ -286,19 +286,19 @@ --> - + - + - - - + + + @@ -313,7 +313,7 @@ - + @@ -323,8 +323,8 @@ - - + + From b622781f5d1a0914539779bf6a757f9d912684df Mon Sep 17 00:00:00 2001 From: Tom Desair Date: Mon, 29 Oct 2018 23:02:34 +0100 Subject: [PATCH 115/193] DS-3542: Added unit tests for ClientInfoServiceImpl --- .../service/impl/ClientInfoServiceImpl.java | 2 + .../impl/ClientInfoServiceImplTest.java | 165 ++++++++++++++++++ .../util/DummyHttpServletRequest.java | 31 +++- 3 files changed, 190 insertions(+), 8 deletions(-) create mode 100644 dspace-api/src/test/java/org/dspace/service/impl/ClientInfoServiceImplTest.java diff --git a/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java b/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java index 771374299c..76874908d7 100644 --- a/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java @@ -20,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired; /** * Implementation of {@link ClientInfoService} that can provide information on DSpace client requests + * + * @author tom dot desair at gmail dot com */ public class ClientInfoServiceImpl implements ClientInfoService { diff --git a/dspace-api/src/test/java/org/dspace/service/impl/ClientInfoServiceImplTest.java b/dspace-api/src/test/java/org/dspace/service/impl/ClientInfoServiceImplTest.java new file mode 100644 index 0000000000..42c78944e1 --- /dev/null +++ b/dspace-api/src/test/java/org/dspace/service/impl/ClientInfoServiceImplTest.java @@ -0,0 +1,165 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.dspace.AbstractDSpaceTest; +import org.dspace.service.ClientInfoService; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; +import org.dspace.statistics.util.DummyHttpServletRequest; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +/** + * Unit test class for the {@link ClientInfoServiceImpl} class which implements + * the {@link ClientInfoService} interface + * + * @author tom dot desair at gmail dot com + */ +@RunWith(MockitoJUnitRunner.class) +public class ClientInfoServiceImplTest extends AbstractDSpaceTest { + + private ClientInfoService clientInfoService; + + private ConfigurationService configurationService; + + @Before + public void init() { + configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + } + + @Test + public void getClientIpFromRequest() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", "127.0.0"); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + DummyHttpServletRequest req = new DummyHttpServletRequest(); + req.setAddress("127.0.0.1"); + req.addHeader("X-Forwarded-For", "192.168.1.24"); + + assertEquals("192.168.1.24", clientInfoService.getClientIp(req)); + } + + @Test + public void getClientIpWithTrustedProxy() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", "127.0.0"); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "127.0.0.1"; + String xForwardedFor = "192.168.1.24"; + + assertEquals("192.168.1.24", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + } + + + @Test + public void getClientIpWithUntrustedProxy() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", "192.168.1.1"); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "10.24.64.14"; + String xForwardedFor = "192.168.1.24"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + } + + @Test + public void getClientIpWithMultipleTrustedProxies() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", "127.0.0,192.168.1"); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "127.0.0.1"; + String xForwardedFor = "10.24.64.14,192.168.1.24"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + + xForwardedFor = "192.168.1.24,10.24.64.14"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + } + + @Test + public void getClientIpWithoutTrustedProxies() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", ""); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "127.0.0.1"; + String xForwardedFor = "10.24.64.14"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + + xForwardedFor = "127.0.0.1,10.24.64.14"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + + xForwardedFor = "10.24.64.14,127.0.0.1"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + } + + @Test + public void getClientIpWithoutUseProxies() { + configurationService.setProperty("useProxies", false); + configurationService.setProperty("proxies.trusted.ipranges", ""); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "127.0.0.1"; + String xForwardedFor = "10.24.64.14"; + + assertEquals("127.0.0.1", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + + assertEquals("127.0.0.1", + clientInfoService.getClientIp(remoteIp, null)); + + assertEquals("127.0.0.1", + clientInfoService.getClientIp(remoteIp, "")); + } + + @Test + public void isUseProxiesEnabledTrue() { + configurationService.setProperty("useProxies", true); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + assertTrue(clientInfoService.isUseProxiesEnabled()); + } + + @Test + public void isUseProxiesEnabledFalse() { + configurationService.setProperty("useProxies", false); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + assertFalse(clientInfoService.isUseProxiesEnabled()); + } +} \ No newline at end of file diff --git a/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java b/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java index 447e2c7728..a4e26b6fb3 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java +++ b/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java @@ -12,7 +12,11 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.Principal; +import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Locale; import java.util.Map; import javax.servlet.RequestDispatcher; @@ -21,18 +25,23 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import org.apache.commons.collections.CollectionUtils; +import org.dspace.core.Utils; + /** * A mock request for testing. * * @author mwood */ -class DummyHttpServletRequest implements HttpServletRequest { +public class DummyHttpServletRequest implements HttpServletRequest { private String agent = null; private String address = null; private String remoteHost = null; + private Map> headers = new HashMap<>(); + public void setAgent(String agent) { this.agent = agent; } @@ -81,6 +90,15 @@ class DummyHttpServletRequest implements HttpServletRequest { return 0; } + /** + * Add a request header to this dummy request + * @param headerName The name of the header to add + * @param headerValue The value of the header + */ + public void addHeader(String headerName, String headerValue) { + List values = headers.computeIfAbsent(headerName, k -> new LinkedList<>()); + values.add(headerValue); + } /* (non-Javadoc) * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String) */ @@ -89,7 +107,7 @@ class DummyHttpServletRequest implements HttpServletRequest { if ("User-Agent".equals(key)) { return agent; } else { - return null; + return CollectionUtils.isEmpty(headers.get(key)) ? null : headers.get(key).get(0); } } @@ -98,8 +116,7 @@ class DummyHttpServletRequest implements HttpServletRequest { */ @Override public Enumeration getHeaderNames() { - // TODO Auto-generated method stub - return null; + return Collections.enumeration(headers.keySet()); } /* (non-Javadoc) @@ -107,8 +124,7 @@ class DummyHttpServletRequest implements HttpServletRequest { */ @Override public Enumeration getHeaders(String arg0) { - // TODO Auto-generated method stub - return null; + return Collections.enumeration(Utils.emptyIfNull(headers.get(arg0))); } /* (non-Javadoc) @@ -116,8 +132,7 @@ class DummyHttpServletRequest implements HttpServletRequest { */ @Override public int getIntHeader(String arg0) { - // TODO Auto-generated method stub - return 0; + return headers.containsKey(arg0) ? Integer.parseInt(getHeader(arg0)) : -1; } /* (non-Javadoc) From 3c10296d0c4a94ceeaebcf7ba78cfc0599ae9e76 Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Wed, 31 Oct 2018 10:17:48 +0100 Subject: [PATCH 116/193] [Task 57063] made the REST URL configurable instead of relying on the request.getUrl method to return the correct information --- .../app/rest/RootRestResourceController.java | 8 +--- .../app/rest/converter/RootConverter.java | 4 +- .../rest/repository/RootRestRepository.java | 4 +- .../rest/RootRestResourceControllerIT.java | 38 +++++++++---------- .../app/rest/converter/RootConverterTest.java | 7 ++-- .../AbstractControllerIntegrationTest.java | 1 + dspace/config/dspace.cfg | 4 ++ 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java index 0ba085fab1..18f41310b3 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java @@ -42,17 +42,11 @@ public class RootRestResourceController { @RequestMapping(method = RequestMethod.GET) public RootResource listDefinedEndpoint(HttpServletRequest request) { - String restUrl = getRestURL(request); - - RootRest rootRest = rootRestRepository.getRoot(restUrl); + RootRest rootRest = rootRestRepository.getRoot(); RootResource rootResource = new RootResource(rootRest); halLinkService.addLinks(rootResource); return rootResource; } - private String getRestURL(HttpServletRequest request) { - String url = request.getRequestURL().toString(); - return url.substring(0, url.length() - request.getRequestURI().length()) + request.getContextPath(); - } } \ No newline at end of file diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/RootConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/RootConverter.java index 606f7f28ac..177b2244f7 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/RootConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/RootConverter.java @@ -21,11 +21,11 @@ public class RootConverter { @Autowired private ConfigurationService configurationService; - public RootRest convert(String restUrl) { + public RootRest convert() { RootRest rootRest = new RootRest(); rootRest.setDspaceName(configurationService.getProperty("dspace.name")); rootRest.setDspaceURL(configurationService.getProperty("dspace.url")); - rootRest.setDspaceRest(restUrl); + rootRest.setDspaceRest(configurationService.getProperty("dspace.restUrl")); return rootRest; } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/RootRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/RootRestRepository.java index e81a530b5e..54c678c18e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/RootRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/RootRestRepository.java @@ -21,7 +21,7 @@ public class RootRestRepository { @Autowired RootConverter rootConverter; - public RootRest getRoot(String restUrl) { - return rootConverter.convert(restUrl); + public RootRest getRoot() { + return rootConverter.convert(); } } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/RootRestResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/RootRestResourceControllerIT.java index 48f805bd13..bf19b4b9c5 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/RootRestResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/RootRestResourceControllerIT.java @@ -34,25 +34,25 @@ public class RootRestResourceControllerIT extends AbstractControllerIntegrationT //We expect the content type to be "application/hal+json;charset=UTF-8" .andExpect(content().contentType(contentType)) //Check that all required root links are present and that they are absolute - .andExpect(jsonPath("$._links.authorities.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.bitstreamformats.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.bitstreams.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.browses.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.collections.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.communities.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.epersons.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.groups.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.items.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.metadatafields.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.metadataschemas.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.resourcePolicies.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.sites.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.submissiondefinitions.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.submissionforms.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.submissionsections.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.submissionuploads.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.workspaceitems.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.authn.href", startsWith(REST_SERVER_URL))) + .andExpect(jsonPath("$._links.authorities.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.bitstreamformats.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.bitstreams.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.browses.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.collections.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.communities.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.epersons.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.groups.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.items.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.metadatafields.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.metadataschemas.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.resourcePolicies.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.sites.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.submissiondefinitions.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.submissionforms.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.submissionsections.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.submissionuploads.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.workspaceitems.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.authn.href", startsWith(BASE_REST_SERVER_URL))) ; } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/converter/RootConverterTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/converter/RootConverterTest.java index 5ec396ec81..785e9ac07e 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/converter/RootConverterTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/converter/RootConverterTest.java @@ -36,17 +36,18 @@ public class RootConverterTest { public void setUp() throws Exception { when(configurationService.getProperty("dspace.url")).thenReturn("dspaceurl"); when(configurationService.getProperty("dspace.name")).thenReturn("dspacename"); + when(configurationService.getProperty("dspace.restUrl")).thenReturn("rest"); } @Test public void testReturnCorrectClass() throws Exception { - assertEquals(rootConverter.convert("").getClass(), RootRest.class); + assertEquals(rootConverter.convert().getClass(), RootRest.class); } @Test public void testCorrectPropertiesSetFromConfigurationService() throws Exception { String restUrl = "rest"; - RootRest rootRest = rootConverter.convert(restUrl); + RootRest rootRest = rootConverter.convert(); assertEquals("dspaceurl", rootRest.getDspaceURL()); assertEquals("dspacename", rootRest.getDspaceName()); assertEquals(restUrl, rootRest.getDspaceRest()); @@ -54,6 +55,6 @@ public class RootConverterTest { @Test public void testReturnNotNull() throws Exception { - assertNotNull(rootConverter.convert("")); + assertNotNull(rootConverter.convert()); } } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java index f790aa230a..4240093ba8 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java @@ -70,6 +70,7 @@ public class AbstractControllerIntegrationTest extends AbstractIntegrationTestWi protected static final String AUTHORIZATION_TYPE = "Bearer "; public static final String REST_SERVER_URL = "http://localhost/api/"; + public static final String BASE_REST_SERVER_URL = "http://localhost"; protected MediaType contentType = new MediaType(MediaTypes.HAL_JSON.getType(), MediaTypes.HAL_JSON.getSubtype(), Charsets.UTF_8); diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index f8a4930e61..590c26cbd6 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -34,6 +34,10 @@ dspace.baseUrl = http://localhost:8080 # Alternatively, you can use a url redirect or deploy the web application under the servlet container root. dspace.url = ${dspace.baseUrl} +# This is the URL that will be used for the REST endpoints to be served on. +# This will typically be followed by /api to determine the root endpoints. +dspace.restUrl = ${dspace.baseUrl}/rest + # Optional: DSpace URL for mobile access # This #dspace.mobileUrl = http://mobile.example.com From 9e99c911c600d35a3f7ca46e80ade967d99dd17e Mon Sep 17 00:00:00 2001 From: Raf Ponsaerts Date: Wed, 31 Oct 2018 15:28:33 +0100 Subject: [PATCH 117/193] Added information into the exception message --- .../org/dspace/app/rest/repository/DiscoveryRestRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index 83707c06dc..fe76178100 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -110,7 +110,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { } catch (SearchServiceException e) { log.error("Error while searching with Discovery", e); - throw new IllegalArgumentException(); + throw new IllegalArgumentException("Error while searching with Discovery: " + e.getMessage()); } return discoverResultConverter From 74149ba2470e42b6204fc259b6670d1c2d5cbe0d Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Wed, 31 Oct 2018 15:29:34 -0500 Subject: [PATCH 118/193] Fix checkstyle failure (after rebase) --- .../org/dspace/statistics/util/DummyHttpServletRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java b/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java index b101fd58b4..b255db3e04 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java +++ b/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java @@ -11,8 +11,8 @@ package org.dspace.statistics.util; import java.io.BufferedReader; import java.io.IOException; import java.security.Principal; -import java.util.Collections; import java.util.Collection; +import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.LinkedList; From 6c989433e18e66bfe6287cc156be8d0161e6b0d1 Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Wed, 31 Oct 2018 15:03:51 -0700 Subject: [PATCH 119/193] try new query --- ...6.java => SolrUpgradePre6xStatistics.java} | 30 +++++++++++-------- dspace/config/launcher.xml | 4 +-- 2 files changed, 20 insertions(+), 14 deletions(-) rename dspace-api/src/main/java/org/dspace/util/{SolrUpgradeStatistics6.java => SolrUpgradePre6xStatistics.java} (96%) diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradeStatistics6.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java similarity index 96% rename from dspace-api/src/main/java/org/dspace/util/SolrUpgradeStatistics6.java rename to dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java index 9006dcc018..18b5a8a1f5 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrUpgradeStatistics6.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -58,7 +58,7 @@ import java.util.*; * * @author Terry Brady, Georgetown University Library */ -public class SolrUpgradeStatistics6 +public class SolrUpgradePre6xStatistics { //Command line parameter constants private static final String INDEX_NAME_OPTION = "i"; @@ -79,8 +79,15 @@ public class SolrUpgradeStatistics6 private static final int FACET_CUTOFF = 10; private static final String INDEX_DEFAULT = "statistics"; - private static final String MIGQUERY = "NOT(dspaceMig:*)"; + private static final String MIGQUERY = "(id:* AND NOT(id:*-*)) OR (scopeId:* AND NOT(scopeId:*-*)) OR (epersonid:* AND NOT(epersonid:*-*))"; + /* + private static final String MIGQUERYARR[] = { + "id:* AND NOT(id:*-*)", + "scopeId:* AND NOT(scopeId:*-*)", + "epersonid:* AND NOT(epersonid:*-*)" + }; + */ //Counters to determine the number of items to process private int numRec = NUMREC_DEFAULT; @@ -108,7 +115,7 @@ public class SolrUpgradeStatistics6 } //Logger - private static final Logger log = Logger.getLogger(SolrUpgradeStatistics6.class); + private static final Logger log = Logger.getLogger(SolrUpgradePre6xStatistics.class); //DSpace Servcies private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); @@ -139,7 +146,7 @@ public class SolrUpgradeStatistics6 * @throws IOException * @throws SolrServerException */ - public SolrUpgradeStatistics6(String indexName, int numRec, int batchSize) throws SolrServerException, IOException { + public SolrUpgradePre6xStatistics(String indexName, int numRec, int batchSize) throws SolrServerException, IOException { String serverPath = configurationService.getProperty("solr-statistics.server"); serverPath = serverPath.replaceAll("statistics$", indexName); System.out.println("Connecting to " + serverPath); @@ -276,7 +283,7 @@ public class SolrUpgradeStatistics6 private static void printHelpAndExit(Options options, int exitCode) { HelpFormatter myhelp = new HelpFormatter(); - myhelp.printHelp(SolrUpgradeStatistics6.class.getSimpleName() + "\n", options); + myhelp.printHelp(SolrUpgradePre6xStatistics.class.getSimpleName() + "\n", options); System.out.println("\n\nCommand Defaults"); System.out.println("\tsolr-upgradeD6-statistics [-i statistics] [-n num_recs_to_process] [-b num_rec_to_update_at_once]"); System.out.println(""); @@ -350,7 +357,7 @@ public class SolrUpgradeStatistics6 } try { - SolrUpgradeStatistics6 upgradeStats = new SolrUpgradeStatistics6(indexName, numrec, batchSize); + SolrUpgradePre6xStatistics upgradeStats = new SolrUpgradePre6xStatistics(indexName, numrec, batchSize); upgradeStats.run(); } catch (SolrServerException e) { log.error("Error querying stats", e); @@ -440,11 +447,11 @@ public class SolrUpgradeStatistics6 runReport(); logTime(false); for(int processed = updateRecords(MIGQUERY); (processed != 0) && (numProcessed < numRec); processed = updateRecords(MIGQUERY)){ - printTime(numProcessed, false); - batchUpdateStats(); - if (context.getCacheSize() > CACHE_LIMIT) { - refreshContext(); - } + printTime(numProcessed, false); + batchUpdateStats(); + if (context.getCacheSize() > CACHE_LIMIT) { + refreshContext(); + } } printTime(numProcessed, true); @@ -485,7 +492,6 @@ public class SolrUpgradeStatistics6 for(FIELD col: FIELD.values()) { mapField(input, col); } - input.addField("dspaceMig", "6.1"); docs.add(input); ++numProcessed; diff --git a/dspace/config/launcher.xml b/dspace/config/launcher.xml index ff8839ca08..5e05954fcf 100644 --- a/dspace/config/launcher.xml +++ b/dspace/config/launcher.xml @@ -243,10 +243,10 @@ - solr-upgradeD6-statistics + solr-upgrade-pre6x-statistics Upgrade statistics (integer to UUID) to DSpace 6 - org.dspace.util.SolrUpgradeStatistics6 + org.dspace.util.SolrUpgradePre6xStatistics From 32552062127e41e30b08e25fc7101d9133eb3e99 Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Wed, 31 Oct 2018 15:09:17 -0700 Subject: [PATCH 120/193] simplify not queries --- .../java/org/dspace/util/SolrUpgradePre6xStatistics.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java index 18b5a8a1f5..ce4f224f44 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -79,13 +79,13 @@ public class SolrUpgradePre6xStatistics private static final int FACET_CUTOFF = 10; private static final String INDEX_DEFAULT = "statistics"; - private static final String MIGQUERY = "(id:* AND NOT(id:*-*)) OR (scopeId:* AND NOT(scopeId:*-*)) OR (epersonid:* AND NOT(epersonid:*-*))"; + private static final String MIGQUERY = "(id:* AND -(id:*-*)) OR (scopeId:* AND -(scopeId:*-*)) OR (epersonid:* AND -(epersonid:*-*))"; /* private static final String MIGQUERYARR[] = { - "id:* AND NOT(id:*-*)", - "scopeId:* AND NOT(scopeId:*-*)", - "epersonid:* AND NOT(epersonid:*-*)" + "id:* AND -(id:*-*)", + "scopeId:* AND -(scopeId:*-*)", + "epersonid:* AND -(epersonid:*-*)" }; */ From b9b383bb05896007f30d3c7fa15c7e3d6c9e4ea7 Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Wed, 31 Oct 2018 15:47:14 -0700 Subject: [PATCH 121/193] rem comment --- .../org/dspace/util/SolrUpgradePre6xStatistics.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java index ce4f224f44..0373f8e318 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -81,15 +81,7 @@ public class SolrUpgradePre6xStatistics private static final String INDEX_DEFAULT = "statistics"; private static final String MIGQUERY = "(id:* AND -(id:*-*)) OR (scopeId:* AND -(scopeId:*-*)) OR (epersonid:* AND -(epersonid:*-*))"; - /* - private static final String MIGQUERYARR[] = { - "id:* AND -(id:*-*)", - "scopeId:* AND -(scopeId:*-*)", - "epersonid:* AND -(epersonid:*-*)" - }; - */ - - //Counters to determine the number of items to process + //Counters to determine the number of items to process private int numRec = NUMREC_DEFAULT; private int batchSize = BATCH_DEFAULT; From fed22f30bfcd3b7782125184530ae2551a8720c3 Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Wed, 31 Oct 2018 16:10:53 -0700 Subject: [PATCH 122/193] add unmigrated --- .../main/java/org/dspace/util/SolrUpgradePre6xStatistics.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java index 0373f8e318..19dcb927f5 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -537,6 +537,8 @@ public class SolrUpgradePre6xStatistics } if (uuid != null) { newvals.add(uuid.toString()); + } else { + newvals.add(oval+"-unmigrated"); } } catch (NumberFormatException e) { log.warn("Non numeric legacy id "+ col.name() +":" + oval.toString()); @@ -547,7 +549,6 @@ public class SolrUpgradePre6xStatistics for(String nv: newvals) { input.addField(col.name(), nv); } - } } } From ed94b9ce9eb5277ea2465c4ec48a4d934a31aec6 Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Thu, 1 Nov 2018 09:04:18 -0700 Subject: [PATCH 123/193] Update dspace/config/launcher.xml upgrade launcher labels --- dspace/config/launcher.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dspace/config/launcher.xml b/dspace/config/launcher.xml index 5e05954fcf..1b144d33e3 100644 --- a/dspace/config/launcher.xml +++ b/dspace/config/launcher.xml @@ -243,8 +243,8 @@ - solr-upgrade-pre6x-statistics - Upgrade statistics (integer to UUID) to DSpace 6 + solr-upgrade-statistics-6x + Upgrade statistics (integer to UUID) to DSpace 6.x (or above) compatibility org.dspace.util.SolrUpgradePre6xStatistics From a6276da8b00cbdae4b43650ce09841d7081d795d Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Thu, 1 Nov 2018 10:13:20 -0700 Subject: [PATCH 124/193] checkstyle fixes --- .../util/SolrUpgradePre6xStatistics.java | 1182 +++++++++-------- 1 file changed, 605 insertions(+), 577 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java index 19dcb927f5..2ab84f95a1 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -7,8 +7,20 @@ */ package org.dspace.util; -import org.apache.commons.cli.*; +import java.io.IOException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; +import org.apache.commons.cli.PosixParser; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; @@ -38,14 +50,11 @@ import org.dspace.eperson.service.GroupService; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; -import java.io.IOException; -import java.sql.SQLException; -import java.util.*; - /** * CLI tool to upgrade legacy id references in SOLR statistics to DSpace 6 UUID's. * - * This command will need to be run iteratively over each statistics shard until all legacy id values have been replaced. + * This command will need to be run iteratively over each statistics shard until all legacy id values have + * been replaced. * * If a legacy id cannot be resolved from the database, the id will remain unchanged. * "field:* AND NOT(field:*-*)" can be used to locate legacy ids @@ -58,604 +67,623 @@ import java.util.*; * * @author Terry Brady, Georgetown University Library */ -public class SolrUpgradePre6xStatistics -{ - //Command line parameter constants - private static final String INDEX_NAME_OPTION = "i"; - private static final String NUMREC_OPTION = "n"; - private static final String BATCH_OPTION = "b"; - private static final String TYPE_OPTION = "t"; - private static final String HELP_OPTION = "h"; - private static final int NUMREC_DEFAULT = 100000; - private static final int BATCH_DEFAULT = 10000; - - //After processing each batch of updates to SOLR, evaulate if the hibernate cache needs to be cleared - private static final int CACHE_LIMIT = 20000; - - //Maximum number of solr ids to pull in a facet query... when processing infrequently accessed ids, the - //facet size may grow. - private static final int FACET_LIMIT = 1000; - //Once the number of records returned from a facet is smaller than this number, process all items for a query - private static final int FACET_CUTOFF = 10; - - private static final String INDEX_DEFAULT = "statistics"; - private static final String MIGQUERY = "(id:* AND -(id:*-*)) OR (scopeId:* AND -(scopeId:*-*)) OR (epersonid:* AND -(epersonid:*-*))"; +public class SolrUpgradePre6xStatistics { + //Command line parameter constants + private static final String INDEX_NAME_OPTION = "i"; + private static final String NUMREC_OPTION = "n"; + private static final String BATCH_OPTION = "b"; + private static final String TYPE_OPTION = "t"; + private static final String HELP_OPTION = "h"; + private static final int NUMREC_DEFAULT = 100000; + private static final int BATCH_DEFAULT = 10000; - //Counters to determine the number of items to process - private int numRec = NUMREC_DEFAULT; - private int batchSize = BATCH_DEFAULT; - - //Cache management - private int numProcessed = 0; - private long totalCache = 0; - private long numUncache = 0; - private List docs = new ArrayList(); - private Context context; + //After processing each batch of updates to SOLR, evaulate if the hibernate cache needs to be cleared + private static final int CACHE_LIMIT = 20000; - - //Enum to identify the named SOLR statistics fields to update - private enum FIELD{ - id, - scopeId, - owningComm, - owningColl, - owningItem, - epersonid, - owner, - submitter, - actor; + private static final String INDEX_DEFAULT = "statistics"; + private static final String MIGQUERY = + "(id:* AND -(id:*-*)) OR (scopeId:* AND -(scopeId:*-*)) OR (epersonid:* AND -(epersonid:*-*))"; + + //Counters to determine the number of items to process + private int numRec = NUMREC_DEFAULT; + private int batchSize = BATCH_DEFAULT; + + //Cache management + private int numProcessed = 0; + private long totalCache = 0; + private long numUncache = 0; + private List docs = new ArrayList(); + private Context context; + + //Enum to identify the named SOLR statistics fields to update + private enum FIELD { + id, + scopeId, + owningComm, + owningColl, + owningItem, + epersonid, + owner, + submitter, + actor; + } + + //Logger + private static final Logger log = Logger.getLogger(SolrUpgradePre6xStatistics.class); + + //DSpace Servcies + private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); + protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); + protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); + protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); + protected EPersonService epersonService = EPersonServiceFactory.getInstance().getEPersonService(); + protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService(); + + // This code will operate on one shard at a time, therefore the SOLR web service will be accessed directly rather + // than make use of the DSpace Solr Logger which only writes to the current shard + private HttpSolrServer server; + + //Allows for smart use of hibernate cache + private Item lastItem = null; + private Bitstream lastBitstream = null; + + //Report on process times + private long startTime = -1; + private long lastTime = -1; + + + /** + * Construct the utility class from the command line options + * @param indexName name of the statistics shard to update + * @param numRec maximum number of records to process + * @throws IOException + * @throws SolrServerException + */ + public SolrUpgradePre6xStatistics(String indexName, int numRec, int batchSize) throws SolrServerException, IOException { + String serverPath = configurationService.getProperty("solr-statistics.server"); + serverPath = serverPath.replaceAll("statistics$", indexName); + System.out.println("Connecting to " + serverPath); + server = new HttpSolrServer(serverPath); + server.setMaxTotalConnections(1); + this.numRec = numRec; + this.batchSize = batchSize; + refreshContext(); + } + + /* + * Process a batch of updates to SOLR + */ + private void batchUpdateStats() throws SolrServerException, IOException { + if (docs.size() > 0) { + server.add(docs); + server.commit(true, true); + docs.clear(); } - - //Logger - private static final Logger log = Logger.getLogger(SolrUpgradePre6xStatistics.class); - - //DSpace Servcies - private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); - protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); - protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); - protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); - protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); - protected EPersonService epersonService = EPersonServiceFactory.getInstance().getEPersonService(); - protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService(); + } - // This code will operate on one shard at a time, therefore the SOLR web service will be accessed directly rather - // than make use of the DSpace Solr Logger which only writes to the current shard - private HttpSolrServer server; - - //Allows for smart use of hibernate cache - private Item lastItem = null; - private Bitstream lastBitstream = null; - - //Report on process times - private long startTime = -1; - private long lastTime = -1; - + /** + * Refresh the DSpace Context object in order to periodically release objects from memory + * @throws IOException + * @throws SolrServerException + */ + private void refreshContext() throws SolrServerException, IOException { + if (context != null) { + try { + totalCache += numUncache + context.getCacheSize(); + } catch (SQLException e) { + } + } + this.context = new Context(Context.Mode.READ_ONLY); + lastItem = null; + lastBitstream = null; + numUncache = 0; + } - /** - * Construct the utility class from the command line options - * @param indexName name of the statistics shard to update - * @param numRec maximum number of records to process - * @throws IOException - * @throws SolrServerException - */ - public SolrUpgradePre6xStatistics(String indexName, int numRec, int batchSize) throws SolrServerException, IOException { - String serverPath = configurationService.getProperty("solr-statistics.server"); - serverPath = serverPath.replaceAll("statistics$", indexName); - System.out.println("Connecting to " + serverPath); - server = new HttpSolrServer(serverPath); - server.setMaxTotalConnections(1); - this.numRec = numRec; - this.batchSize = batchSize; - refreshContext(); + /* + * Compute the number of items that were cached by hibernate since the context was cleared. + */ + private long getCacheCounts(boolean fromStart) { + long count = 0; + try { + count = context.getCacheSize(); + } catch (Exception e) { + //no action + } + count += this.numUncache; + if (fromStart) { + count += totalCache; + } + return count; + } + + /** + * Compute the time since the last batch was processed + * + * @param fromStart + * if true, report on processing time since the start of the program + * @return the time in ms since the start time + */ + private long logTime(boolean fromStart) { + long ret = 0; + long cur = new Date().getTime(); + if (lastTime == -1) { + startTime = cur; + } else if (fromStart) { + ret = cur - startTime; + } else { + ret = cur - lastTime; + } + lastTime = cur; + return ret; + } + + /* + * Format ms count as h:mm:ss + * + * @param dur Duration in ms + * + * @return duration formatted as h:mm:ss + */ + private String duration(long dur) { + long sec = dur / 1000; + long hh = sec / 3600; + long mm = (sec % 3600) / 60; + long ss = (sec % 60); + return String.format("%d:%02d:%02d", hh, mm, ss); + } + + /** + * Print a status message appended with the processing time for the operation + * + * @param header + * Message to display + * @param fromStart + * if true, report on processing time since the start of the program + */ + private void printTime(int numProcessed, boolean fromStart) { + long dur = logTime(fromStart); + long totalDur = logTime(true); + String stotalDur = duration(totalDur); + long cacheSize = 0; + try { + cacheSize = context.getCacheSize(); + } catch (SQLException e) { + log.error("Cannot get cache size", e); + } + String label = fromStart ? "TOTAL" : "Processed"; + System.out.println(String.format("%s (%s; %s; %s)", + String.format("\t%,12d %10s...", numProcessed, label), + String.format("%,6d sec; %s", dur / 1000, stotalDur), + String.format("DB cache: %,6d/%,8d", cacheSize, getCacheCounts(fromStart)), + String.format("Docs: %,6d", docs.size()))); + } + + /* + * Create command line option processor + */ + private static Options makeOptions() { + Options options = new Options(); + options.addOption(HELP_OPTION, "help", false, "Get help on options for this command."); + options.addOption(INDEX_NAME_OPTION, "index-name", true, + "The names of the indexes to process. At least one is required (default=statistics)"); + options.addOption(NUMREC_OPTION, "num-rec", true, "Total number of records to update (defaut=100,000)."); + options.addOption(BATCH_OPTION, "batch-size", true, + "Number of records to batch update to SOLR at one time (default=10,000)."); + options.addOption(TYPE_OPTION, "type", true, + "(4) Communities, (3) Collections, (2) Items (0) Bitstreams (default=all)"); + return options; + } + + /** + * A utility method to print out all available command-line options and exit + * given the specified code. + * + * @param options + * the supported options. + * @param exitCode + * the exit code to use. The method will call System#exit(int) with + * the given code. + */ + private static void printHelpAndExit(Options options, int exitCode) { + HelpFormatter myhelp = new HelpFormatter(); + myhelp.printHelp(SolrUpgradePre6xStatistics.class.getSimpleName() + "\n", options); + System.out.println("\n\nCommand Defaults"); + System.out.println( + "\tsolr-upgradeD6-statistics [-i statistics] [-n num_recs_to_process] [-b num_rec_to_update_at_once]"); + System.out.println(""); + System.out.println( + "\tAfter upgrading to DSpace 6, this process should be run iteratively over every statistics shard "); + System.out.println("\t\tuntil there are no remaining records with legacy ids present."); + System.out.println("\t\tThis process can be run while the system is in use."); + System.out.println(""); + System.out.println("\tIt will take 20-30 min to process 1,000,000 legacy records. "); + System.out.println(""); + System.out.println("\tUse the -n option to manage the workload on your server. "); + System.out.println("\t\tTo process all records, set -n to 10000000 or to 100000000 (10M or 100M)"); + System.out.println("\tIf possible, please allocate 2GB of memory to this process (e.g. -Xmx2000m)"); + System.out.println(""); + System.out.println("\tThis process will rewrite most solr statistics records and may temporarily double "); + System.out.println( + "\t\tthe size of your statistics repositories. Consider optimizing your solr repos when complete."); + + System.exit(exitCode); + } + + /** + * Entry point for command-line invocation + * + * @param args + * command-line arguments; see help for description + * @throws ParseException + * if the command-line arguments cannot be parsed + */ + public static void main(String[] args) throws ParseException { + CommandLineParser parser = new PosixParser(); + Options options = makeOptions(); + + System.out.println(" * This process should be run iteratively over every statistics shard "); + System.out.println(" * until there are no remaining records with legacy ids present."); + System.out.println(" * This process can be run while the system is in use."); + System.out.println(" * It is likely to take 1 hour/1,000,000 legacy records to be udpated."); + System.out.println(" *"); + System.out.println(" * This process will rewrite most solr statistics records and may temporarily double "); + System.out.println( + " *\tthe size of your statistics repositories. Consider optimizing your solr repos when complete."); + System.out.println(" * -------------------------------------------------------------------"); + + String indexName = INDEX_DEFAULT; + int numrec = NUMREC_DEFAULT; + int batchSize = BATCH_DEFAULT; + try { + CommandLine line = parser.parse(options, args); + if (line.hasOption(HELP_OPTION)) { + printHelpAndExit(options, 0); + } + + if (line.hasOption(INDEX_NAME_OPTION)) { + indexName = line.getOptionValue(INDEX_NAME_OPTION, INDEX_DEFAULT); + } else { + System.err.println("No index name provided, defaulting to : " + INDEX_DEFAULT); + } + + if (line.hasOption(NUMREC_OPTION)) { + numrec = Integer.parseInt(line.getOptionValue(NUMREC_OPTION, "" + NUMREC_DEFAULT)); + } + if (line.hasOption(BATCH_OPTION)) { + batchSize = Integer.parseInt(line.getOptionValue(BATCH_OPTION, "" + BATCH_DEFAULT)); + } + + } catch (ParseException e) { + System.err.println("Cannot read command options"); + printHelpAndExit(options, 1); } - /* - * Process a batch of updates to SOLR - */ - private void batchUpdateStats() throws SolrServerException, IOException { - if (docs.size() > 0) { - server.add(docs); - server.commit(true, true); - docs.clear(); - } - + try { + SolrUpgradePre6xStatistics upgradeStats = new SolrUpgradePre6xStatistics(indexName, numrec, batchSize); + upgradeStats.run(); + } catch (SolrServerException e) { + log.error("Error querying stats", e); + } catch (SQLException e) { + log.error("Error querying stats", e); + } catch (IOException e) { + log.error("Error querying stats", e); } - - /** - * Refresh the DSpace Context object in order to periodically release objects from memory - * @throws IOException - * @throws SolrServerException - */ - private void refreshContext() throws SolrServerException, IOException { - if (context != null) { - try { - totalCache += numUncache + context.getCacheSize(); - } catch (SQLException e) { - } - } - this.context = new Context(Context.Mode.READ_ONLY); - lastItem = null; - lastBitstream = null; - numUncache = 0; - } - - /* - * Compute the number of items that were cached by hibernate since the context was cleared. - */ - private long getCacheCounts(boolean fromStart) { - long count = 0; - try { - count = context.getCacheSize(); - } catch (Exception e) { - //no action - } - count += this.numUncache; - if (fromStart) { - count += totalCache; - } - return count; - } - - /** - * Compute the time since the last batch was processed - * @param fromStart if true, report on processing time since the start of the program - * @return the time in ms since the start time - */ - private long logTime(boolean fromStart) { - long ret = 0; - long cur = new Date().getTime(); - if (lastTime == -1) { - startTime = cur; - } else if (fromStart){ - ret = cur - startTime; + } + + /* + * Report on the existence of legacy id records within a shard + */ + private void runReport() throws SolrServerException { + System.out.println(); + System.out.println("================================================================="); + System.out.println("\t*** Statistics Records with Legacy Id ***\n"); + long total = runReportQuery(); + System.out.println("\t--------------------------------------"); + System.out.println(String.format("\t%,12d\t%s", total, "TOTAL")); + System.out.println("================================================================="); + System.out.println(); + } + + /* + * Report on the existence of specific legacy id records within a shard + */ + private long runReportQuery() throws SolrServerException { + StringBuilder sb = new StringBuilder(MIGQUERY); + SolrQuery sQ = new SolrQuery(); + sQ.setQuery(sb.toString()); + sQ.setFacet(true); + sQ.addFacetField("type"); + sQ.addFacetField("scopeType"); + QueryResponse sr = server.query(sQ); + + long total = 0; + long unexpected = 0; + for (FacetField ff : sr.getFacetFields()) { + String s = ff.getName().equals("type") ? "View" : "Search"; + for (FacetField.Count count : ff.getValues()) { + String name = count.getName(); + int id = Integer.parseInt(name); + if (id == Constants.COMMUNITY) { + name = "Community " + s; + } else if (id == Constants.COLLECTION) { + name = "Collection " + s; + } else if (id == Constants.ITEM) { + name = "Item " + s; + } else if (id == Constants.BITSTREAM) { + name = "Bistream " + s; } else { - ret = cur - lastTime; + /* + * In testing, I discovered some unexpected values in the scopeType field. It + * looks like they may have been a result of a CSV import/export error. This + * will group any unexpected values into one report line. + */ + unexpected += count.getCount(); + continue; } - lastTime = cur; - return ret; + System.out.println(String.format("\t%,12d\t%s", count.getCount(), name)); + total += count.getCount(); + } } + if (unexpected > 0) { + System.out.println(String.format("\t%,12d\t%s", unexpected, "Unexpected Type & Full Site")); + total += unexpected; + } + long rem = sr.getResults().getNumFound() - total; + if (rem > 0) { + System.out.println(String.format("\t%,12d\t%s", rem, "Other Records")); + total += rem; + } + return total; + } - /* - * Format ms count as h:mm:ss - * @param dur Duration in ms - * @return duration formatted as h:mm:ss - */ - private String duration(long dur) { - long sec = dur / 1000; - long hh = sec / 3600; - long mm = (sec % 3600) / 60; - long ss = (sec % 60); - return String.format("%d:%02d:%02d", hh,mm,ss); + /* + * Process records with a legacy id. From the command line, the user may specify + * records of a specific type to update Otherwise, the following sequence will + * be applied in order to optimize hibernate caching. + * + * Communities and Collections - retain in the cache since each is likely to be + * re-used Items - retain in the cache until a new item is processed Bitstreams + * - retain in the cache until a new bitstream is processed + */ + private void run() throws SolrServerException, SQLException, IOException { + runReport(); + logTime(false); + for (int processed = updateRecords(MIGQUERY); (processed != 0) + && (numProcessed < numRec); processed = updateRecords(MIGQUERY)) { + printTime(numProcessed, false); + batchUpdateStats(); + if (context.getCacheSize() > CACHE_LIMIT) { + refreshContext(); + } } - - /** - * Print a status message appended with the processing time for the operation - * @param header Message to display - * @param fromStart if true, report on processing time since the start of the program - */ - private void printTime(int numProcessed, boolean fromStart) { - long dur = logTime(fromStart); - long totalDur = logTime(true); - String stotalDur = duration(totalDur); - long cacheSize = 0; + printTime(numProcessed, true); + + if (numProcessed > 0) { + runReport(); + } + } + + /* + * Update records associated with a particular object id + * + * @param query Query to retrieve all of the statistics records associated with + * a particular object + * + * @param field Field to use for grouping records + * + * @return number of items processed. 0 indicates that no more work is available + * (or the max processed has been reached). + */ + private int updateRecords(String query) throws SolrServerException, SQLException, IOException { + int initNumProcessed = numProcessed; + SolrQuery sQ = new SolrQuery(); + sQ.setQuery(query); + sQ.setRows(batchSize); + + // Ensure that items are grouped by id + // Sort by id fails due to presense of id and string fields. The ord function + // seems to help + sQ.addSort("type", SolrQuery.ORDER.desc); + sQ.addSort("scopeType", SolrQuery.ORDER.desc); + sQ.addSort("ord(owningItem)", SolrQuery.ORDER.desc); + sQ.addSort("id", SolrQuery.ORDER.asc); + sQ.addSort("scopeId", SolrQuery.ORDER.asc); + + QueryResponse sr = server.query(sQ); + SolrDocumentList sdl = sr.getResults(); + + for (int i = 0; i < sdl.size() && (numProcessed < numRec); i++) { + SolrDocument sd = sdl.get(i); + SolrInputDocument input = ClientUtils.toSolrInputDocument(sd); + input.remove("_version_"); + for (FIELD col : FIELD.values()) { + mapField(input, col); + } + + docs.add(input); + ++numProcessed; + } + return numProcessed - initNumProcessed; + } + + /* + * Map solr fields from legacy ids to UUIDs. + * + * The id field is interpreted by the type field. The scopeId field is + * interpreted by scopeType field. + * + * Legacy ids will be unchanged if they cannot be mapped + * + * @param input The SOLR statistics document to be updated + * + * @param col The SOLR field to update (if present) + */ + private void mapField(SolrInputDocument input, FIELD col) throws SQLException { + SolrInputField ifield = input.get(col.name()); + if (ifield != null) { + Collection vals = ifield.getValues(); + ArrayList newvals = new ArrayList<>(); + for (Object oval : vals) { try { - cacheSize = context.getCacheSize(); - } catch (SQLException e) { - log.error("Cannot get cache size", e); - } - String label = fromStart ? "TOTAL" : "Processed"; - System.out.println(String.format("%s (%s; %s; %s)", - String.format("\t%,12d %10s...", numProcessed, label), - String.format("%,6d sec; %s", dur/1000, stotalDur), - String.format("DB cache: %,6d/%,8d", cacheSize, getCacheCounts(fromStart)), - String.format("Docs: %,6d", docs.size()) - )); - } - - /* - * Create command line option processor - */ - private static Options makeOptions() { - Options options = new Options(); - options.addOption(HELP_OPTION, "help", false, "Get help on options for this command."); - options.addOption(INDEX_NAME_OPTION, "index-name", true, - "The names of the indexes to process. At least one is required (default=statistics)"); - options.addOption(NUMREC_OPTION, "num-rec", true, "Total number of records to update (defaut=100,000)."); - options.addOption(BATCH_OPTION, "batch-size", true, "Number of records to batch update to SOLR at one time (default=10,000)."); - options.addOption(TYPE_OPTION, "type", true, "(4) Communities, (3) Collections, (2) Items (0) Bitstreams (default=all)"); - return options; - } - - /** - * A utility method to print out all available command-line options and exit given the specified code. - * - * @param options the supported options. - * @param exitCode the exit code to use. The method will call System#exit(int) with the given code. - */ - private static void printHelpAndExit(Options options, int exitCode) - { - HelpFormatter myhelp = new HelpFormatter(); - myhelp.printHelp(SolrUpgradePre6xStatistics.class.getSimpleName() + "\n", options); - System.out.println("\n\nCommand Defaults"); - System.out.println("\tsolr-upgradeD6-statistics [-i statistics] [-n num_recs_to_process] [-b num_rec_to_update_at_once]"); - System.out.println(""); - System.out.println("\tAfter upgrading to DSpace 6, this process should be run iteratively over every statistics shard "); - System.out.println("\t\tuntil there are no remaining records with legacy ids present."); - System.out.println("\t\tThis process can be run while the system is in use."); - System.out.println(""); - System.out.println("\tIt will take 20-30 min to process 1,000,000 legacy records. "); - System.out.println(""); - System.out.println("\tUse the -n option to manage the workload on your server. "); - System.out.println("\t\tTo process all records, set -n to 10000000 or to 100000000 (10M or 100M)"); - System.out.println("\tIf possible, please allocate 2GB of memory to this process (e.g. -Xmx2000m)"); - System.out.println(""); - System.out.println("\tThis process will rewrite most solr statistics records and may temporarily double "); - System.out.println("\t\tthe size of your statistics repositories. Consider optimizing your solr repos when complete."); - - System.exit(exitCode); - } - - /** - * Entry point for command-line invocation - * @param args command-line arguments; see help for description - * @throws ParseException if the command-line arguments cannot be parsed - */ - public static void main(String[] args) throws ParseException - { - CommandLineParser parser = new PosixParser(); - Options options = makeOptions(); - - System.out.println(" * This process should be run iteratively over every statistics shard "); - System.out.println(" * until there are no remaining records with legacy ids present."); - System.out.println(" * This process can be run while the system is in use."); - System.out.println(" * It is likely to take 1 hour/1,000,000 legacy records to be udpated."); - System.out.println(" *"); - System.out.println(" * This process will rewrite most solr statistics records and may temporarily double "); - System.out.println(" *\tthe size of your statistics repositories. Consider optimizing your solr repos when complete."); - System.out.println(" * -------------------------------------------------------------------"); - - String indexName = INDEX_DEFAULT; - int numrec = NUMREC_DEFAULT; - int batchSize = BATCH_DEFAULT; - try - { - CommandLine line = parser.parse(options, args); - if (line.hasOption(HELP_OPTION)) - { - printHelpAndExit(options, 0); + UUID uuid = null; + if (col == FIELD.owner) { + if (oval.toString().length() > 1) { + String owntype = oval.toString().substring(0, 1); + int legacy = Integer.parseInt(oval.toString().substring(1)); + uuid = mapOwner(owntype, legacy); } - - if (line.hasOption(INDEX_NAME_OPTION)) - { - indexName = line.getOptionValue(INDEX_NAME_OPTION, INDEX_DEFAULT); + } else { + int legacy = Integer.parseInt(oval.toString()); + if (col == FIELD.id) { + Object otype = input.getFieldValue("type"); + if (otype != null) { + int type = Integer.parseInt(otype.toString()); + uuid = mapType(type, legacy); + } + } else if (col == FIELD.scopeId) { + Object otype = input.getFieldValue("scopeType"); + if (otype != null) { + int type = Integer.parseInt(otype.toString()); + uuid = mapType(type, legacy); + } + } else { + uuid = mapId(col, legacy); } - else - { - System.err.println("No index name provided, defaulting to : "+ INDEX_DEFAULT); - } - - if (line.hasOption(NUMREC_OPTION)) { - numrec = Integer.parseInt(line.getOptionValue(NUMREC_OPTION,""+NUMREC_DEFAULT)); - } - if (line.hasOption(BATCH_OPTION)) { - batchSize = Integer.parseInt(line.getOptionValue(BATCH_OPTION,""+BATCH_DEFAULT)); - } - - } - catch (ParseException e) - { - System.err.println("Cannot read command options"); - printHelpAndExit(options, 1); - } - - try { - SolrUpgradePre6xStatistics upgradeStats = new SolrUpgradePre6xStatistics(indexName, numrec, batchSize); - upgradeStats.run(); - } catch (SolrServerException e) { - log.error("Error querying stats", e); - } catch (SQLException e) { - log.error("Error querying stats", e); - } catch (IOException e) { - log.error("Error querying stats", e); - } - } - - - /* - * Report on the existence of legacy id records within a shard - */ - private void runReport() throws SolrServerException { - System.out.println(); - System.out.println("================================================================="); - System.out.println("\t*** Statistics Records with Legacy Id ***\n"); - long total = runReportQuery(); - System.out.println("\t--------------------------------------"); - System.out.println(String.format("\t%,12d\t%s", total, "TOTAL")); - System.out.println("================================================================="); - System.out.println(); - } - /* - * Report on the existence of specific legacy id records within a shard - */ - private long runReportQuery() throws SolrServerException { - StringBuilder sb = new StringBuilder(MIGQUERY); - SolrQuery sQ = new SolrQuery(); - sQ.setQuery(sb.toString()); - sQ.setFacet(true); - sQ.addFacetField("type"); - sQ.addFacetField("scopeType"); - QueryResponse sr = server.query(sQ); - - long total = 0; - long unexpected = 0; - for(FacetField ff: sr.getFacetFields()) { - String s = ff.getName().equals("type") ? "View" : "Search"; - for(FacetField.Count count: ff.getValues()) { - String name = count.getName(); - int id = Integer.parseInt(name); - if (id == Constants.COMMUNITY) { - name = "Community " + s; - } else if (id == Constants.COLLECTION) { - name = "Collection " + s; - } else if (id == Constants.ITEM) { - name = "Item " + s; - } else if (id == Constants.BITSTREAM) { - name = "Bistream " + s; - } else { - /* - * In testing, I discovered some unexpected values in the scopeType field. - * It looks like they may have been a result of a CSV import/export error. - * This will group any unexpected values into one report line. - */ - unexpected += count.getCount(); - continue; - } - System.out.println(String.format("\t%,12d\t%s", count.getCount(), name)); - total += count.getCount(); - } - } - if (unexpected > 0) { - System.out.println(String.format("\t%,12d\t%s", unexpected, "Unexpected Type & Full Site")); - total += unexpected; - } - long rem = sr.getResults().getNumFound() - total; - if (rem > 0) { - System.out.println(String.format("\t%,12d\t%s", rem, "Other Records")); - total += rem; - } - return total; - } - - /* - * Process records with a legacy id. - * From the command line, the user may specify records of a specific type to update - * Otherwise, the following sequence will be applied in order to optimize hibernate caching. - * - * Communities and Collections - retain in the cache since each is likely to be re-used - * Items - retain in the cache until a new item is processed - * Bitstreams - retain in the cache until a new bitstream is processed - */ - private void run() throws SolrServerException, SQLException, IOException { - runReport(); - logTime(false); - for(int processed = updateRecords(MIGQUERY); (processed != 0) && (numProcessed < numRec); processed = updateRecords(MIGQUERY)){ - printTime(numProcessed, false); - batchUpdateStats(); - if (context.getCacheSize() > CACHE_LIMIT) { - refreshContext(); } - } - printTime(numProcessed, true); - - if (numProcessed > 0) { - runReport(); + if (uuid != null) { + newvals.add(uuid.toString()); + } else { + newvals.add(oval + "-unmigrated"); + } + } catch (NumberFormatException e) { + log.warn("Non numeric legacy id " + col.name() + ":" + oval.toString()); } + } + if (newvals.size() > 0) { + input.removeField(col.name()); + for (String nv : newvals) { + input.addField(col.name(), nv); + } + } } + } - - - /* - * Update records associated with a particular object id - * @param query Query to retrieve all of the statistics records associated with a particular object - * @param field Field to use for grouping records - * @return number of items processed. 0 indicates that no more work is available (or the max processed has been reached). - */ - private int updateRecords(String query) throws SolrServerException, SQLException, IOException { - int initNumProcessed = numProcessed; - SolrQuery sQ = new SolrQuery(); - sQ.setQuery(query); - sQ.setRows(batchSize); - - //Ensure that items are grouped by id - //Sort by id fails due to presense of id and string fields. The ord function seems to help - sQ.addSort("type", SolrQuery.ORDER.desc); - sQ.addSort("scopeType", SolrQuery.ORDER.desc); - sQ.addSort("ord(owningItem)", SolrQuery.ORDER.desc); - sQ.addSort("id", SolrQuery.ORDER.asc); - sQ.addSort("scopeId", SolrQuery.ORDER.asc); - - QueryResponse sr = server.query(sQ); - SolrDocumentList sdl = sr.getResults(); - - for(int i=0; i vals = ifield.getValues(); - ArrayList newvals = new ArrayList<>(); - for(Object oval: vals) { - try { - UUID uuid = null; - if (col == FIELD.owner) { - if (oval.toString().length() > 1) { - String owntype = oval.toString().substring(0, 1); - int legacy = Integer.parseInt(oval.toString().substring(1)); - uuid = mapOwner(owntype, legacy); - } - } else { - int legacy = Integer.parseInt(oval.toString()); - if (col == FIELD.id) { - Object otype = input.getFieldValue("type"); - if (otype != null) { - int type = Integer.parseInt(otype.toString()); - uuid = mapType(type, legacy); - } - } else if (col == FIELD.scopeId) { - Object otype = input.getFieldValue("scopeType"); - if (otype != null) { - int type = Integer.parseInt(otype.toString()); - uuid = mapType(type, legacy); - } - } else { - uuid = mapId(col, legacy); - } - } - if (uuid != null) { - newvals.add(uuid.toString()); - } else { - newvals.add(oval+"-unmigrated"); - } - } catch (NumberFormatException e) { - log.warn("Non numeric legacy id "+ col.name() +":" + oval.toString()); - } - } - if (newvals.size() > 0) { - input.removeField(col.name()); - for(String nv: newvals) { - input.addField(col.name(), nv); - } - } - } - } - - /* - * Determine if the last processed item should be cleared from the hibernate cache - * @param item Current item being processed - */ - private void checkLastItem(Item item) throws SQLException { - if (item != null) { - if (lastItem == null) { - lastItem = item; - } else if (!lastItem.getID().equals(item.getID())) { - numUncache++; - context.uncacheEntity(lastItem); - lastItem = item; - } - } + /* + * Determine if the last processed item should be cleared from the hibernate + * cache + * + * @param item Current item being processed + */ + private void checkLastItem(Item item) throws SQLException { + if (item != null) { + if (lastItem == null) { + lastItem = item; + } else if (!lastItem.getID().equals(item.getID())) { + numUncache++; + context.uncacheEntity(lastItem); + lastItem = item; + } } + } - /* - * Determine if the last processed bitstream should be cleared from the hibernate cache - * @param bitstream Current bitstream being processed - */ - private void checkLastBitstream(Bitstream bitstream) throws SQLException { - if (bitstream != null) { - if (lastBitstream == null) { - lastBitstream = bitstream; - } else if (!lastBitstream.getID().equals(bitstream.getID())) { - numUncache++; - context.uncacheEntity(lastBitstream); - lastBitstream = bitstream; - } - } + /* + * Determine if the last processed bitstream should be cleared from the + * hibernate cache + * + * @param bitstream Current bitstream being processed + */ + private void checkLastBitstream(Bitstream bitstream) throws SQLException { + if (bitstream != null) { + if (lastBitstream == null) { + lastBitstream = bitstream; + } else if (!lastBitstream.getID().equals(bitstream.getID())) { + numUncache++; + context.uncacheEntity(lastBitstream); + lastBitstream = bitstream; + } } + } - /* - * Retrieve the UUID corresponding to a legacy id found in a SOLR statistics record - * @param col Solr Statistic Field being processed - * @param val Value to lookup as a legacy id - */ - private UUID mapId(FIELD col, int val) throws SQLException { - - if (col == FIELD.owningComm) { - Community comm = communityService.findByLegacyId(context, val); - return comm == null ? null : comm.getID(); - } - if (col == FIELD.owningColl) { - org.dspace.content.Collection coll = collectionService.findByLegacyId(context, val); - return coll == null ? null : coll.getID(); - } - if (col == FIELD.owningItem) { - Item item = itemService.findByLegacyId(context, val); - checkLastItem(item); - return item == null ? null : item.getID(); - } - if (col == FIELD.epersonid || col == FIELD.actor || col == FIELD.submitter) { - EPerson per = epersonService.findByLegacyId(context, val); - return per == null ? null : per.getID(); - } - return null; - } + /* + * Retrieve the UUID corresponding to a legacy id found in a SOLR statistics + * record + * + * @param col Solr Statistic Field being processed + * + * @param val Value to lookup as a legacy id + */ + private UUID mapId(FIELD col, int val) throws SQLException { - /* - * Retrieve the UUID corresponding to a legacy id found in a SOLR statistics record - * @param type Identifying type field for id OR scopeType field for scopeId - * @param val Value to lookup as a legacy id - */ - private UUID mapType(int type, int val) throws SQLException { - if (type == Constants.COMMUNITY) { - Community comm = communityService.findByLegacyId(context, val); - return comm == null ? null : comm.getID(); - } - if (type == Constants.COLLECTION) { - org.dspace.content.Collection coll = collectionService.findByLegacyId(context, val); - return coll == null ? null : coll.getID(); - } - if (type == Constants.ITEM) { - Item item = itemService.findByLegacyId(context, val); - checkLastItem(item); - return item == null ? null : item.getID(); - } - if (type == Constants.BITSTREAM) { - Bitstream bit = bitstreamService.findByLegacyId(context, val); - UUID uuid = bit == null ? null : bit.getID(); - //A bitstream is unlikely to be processed more than once, to clear immediately - checkLastBitstream(bit); - return uuid; - } - return null; + if (col == FIELD.owningComm) { + Community comm = communityService.findByLegacyId(context, val); + return comm == null ? null : comm.getID(); } + if (col == FIELD.owningColl) { + org.dspace.content.Collection coll = collectionService.findByLegacyId(context, val); + return coll == null ? null : coll.getID(); + } + if (col == FIELD.owningItem) { + Item item = itemService.findByLegacyId(context, val); + checkLastItem(item); + return item == null ? null : item.getID(); + } + if (col == FIELD.epersonid || col == FIELD.actor || col == FIELD.submitter) { + EPerson per = epersonService.findByLegacyId(context, val); + return per == null ? null : per.getID(); + } + return null; + } - /* - * Retrieve the UUID corresponding to a legacy owner found in a SOLR statistics record - * Legacy owner fields are prefixed in solr with "e" or "g" - * @param owntype Identifying type field (e - eperson, g - group) - * @param val Value to lookup as a legacy id - */ - private UUID mapOwner(String owntype, int val) throws SQLException { - if (owntype.equals("e")) { - EPerson per = epersonService.findByLegacyId(context, val); - return per == null ? null : per.getID(); - } else if (owntype.equals("g")) { - Group perg = groupService.findByLegacyId(context, val); - return perg == null ? null : perg.getID(); - } - return null; + /* + * Retrieve the UUID corresponding to a legacy id found in a SOLR statistics + * record + * + * @param type Identifying type field for id OR scopeType field for scopeId + * + * @param val Value to lookup as a legacy id + */ + private UUID mapType(int type, int val) throws SQLException { + if (type == Constants.COMMUNITY) { + Community comm = communityService.findByLegacyId(context, val); + return comm == null ? null : comm.getID(); } + if (type == Constants.COLLECTION) { + org.dspace.content.Collection coll = collectionService.findByLegacyId(context, val); + return coll == null ? null : coll.getID(); + } + if (type == Constants.ITEM) { + Item item = itemService.findByLegacyId(context, val); + checkLastItem(item); + return item == null ? null : item.getID(); + } + if (type == Constants.BITSTREAM) { + Bitstream bit = bitstreamService.findByLegacyId(context, val); + UUID uuid = bit == null ? null : bit.getID(); + // A bitstream is unlikely to be processed more than once, to clear immediately + checkLastBitstream(bit); + return uuid; + } + return null; + } + + /* + * Retrieve the UUID corresponding to a legacy owner found in a SOLR statistics + * record Legacy owner fields are prefixed in solr with "e" or "g" + * + * @param owntype Identifying type field (e - eperson, g - group) + * + * @param val Value to lookup as a legacy id + */ + private UUID mapOwner(String owntype, int val) throws SQLException { + if (owntype.equals("e")) { + EPerson per = epersonService.findByLegacyId(context, val); + return per == null ? null : per.getID(); + } else if (owntype.equals("g")) { + Group perg = groupService.findByLegacyId(context, val); + return perg == null ? null : perg.getID(); + } + return null; + } } \ No newline at end of file From 8ec4780625fb317a90dfdac2850598756d98f82e Mon Sep 17 00:00:00 2001 From: Bill Tantzen Date: Thu, 1 Nov 2018 12:31:16 -0500 Subject: [PATCH 125/193] DS-4050 Search method returns 204 NoContent or 200 with an empty page if no result. --- .../java/org/dspace/app/rest/RestResourceController.java | 6 +----- .../java/org/dspace/app/rest/EPersonRestRepositoryIT.java | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index 864383d687..b956215f9e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -924,11 +924,7 @@ public class RestResourceController implements InitializingBean { result = assembler.toResource(resources, link); } else { if (searchResult == null) { - try { - response.sendError(HttpServletResponse.SC_NOT_FOUND); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } + response.setStatus(HttpServletResponse.SC_NO_CONTENT); return null; } DSpaceResource dsResource = repository.wrapResource((T) searchResult); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index ab84107706..c7aef88e84 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -338,7 +338,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail") .param("email", "undefined@undefined.com")) - .andExpect(status().isNotFound()); + .andExpect(status().isNoContent()); } @Test From defa4671d81501f92c4be5a4b4e0bbf238fd9b65 Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Thu, 1 Nov 2018 10:39:40 -0700 Subject: [PATCH 126/193] more checkstyle fix --- .../org/dspace/util/SolrUpgradePre6xStatistics.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java index 2ab84f95a1..41f5a626dd 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -137,10 +137,11 @@ public class SolrUpgradePre6xStatistics { * Construct the utility class from the command line options * @param indexName name of the statistics shard to update * @param numRec maximum number of records to process - * @throws IOException - * @throws SolrServerException + * @throws IOException + * @throws SolrServerException */ - public SolrUpgradePre6xStatistics(String indexName, int numRec, int batchSize) throws SolrServerException, IOException { + public SolrUpgradePre6xStatistics(String indexName, int numRec, int batchSize) + throws SolrServerException, IOException { String serverPath = configurationService.getProperty("solr-statistics.server"); serverPath = serverPath.replaceAll("statistics$", indexName); System.out.println("Connecting to " + serverPath); @@ -164,14 +165,15 @@ public class SolrUpgradePre6xStatistics { /** * Refresh the DSpace Context object in order to periodically release objects from memory - * @throws IOException - * @throws SolrServerException + * @throws IOException + * @throws SolrServerException */ private void refreshContext() throws SolrServerException, IOException { if (context != null) { try { totalCache += numUncache + context.getCacheSize(); } catch (SQLException e) { + log.warn(e.getMessage()); } } this.context = new Context(Context.Mode.READ_ONLY); From 91f779aa8c350b2e136faf73767c8647575a1def Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Thu, 1 Nov 2018 17:34:30 -0700 Subject: [PATCH 127/193] handle shard corrupt multivals --- .../util/SolrUpgradePre6xStatistics.java | 70 +++++++++++-------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java index 41f5a626dd..9f0a8a1c50 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -526,40 +526,50 @@ public class SolrUpgradePre6xStatistics { if (ifield != null) { Collection vals = ifield.getValues(); ArrayList newvals = new ArrayList<>(); - for (Object oval : vals) { - try { - UUID uuid = null; - if (col == FIELD.owner) { - if (oval.toString().length() > 1) { - String owntype = oval.toString().substring(0, 1); - int legacy = Integer.parseInt(oval.toString().substring(1)); - uuid = mapOwner(owntype, legacy); - } - } else { - int legacy = Integer.parseInt(oval.toString()); - if (col == FIELD.id) { - Object otype = input.getFieldValue("type"); - if (otype != null) { - int type = Integer.parseInt(otype.toString()); - uuid = mapType(type, legacy); - } - } else if (col == FIELD.scopeId) { - Object otype = input.getFieldValue("scopeType"); - if (otype != null) { - int type = Integer.parseInt(otype.toString()); - uuid = mapType(type, legacy); + for (Object ovalx : vals) { + //DS-3436 documented an issue in which multi-values in shards were converted to a comma separated string + //It also produced strings containing "\" at the end of a value + for (String oval: ovalx.toString().split(",")) { + oval = oval.replace("\\",""); + try { + UUID uuid = null; + if (col == FIELD.owner) { + if (oval.length() > 1) { + String owntype = oval.substring(0, 1); + int legacy = Integer.parseInt(oval.substring(1)); + uuid = mapOwner(owntype, legacy); } } else { - uuid = mapId(col, legacy); + int legacy = Integer.parseInt(oval); + if (col == FIELD.id) { + Object otype = input.getFieldValue("type"); + if (otype != null) { + int type = Integer.parseInt(otype.toString()); + uuid = mapType(type, legacy); + } + } else if (col == FIELD.scopeId) { + Object otype = input.getFieldValue("scopeType"); + if (otype != null) { + int type = Integer.parseInt(otype.toString()); + uuid = mapType(type, legacy); + } + } else { + uuid = mapId(col, legacy); + } } + if (uuid != null) { + if (!newvals.contains(uuid.toString())) { + newvals.add(uuid.toString()); + } + } else { + String s = oval + "-unmigrated"; + if (!newvals.contains(s)) { + newvals.add(s); + } + } + } catch (NumberFormatException e) { + log.warn("Non numeric legacy id " + col.name() + ":" + oval); } - if (uuid != null) { - newvals.add(uuid.toString()); - } else { - newvals.add(oval + "-unmigrated"); - } - } catch (NumberFormatException e) { - log.warn("Non numeric legacy id " + col.name() + ":" + oval.toString()); } } if (newvals.size() > 0) { From 53e548e4a992be4a9b8b196d56c4a218787e950b Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Fri, 2 Nov 2018 16:09:31 +0100 Subject: [PATCH 128/193] remove OpenSearch path from config as its not configurable any more --- .../opensearch/OpenSearchControllerTest.java | 22 ++++++++++++++----- dspace/config/dspace.cfg | 2 -- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index 1ffda81f89..12e576f94f 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -104,22 +104,29 @@ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); Item publicItem1 = ItemBuilder.createItem(context, col1) - .withTitle("Boars at Yellowstonepark") + .withTitle("Boars at Yellowstone") .withIssueDate("2017-10-17") .withAuthor("Ballini, Andreas").withAuthor("Moriarti, Susan") .build(); + Item publicItem2 = ItemBuilder.createItem(context, col1) + .withTitle("Yellowstone and bisons") + .withIssueDate("2017-10-18") + .withAuthor("Ballini, Andreas").withAuthor("Moriarti, Susan") + .build(); //When we call the root endpoint getClient().perform(get("/opensearch/search") - .param("query", "Boars")) + .param("query", "Yellowstone")) //The status has to be 200 OK .andExpect(status().isOk()) //We expect the content type to be "application/atom+xml;charset=UTF-8" .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) - .andExpect(xpath("feed/Query/@searchTerms").string("Boars")) - .andExpect(xpath("feed/totalResults").string("1")) + .andExpect(xpath("feed/Query/@searchTerms").string("Yellowstone")) + .andExpect(xpath("feed/totalResults").string("2")) ; } + // This test does not find the record, so there are obviously issues with special chars + @Ignore @Test public void findResultWithSpecialCharsTest() throws Exception { //Turn off the authorization system, otherwise we can't make the objects @@ -148,15 +155,18 @@ public class OpenSearchControllerTest extends AbstractControllerIntegrationTest //We expect the content type to be "application/atom+xml;charset=UTF-8" .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) .andExpect(xpath("feed/Query/@searchTerms").string("B%C3%A4r")) - .andExpect(xpath("feed/totalResults").string("0")) + .andExpect(xpath("feed/totalResults").string("1")) ; } + // Ignore this test as it is throwing an exception + @Ignore @Test public void invalidQueryTest() throws Exception { //When we call the root endpoint getClient().perform(get("/opensearch/search") - .param("query", "urn::nbn:de:fake-123")) + .param("query", "urn:nbn:de:fake-123")) + // We get an exception for such a query, which is obviously not expected //The status has to be 200 OK .andExpect(status().isOk()) //We expect the content type to be "application/atom+xml;charset=UTF-8" diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index 023e6ea924..02f3795206 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -1336,8 +1336,6 @@ webui.feed.item.author = dc.contributor.author websvc.opensearch.enable = false # context for html request URLs - change only for non-standard servlet mapping websvc.opensearch.uicontext = simple-search -# context for RSS/Atom request URLs - change only for non-standard module mapping -websvc.opensearch.svccontext = opensearch/search # present autodiscovery link in every page head websvc.opensearch.autolink = true # number of hours to retain results before recalculating From 68dca061b0bd1ad5c87428a99d87b3b281c25dfb Mon Sep 17 00:00:00 2001 From: Terry Brady Date: Wed, 7 Nov 2018 15:20:36 -0800 Subject: [PATCH 129/193] correct usage --- .../main/java/org/dspace/util/SolrUpgradePre6xStatistics.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java index 9f0a8a1c50..aa3cba4618 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -272,8 +272,6 @@ public class SolrUpgradePre6xStatistics { options.addOption(NUMREC_OPTION, "num-rec", true, "Total number of records to update (defaut=100,000)."); options.addOption(BATCH_OPTION, "batch-size", true, "Number of records to batch update to SOLR at one time (default=10,000)."); - options.addOption(TYPE_OPTION, "type", true, - "(4) Communities, (3) Collections, (2) Items (0) Bitstreams (default=all)"); return options; } @@ -292,7 +290,7 @@ public class SolrUpgradePre6xStatistics { myhelp.printHelp(SolrUpgradePre6xStatistics.class.getSimpleName() + "\n", options); System.out.println("\n\nCommand Defaults"); System.out.println( - "\tsolr-upgradeD6-statistics [-i statistics] [-n num_recs_to_process] [-b num_rec_to_update_at_once]"); + "\tsolr-upgrade-statistics-6x [-i statistics] [-n num_recs_to_process] [-b num_rec_to_update_at_once]"); System.out.println(""); System.out.println( "\tAfter upgrading to DSpace 6, this process should be run iteratively over every statistics shard "); From cb913fd24f0c375cc49d13615bb24e9636af7874 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 12 Oct 2018 14:47:59 -0500 Subject: [PATCH 130/193] Initial upgrade of dspace-services to Commons Config v2 --- dspace-api/pom.xml | 4 +- dspace-services/pom.xml | 4 +- .../DSpaceConfigurationFactoryBean.java | 19 ++- .../config/DSpaceConfigurationService.java | 149 +++++++++++------- .../dspace/services/ConfigurationService.java | 2 +- pom.xml | 10 +- 6 files changed, 114 insertions(+), 74 deletions(-) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 3597126c94..9ce448aef4 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -571,8 +571,8 @@ - commons-configuration - commons-configuration + org.apache.commons + commons-configuration2 com.maxmind.geoip2 diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml index a2c99e39bc..51d1f8b943 100644 --- a/dspace-services/pom.xml +++ b/dspace-services/pom.xml @@ -159,8 +159,8 @@ commons-collections4 - commons-configuration - commons-configuration + org.apache.commons + commons-configuration2 diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java index bbb57932fd..a55185b62f 100644 --- a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java +++ b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java @@ -28,10 +28,12 @@ package org.dspace.servicemanager.config; import java.net.URL; -import org.apache.commons.configuration.CompositeConfiguration; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.ConfigurationConverter; -import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.commons.configuration2.CompositeConfiguration; +import org.apache.commons.configuration2.Configuration; +import org.apache.commons.configuration2.ConfigurationConverter; +import org.apache.commons.configuration2.PropertiesConfiguration; +import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; +import org.apache.commons.configuration2.builder.fluent.Parameters; import org.dspace.services.ConfigurationService; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; @@ -129,8 +131,11 @@ public class DSpaceConfigurationFactoryBean implements InitializingBean, Factory if (locations != null) { for (int i = 0; i < locations.length; i++) { URL url = locations[i].getURL(); - Configuration props = new PropertiesConfiguration(url); - configuration.addConfiguration(props); + Parameters params = new Parameters(); + FileBasedConfigurationBuilder builder = + new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class) + .configure(params.fileBased().setURL(url)); + configuration.addConfiguration(builder.getConfiguration()); } } } @@ -177,7 +182,7 @@ public class DSpaceConfigurationFactoryBean implements InitializingBean, Factory /** * Set the underlying Commons CompositeConfiguration throwExceptionOnMissing * flag. - * @see org.apache.commons.configuration.AbstractConfiguration + * @see org.apache.commons.configuration2.AbstractConfiguration * @param throwExceptionOnMissing whether to throw an exception if a config is missing */ public void setThrowExceptionOnMissing(boolean throwExceptionOnMissing) { diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java index 83238a9667..a6ef647ca2 100644 --- a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java +++ b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java @@ -22,10 +22,14 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Properties; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.ConfigurationConverter; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.DefaultConfigurationBuilder; +import org.apache.commons.configuration2.Configuration; +import org.apache.commons.configuration2.ConfigurationConverter; +import org.apache.commons.configuration2.builder.ConfigurationBuilderEvent; +import org.apache.commons.configuration2.builder.combined.ReloadingCombinedConfigurationBuilder; +import org.apache.commons.configuration2.builder.fluent.Parameters; +import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler; +import org.apache.commons.configuration2.event.Event; +import org.apache.commons.configuration2.ex.ConfigurationException; import org.dspace.services.ConfigurationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,15 +64,19 @@ public final class DSpaceConfigurationService implements ConfigurationService { // The DSpace Server ID configuration public static final String DSPACE_SERVER_ID = "serverId"; - // Current ConfigurationBuilder - private DefaultConfigurationBuilder configurationBuilder = null; + // Configuration list delimiter. Configurations with this character will be split into arrays + public static final char CONFIG_LIST_DELIMITER = ','; - // Current Configuration - private Configuration configuration = null; + // Current ConfigurationBuilder + // NOTE: we only cache the "builder", as it controls when a configuration is automatically reloaded + private ReloadingCombinedConfigurationBuilder configurationBuilder = null; // Current Home directory private String homePath = null; + // Current Configuration Definition File + private String configDefinition = null; + /** * Initializes a ConfigurationService based on default values. The DSpace * Home directory is determined based on system properties / searching. @@ -98,7 +106,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { @Override public Properties getProperties() { // Return our configuration as a set of Properties - return ConfigurationConverter.getProperties(configuration); + return ConfigurationConverter.getProperties(getConfiguration()); } /** @@ -109,7 +117,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { @Override public List getPropertyKeys() { - Iterator keys = configuration.getKeys(); + Iterator keys = getConfiguration().getKeys(); List keyList = new ArrayList<>(); while (keys.hasNext()) { @@ -126,7 +134,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { @Override public List getPropertyKeys(String prefix) { - Iterator keys = configuration.getKeys(prefix); + Iterator keys = getConfiguration().getKeys(prefix); List keyList = new ArrayList<>(); while (keys.hasNext()) { @@ -142,7 +150,13 @@ public final class DSpaceConfigurationService implements ConfigurationService { */ @Override public Configuration getConfiguration() { - return configuration; + try { + return this.configurationBuilder.getConfiguration(); + } catch (ConfigurationException ce) { + log.error("Unable to get configuration object based on definition at " + this.configDefinition); + System.err.println("Unable to get configuration object based on definition at " + this.configDefinition); + throw new RuntimeException(ce); + } } /** @@ -153,7 +167,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { */ @Override public Object getPropertyValue(String name) { - return configuration.getProperty(name); + return getConfiguration().getProperty(name); } /** @@ -175,7 +189,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { */ @Override public String getProperty(String name, String defaultValue) { - return (String) getPropertyAsType(name, defaultValue); + return getPropertyAsType(name, defaultValue); } /** @@ -325,7 +339,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { */ @Override public boolean hasProperty(String name) { - if (configuration.containsKey(name)) { + if (getConfiguration().containsKey(name)) { return true; } else { return false; @@ -346,15 +360,15 @@ public final class DSpaceConfigurationService implements ConfigurationService { if (name == null) { throw new IllegalArgumentException("name cannot be null for setting configuration"); } else { - Object oldValue = configuration.getProperty(name); + Object oldValue = getConfiguration().getProperty(name); if (value == null && oldValue != null) { changed = true; - configuration.clearProperty(name); + getConfiguration().clearProperty(name); log.info("Cleared the configuration setting for name (" + name + ")"); } else if (value != null && !value.equals(oldValue)) { changed = true; - configuration.setProperty(name, value); + getConfiguration().setProperty(name, value); } } return changed; @@ -409,14 +423,14 @@ public final class DSpaceConfigurationService implements ConfigurationService { } // Check if the value has changed - if (this.configuration.containsKey(key) && - this.configuration.getProperty(key).equals(value)) { + if (getConfiguration().containsKey(key) && + getConfiguration().getProperty(key).equals(value)) { // no change to the value return false; } else { // Either this config doesn't exist, or it is not the same value, // so we'll update it. - this.configuration.setProperty(key, value); + getConfiguration().setProperty(key, value); return true; } } @@ -425,7 +439,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { * Clears all the configuration settings. */ public void clear() { - this.configuration.clear(); + getConfiguration().clear(); log.info("Cleared all configuration settings"); } @@ -435,7 +449,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { * @param key key of the configuration */ public void clearConfig(String key) { - this.configuration.clearProperty(key); + getConfiguration().clearProperty(key); } // loading from files code @@ -451,35 +465,50 @@ public final class DSpaceConfigurationService implements ConfigurationService { */ private void loadInitialConfig(String providedHome) { // Determine the DSpace home directory - homePath = getDSpaceHome(providedHome); + this.homePath = getDSpaceHome(providedHome); // Based on homePath get full path to the configuration definition - String configDefinition = homePath + File.separatorChar + DSPACE_CONFIG_DEFINITION_PATH; + String configDefinition = this.homePath + File.separatorChar + DSPACE_CONFIG_DEFINITION_PATH; // Check if our configuration definition exists in the homePath - File configDefFile = new File(configDefinition); + File configDefFile = new File(this.configDefinition); if (!configDefFile.exists()) { try { //If it doesn't exist, check for a configuration definition on Classpath // (NOTE: This is mostly for Unit Testing to find the test config-definition.xml) ClassPathResource resource = new ClassPathResource(DSPACE_CONFIG_DEFINITION_PATH); - configDefinition = resource.getFile().getAbsolutePath(); + this.configDefinition = resource.getFile().getAbsolutePath(); } catch (IOException ioe) { log.error("Error attempting to load configuration definition from classpath", ioe); } } try { + Parameters params = new Parameters(); + // Treat comma as a config list delimiter (when not escaped by \,) + DefaultListDelimiterHandler listDelimiterHandler = new DefaultListDelimiterHandler(CONFIG_LIST_DELIMITER); // Load our configuration definition, which in turn loads all our config files/settings - // See: http://commons.apache.org/proper/commons-configuration/userguide_v1.10/howto_configurationbuilder - // .html - configurationBuilder = new DefaultConfigurationBuilder(configDefinition); + // See: http://commons.apache.org/proper/commons-configuration/userguide/howto_combinedbuilder.html + this.configurationBuilder = new ReloadingCombinedConfigurationBuilder() + .configure(params.fileBased() + .setFile(new File(configDefinition)) + .setListDelimiterHandler(listDelimiterHandler)); - // Actually parser our configuration definition & return the resulting Configuration - configuration = configurationBuilder.getConfiguration(); + // Parse our configuration definition and initialize resulting Configuration + this.configurationBuilder.getConfiguration(); + + // Register an event listener for triggering automatic reloading checks + // See: https://commons.apache.org/proper/commons-configuration/userguide/howto_reloading.html#Reloading_Checks_on_Builder_Access + // NOTE: This MUST be added *after* the first call to getConfiguration(), as getReloadingController() is + // not initialized until the configuration is first parsed/read. + this.configurationBuilder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST, + // Lamba which checks reloadable configurations for any updates. + // Auto-reloadable configs are ONLY those flagged config-reload="true" in the configuration definition + (Event e) -> this.configurationBuilder.getReloadingController() + .checkForReloading(null)); } catch (ConfigurationException ce) { - log.error("Unable to load configurations based on definition at " + configDefinition); - System.err.println("Unable to load configurations based on definition at " + configDefinition); + log.error("Unable to load configurations based on definition at " + this.configDefinition); + System.err.println("Unable to load configurations based on definition at " + this.configDefinition); throw new RuntimeException(ce); } @@ -490,22 +519,25 @@ public final class DSpaceConfigurationService implements ConfigurationService { } /** - * Reload the configuration from the DSpace configuration files. + * Reload all configurations from the DSpace configuration definition. *

- * Uses the initialized ConfigurationBuilder to reload all configurations. + * This method invalidates the current Configuration object, and uses + * the initialized ConfigurationBuilder to reload all configurations. */ @Override public synchronized void reloadConfig() { try { - configurationBuilder.reload(); - this.configuration = configurationBuilder.getConfiguration(); + // As this is a forced reload, completely invalidate the configuration + // This ensures all configs, including System properties and Environment variables are reloaded + this.configurationBuilder.getConfiguration().invalidate(); + + // Reload/reinitialize our configuration + this.configurationBuilder.getConfiguration(); // Finally, (re)set any dynamic, default properties setDynamicProperties(); } catch (ConfigurationException ce) { - log.error("Unable to reload configurations based on definition at " + - configurationBuilder.getFile().getAbsolutePath(), - ce); + log.error("Unable to reload configurations based on definition at " + this.configDefinition, ce); } log.info("Reloaded configuration service: " + toString()); } @@ -516,7 +548,7 @@ public final class DSpaceConfigurationService implements ConfigurationService { */ private void setDynamicProperties() { // Ensure our DSPACE_HOME property is set to the determined homePath - setProperty(DSPACE_HOME, homePath); + setProperty(DSPACE_HOME, this.homePath); try { // Attempt to set a default "serverId" property to value of hostname @@ -534,8 +566,8 @@ public final class DSpaceConfigurationService implements ConfigurationService { int size = props != null ? props.size() : 0; // Return the configuration directory and number of configs loaded - return "ConfigDir=" + configuration - .getString(DSPACE_HOME) + File.separatorChar + DEFAULT_CONFIG_DIR + ", Size=" + size; + return "ConfigDir=" + getConfiguration().getString(DSPACE_HOME) + File.separatorChar + + DEFAULT_CONFIG_DIR + ", Size=" + size; } /** @@ -652,10 +684,11 @@ public final class DSpaceConfigurationService implements ConfigurationService { * @param object type * @return converted value */ + @SuppressWarnings("unchecked") private T convert(String name, Class type) { // If this key doesn't exist, just return null - if (!configuration.containsKey(name)) { + if (!getConfiguration().containsKey(name)) { // Special case. For booleans, return false if key doesn't exist if (Boolean.class.equals(type) || boolean.class.equals(type)) { return (T) Boolean.FALSE; @@ -667,33 +700,33 @@ public final class DSpaceConfigurationService implements ConfigurationService { // Based on the type of class, call the appropriate // method of the Configuration object if (type.isArray()) { - return (T) configuration.getStringArray(name); + return (T) getConfiguration().getStringArray(name); } else if (String.class.equals(type) || type.isAssignableFrom(String.class)) { - return (T) configuration.getString(name); + return (T) getConfiguration().getString(name); } else if (BigDecimal.class.equals(type)) { - return (T) configuration.getBigDecimal(name); + return (T) getConfiguration().getBigDecimal(name); } else if (BigInteger.class.equals(type)) { - return (T) configuration.getBigInteger(name); + return (T) getConfiguration().getBigInteger(name); } else if (Boolean.class.equals(type) || boolean.class.equals(type)) { - return (T) Boolean.valueOf(configuration.getBoolean(name)); + return (T) Boolean.valueOf(getConfiguration().getBoolean(name)); } else if (Byte.class.equals(type) || byte.class.equals(type)) { - return (T) Byte.valueOf(configuration.getByte(name)); + return (T) Byte.valueOf(getConfiguration().getByte(name)); } else if (Double.class.equals(type) || double.class.equals(type)) { - return (T) Double.valueOf(configuration.getDouble(name)); + return (T) Double.valueOf(getConfiguration().getDouble(name)); } else if (Float.class.equals(type) || float.class.equals(type)) { - return (T) Float.valueOf(configuration.getFloat(name)); + return (T) Float.valueOf(getConfiguration().getFloat(name)); } else if (Integer.class.equals(type) || int.class.equals(type)) { - return (T) Integer.valueOf(configuration.getInt(name)); + return (T) Integer.valueOf(getConfiguration().getInt(name)); } else if (List.class.equals(type)) { - return (T) configuration.getList(name); + return (T) getConfiguration().getList(name); } else if (Long.class.equals(type) || long.class.equals(type)) { - return (T) Long.valueOf(configuration.getLong(name)); + return (T) Long.valueOf(getConfiguration().getLong(name)); } else if (Short.class.equals(type) || short.class.equals(type)) { - return (T) Short.valueOf(configuration.getShort(name)); + return (T) Short.valueOf(getConfiguration().getShort(name)); } else { // If none of the above works, try to convert the value to the required type SimpleTypeConverter converter = new SimpleTypeConverter(); - return (T) converter.convertIfNecessary(configuration.getProperty(name), type); + return (T) converter.convertIfNecessary(getConfiguration().getProperty(name), type); } } } diff --git a/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java b/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java index 4beb2a9f35..050e4c089c 100644 --- a/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java +++ b/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java @@ -10,7 +10,7 @@ package org.dspace.services; import java.util.List; import java.util.Properties; -import org.apache.commons.configuration.Configuration; +import org.apache.commons.configuration2.Configuration; /** diff --git a/pom.xml b/pom.xml index 1bdfe1dcae..fe1a49a7dc 100644 --- a/pom.xml +++ b/pom.xml @@ -150,6 +150,8 @@ true + + false - - - - + + - + - - + + - \ No newline at end of file + diff --git a/dspace-services/src/test/resources/config/included.properties b/dspace-services/src/test/resources/config/included.properties new file mode 100644 index 0000000000..fcdc3a1efc --- /dev/null +++ b/dspace-services/src/test/resources/config/included.properties @@ -0,0 +1,3 @@ +# This is used by Unit Tests to ensure included properties files works +# See DSpaceConfigurationServiceTest.testGetPropertiesFromFile() +prop.from.included.file = works diff --git a/dspace-services/src/test/resources/config/local.properties b/dspace-services/src/test/resources/config/local.properties index 88cc11cb27..92cb538046 100644 --- a/dspace-services/src/test/resources/config/local.properties +++ b/dspace-services/src/test/resources/config/local.properties @@ -2,6 +2,7 @@ # set the service manager into a testing mode service.manager.developing = true + # a list of all extra spring configs we want the service manager to load on start service.manager.spring.configs=spring/spring-test-services.xml,spring/spring-test-beans.xml @@ -10,5 +11,21 @@ service.manager.spring.configs=spring/spring-test-services.xml,spring/spring-tes testDynamicBean.property = WeLoveDSpace # This is a setting with leading/trailing spaces. Used in Unit Tests to ensure values are trimmed +#See DSpaceConfigurationServiceTest.testGetPropertiesFromFile() prop.needing.trimmed = test +# This setting is used in Unit Tests to ensure multi-line arrays are supported +# See DSpaceConfigurationServiceTest.testGetArray() +prop.multiline.array = line1 +prop.multiline.array = line2 +prop.multiline.array = line3 + +# This setting is used in Unit Tests to ensure "include =" works to include other config files +# See: https://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html +# See DSpaceConfigurationServiceTest.testGetPropertiesFromFile() +include = included.properties + +# This setting is used by Unit Tests to check for automatic reloading +# (We purposefully misspell DSpace and correct it in tests) +# See DSpaceConfigurationServiceTest.testAutomaticReload() +prop.to.auto.reload = D-space From 673d4b9d360d48ef1a87d8bf252124b23a8e209c Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 15 Oct 2018 16:50:13 -0500 Subject: [PATCH 132/193] Replace DSpaceConfigurationFactoryBean with ConfigurationPropertiesFactoryBean --- .../DSpaceConfigurationFactoryBean.java | 202 ------------------ .../spring/spring-dspace-core-services.xml | 27 ++- .../config/DSpaceConfigurationBeanTest.java | 105 +++++++++ .../DSpaceConfigurationFactoryBeanTest.java | 57 ----- .../resources/spring/spring-test-beans.xml | 8 +- 5 files changed, 132 insertions(+), 267 deletions(-) delete mode 100644 dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java create mode 100644 dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java delete mode 100644 dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java deleted file mode 100644 index a55185b62f..0000000000 --- a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java +++ /dev/null @@ -1,202 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ - -/** - * This based heavily on the CommonsConfigurationFactoryBean available in - * 'spring-modules-jakarta-commons' version 0.8: - * https://java.net/projects/springmodules/sources/svn/content/tags/release-0_8/projects/commons/src/java/org - * /springmodules/commons/configuration/CommonsConfigurationFactoryBean.java?rev=2110 - *

- * As this module is no longer maintained by Spring, it is now recommended to - * maintain it within your own codebase, so that minor updates can be made to - * support new versions of Apache Commons Configuration (as needed). See this - * Spring ticket: https://jira.spring.io/browse/SPR-10213 - *

- * For DSpace, we've specifically updated this bean to automatically load all - * configurations from the DSpaceConfigurationService (which uses Commons - * Configuration internally). See constructor below. - *

- * This bean is loaded in 'spring-dspace-core-services.xml' where it is wired - * up to PropertyPlaceholderConfigurer. - */ -package org.dspace.servicemanager.config; - -import java.net.URL; - -import org.apache.commons.configuration2.CompositeConfiguration; -import org.apache.commons.configuration2.Configuration; -import org.apache.commons.configuration2.ConfigurationConverter; -import org.apache.commons.configuration2.PropertiesConfiguration; -import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; -import org.apache.commons.configuration2.builder.fluent.Parameters; -import org.dspace.services.ConfigurationService; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.io.Resource; -import org.springframework.util.Assert; - -/** - * FactoryBean which wraps a Commons CompositeConfiguration object for usage - * with PropertiesLoaderSupport. This allows the configuration object to behave - * like a normal java.util.Properties object which can be passed on to - * setProperties() method allowing PropertyOverrideConfigurer and - * PropertyPlaceholderConfigurer to take advantage of Commons Configuration.
- * Internally a CompositeConfiguration object is used for merging multiple - * Configuration objects. - * - * @see java.util.Properties - * @see org.springframework.core.io.support.PropertiesLoaderSupport - * - * @author Costin Leau - * - */ -public class DSpaceConfigurationFactoryBean implements InitializingBean, FactoryBean { - - private CompositeConfiguration configuration; - - private Configuration[] configurations; - - private Resource[] locations; - - private boolean throwExceptionOnMissing = true; - - /** - * Initialize all properties via the passed in DSpace ConfigurationService - * @param configurationService current DSpace configuration service - */ - public DSpaceConfigurationFactoryBean(ConfigurationService configurationService) { - Assert.notNull(configurationService.getConfiguration()); - this.configuration = new CompositeConfiguration(configurationService.getConfiguration()); - } - - /** - * Initialize all properties via the passed in Commons Configuration - * @param configuration Commons configuration - */ - public DSpaceConfigurationFactoryBean(Configuration configuration) { - Assert.notNull(configuration); - this.configuration = new CompositeConfiguration(configuration); - } - - /** - * @see org.springframework.beans.factory.FactoryBean#getObject() - */ - @Override - public Object getObject() throws Exception { - return (configuration != null) ? ConfigurationConverter.getProperties(configuration) : null; - } - - /** - * @see org.springframework.beans.factory.FactoryBean#getObjectType() - */ - @Override - public Class getObjectType() { - return java.util.Properties.class; - } - - /** - * @see org.springframework.beans.factory.FactoryBean#isSingleton() - */ - @Override - public boolean isSingleton() { - return true; - } - - /** - * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() - */ - public void afterPropertiesSet() throws Exception { - if (configuration == null && (configurations == null || configurations.length == 0) - && (locations == null || locations.length == 0)) { - throw new IllegalArgumentException("no configuration object or location specified"); - } - - if (configuration == null) { - configuration = new CompositeConfiguration(); - } - - configuration.setThrowExceptionOnMissing(throwExceptionOnMissing); - - if (configurations != null) { - for (int i = 0; i < configurations.length; i++) { - configuration.addConfiguration(configurations[i]); - } - } - - if (locations != null) { - for (int i = 0; i < locations.length; i++) { - URL url = locations[i].getURL(); - Parameters params = new Parameters(); - FileBasedConfigurationBuilder builder = - new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class) - .configure(params.fileBased().setURL(url)); - configuration.addConfiguration(builder.getConfiguration()); - } - } - } - - /** - * @return Returns the configurations. - */ - public Configuration[] getConfigurations() { - return configurations; - } - - /** - * Set the commons configurations objects which will be used as properties. - * - * @param configurations array of Commons Configuration objects - */ - public void setConfigurations(Configuration[] configurations) { - this.configurations = configurations; - } - - public Resource[] getLocations() { - return locations; - } - - /** - * Shortcut for loading configuration from Spring resources. It will - * internally create a PropertiesConfiguration object based on the URL - * retrieved from the given Resources. - * - * @param locations array of resource locations - */ - public void setLocations(Resource[] locations) { - this.locations = locations; - } - - /** - * Return whether to throw an exception if a configuration is missing. - * @return true if exception should be throw, false otherwise. - */ - public boolean isThrowExceptionOnMissing() { - return throwExceptionOnMissing; - } - - /** - * Set the underlying Commons CompositeConfiguration throwExceptionOnMissing - * flag. - * @see org.apache.commons.configuration2.AbstractConfiguration - * @param throwExceptionOnMissing whether to throw an exception if a config is missing - */ - public void setThrowExceptionOnMissing(boolean throwExceptionOnMissing) { - this.throwExceptionOnMissing = throwExceptionOnMissing; - } - - /** - * Getter for the underlying CompositeConfiguration object. - * - * @return CompositeConfiguration object - */ - public CompositeConfiguration getConfiguration() { - return configuration; - } - -} - diff --git a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml index e2837bb14f..3c80713ce5 100644 --- a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml +++ b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml @@ -20,14 +20,35 @@ like ${dspace.dir} within our Spring bean XML configuration files. These property values are then dynamically loaded via our DSpaceConfigurationService. --> - - + --> - + + + + + + + + + + + + + + + + + diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java new file mode 100644 index 0000000000..d3303be04b --- /dev/null +++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java @@ -0,0 +1,105 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.servicemanager.config; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.File; + +import org.dspace.services.ConfigurationService; +import org.dspace.test.DSpaceAbstractKernelTest; +import org.junit.Before; +import org.junit.Test; + +/** + * Testing the org.apache.commons.configuration2.spring.ConfigurationPropertiesFactoryBean to ensure it performs + * property substitution in Spring XML configs (e.g. replacing ${dspace.dir} with the value from dspace.cfg) + *

+ * NOTE: This uses a TestDynamicPropertyBean bean defined in spring-test-beans.xml for all tests. It also depends + * on the org.springframework.beans.factory.config.PropertyPlaceholderConfigurer defined in + * spring-dspace-core-services.xml + * + * @author Tim Donohue + */ +public class DSpaceConfigurationBeanTest + extends DSpaceAbstractKernelTest { + + // Path to our main test config file (local.properties) + private String propertyFilePath; + + @Before + public void init() { + // Save the path to our main test configuration file + propertyFilePath = new DSpaceConfigurationService().getDSpaceHome(null) + File.separatorChar + + DSpaceConfigurationService.DEFAULT_CONFIG_DIR + File.separatorChar + "local.properties"; + } + + /** + * Test that property substitution is working properly in Spring XML configs. + * Properties in those configs (e.g. ${key}) should be dynamically replaced + * with the corresponding value from our ConfigurationService + */ + @Test + public void testGetBeanSettingFromConfigurationService() { + + // Load configs from files + ConfigurationService cfg = getKernel().getConfigurationService(); + assertNotNull("ConfigurationService returned null", cfg); + assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property")); + + //Load example service which is configured using a dynamic property (which is specified in a config file) + // See spring-test-beans.xml + TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean", + TestDynamicPropertyBean.class); + + assertNotNull("Bean returned null", bean); + assertNotNull("Bean.name() returned null", bean.getProperty()); + + // The name of the ServiceExample bean should be the SAME as the value of "serviceExample.bean.name" in + // configuration, as the spring-test-beans.xml uses ${serviceExample.bean.name} to set the name + assertEquals("Bean.name() does not match configuration", cfg.getProperty("testDynamicBean.property"), + bean.getProperty()); + } + + /** + * Test that automatic reloading of configuration via bean settings also works. + * + * @TODO: This test does not actually work yet, because Commons Configuration v2 doesn't yet have a + * org.apache.commons.configuration2.spring.ConfigurationPropertiesFactoryBean that supports reloading properties. + */ + /*@Test + public void testReloadBeanSettingFromConfigurationService() throws ConfigurationException, InterruptedException { + //Load example service which is configured using a dynamic property (which is specified in a config file) + // See spring-test-beans.xml + TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean", + TestDynamicPropertyBean.class); + assertNotNull("WeLoveDSpace", bean.getProperty()); + + // Change the value of that Property in the file itself (using a separate builder instance) + FileBasedConfigurationBuilder builder = new Configurations() + .propertiesBuilder(propertyFilePath); + PropertiesConfiguration config = builder.getConfiguration(); + // Clear out current value. Add in a new value + config.clearProperty("testDynamicBean.property"); + config.addProperty("testDynamicBean.property", "NewValue"); + // Save updates to file + builder.save(); + + // Check immediately. Property should be unchanged + // NOTE: If this fails, then somehow the configuration reloaded *immediately* + assertEquals("WeLoveDSpace", bean.getProperty()); + + // Wait now for 3 seconds + Thread.sleep(3_000); + + // Check again. Property should have reloaded + // NOTE: reload time is set in config-definition.xml to reload every 2 seconds + assertEquals("NewValue", bean.getProperty()); + } */ +} diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java deleted file mode 100644 index 90804d7823..0000000000 --- a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.servicemanager.config; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import org.dspace.services.ConfigurationService; -import org.dspace.test.DSpaceAbstractKernelTest; -import org.junit.Test; - -/** - * Testing the DSpaceConfigurationFactoryBean to ensure it performs property - * substitution in Spring XML configs (e.g. replacing ${dspace.dir} with the - * value from dspace.cfg) - *

- * NOTE: This uses a TestDynamicPropertyBean bean defined in spring-test-beans.xml - * for all tests. - * - * @author Tim Donohue - */ -public class DSpaceConfigurationFactoryBeanTest - extends DSpaceAbstractKernelTest { - - /** - * Test that property substitution is working properly in Spring XML configs. - * Properties in those configs (e.g. ${key}) should be dynamically replaced - * with the corresponding value from our ConfigurationService - */ - @Test - public void testGetBeanSettingFromConfigurationService() { - - // Load configs from files - ConfigurationService cfg = getKernel().getConfigurationService(); - assertNotNull("ConfigurationService returned null", cfg); - assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property")); - - //Load example service which is configured using a dynamic property (which is specified in a config file) - // See spring-test-beans.xml - TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean", - TestDynamicPropertyBean.class); - - assertNotNull("Bean returned null", bean); - assertNotNull("Bean.name() returned null", bean.getProperty()); - - // The name of the ServiceExample bean should be the SAME as the value of "serviceExample.bean.name" in - // configuration, - // as the spring-test-beans.xml uses ${serviceExample.bean.name} to set the name - assertEquals("Bean.name() does not match configuration", cfg.getProperty("testDynamicBean.property"), - bean.getProperty()); - } -} diff --git a/dspace-services/src/test/resources/spring/spring-test-beans.xml b/dspace-services/src/test/resources/spring/spring-test-beans.xml index 1242cb5cee..970b461726 100644 --- a/dspace-services/src/test/resources/spring/spring-test-beans.xml +++ b/dspace-services/src/test/resources/spring/spring-test-beans.xml @@ -26,12 +26,10 @@ - + - \ No newline at end of file + From 79d027776e7be07fae49f369951b0afa410b7886 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Thu, 18 Oct 2018 15:36:19 -0500 Subject: [PATCH 133/193] Add Spring PropertySource integration + tests to prove it works --- ...aceConfigurationPlaceholderConfigurer.java | 36 ++++++++++++++++++ .../spring/spring-dspace-core-services.xml | 26 +++++-------- .../config/DSpaceConfigurationBeanTest.java | 37 +++++++++++++++++-- .../TestDynamicAnnotationConfiguration.java | 33 +++++++++++++++++ .../resources/spring/spring-test-beans.xml | 9 ++++- 5 files changed, 120 insertions(+), 21 deletions(-) create mode 100644 dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java create mode 100644 dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java new file mode 100644 index 0000000000..b85450dcd0 --- /dev/null +++ b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java @@ -0,0 +1,36 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.servicemanager.config; + +import org.apache.commons.configuration2.Configuration; +import org.apache.commons.configuration2.spring.ConfigurationPropertySource; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.core.env.MutablePropertySources; + +/** + * Extends Spring PropertySourcesPlaceholderConfigurer to allow our Configuration to be included as a Spring + * PropertySource. This allows ${...} placeholders within bean definition property values and @Value annotations + * to be resolved using DSpaceConfigurationService + *

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

+ * NOTE: This is initialized in spring-dspace-core-services.xml + * + * @see PropertySourcesPlaceholderConfigurer + * @see DSpaceConfigurationService + */ +public class DSpaceConfigurationPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer { + + public DSpaceConfigurationPlaceholderConfigurer(Configuration configuration) { + ConfigurationPropertySource apacheCommonsConfigPropertySource = + new ConfigurationPropertySource(configuration.getClass().getName(), configuration); + MutablePropertySources propertySources = new MutablePropertySources(); + propertySources.addLast(apacheCommonsConfigPropertySource); + setPropertySources(propertySources); + } +} diff --git a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml index 3c80713ce5..a817972c20 100644 --- a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml +++ b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml @@ -16,22 +16,8 @@ - - - - - - @@ -44,8 +30,16 @@ + + + + + + + to the above PropertyPlaceholderConfigurer and PropertySourcesPlaceholderConfigurer beans. --> diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java index d3303be04b..fb121a2570 100644 --- a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java +++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java @@ -42,7 +42,7 @@ public class DSpaceConfigurationBeanTest /** * Test that property substitution is working properly in Spring XML configs. - * Properties in those configs (e.g. ${key}) should be dynamically replaced + * Properties in those XML configs (e.g. ${key}) should be dynamically replaced * with the corresponding value from our ConfigurationService */ @Test @@ -61,17 +61,46 @@ public class DSpaceConfigurationBeanTest assertNotNull("Bean returned null", bean); assertNotNull("Bean.name() returned null", bean.getProperty()); - // The name of the ServiceExample bean should be the SAME as the value of "serviceExample.bean.name" in - // configuration, as the spring-test-beans.xml uses ${serviceExample.bean.name} to set the name - assertEquals("Bean.name() does not match configuration", cfg.getProperty("testDynamicBean.property"), + // The bean's getProperty() method should return the same value as "testDynamicBean.property" in DSpace's + // configuration. This is cause bean's property is set to ${testDynamicBean.property} in spring-test-beans.xml + assertEquals("Bean.getProperty() does not match configuration", cfg.getProperty("testDynamicBean.property"), bean.getProperty()); } + /** + * Test that property substitution is working properly in Spring PropertySource (e.g. @Value annotations) + * Properties in those annotations, e.g. @Value("${key}"), should be dynamically replaced with the corresponding + * value from our ConfigurationService + */ + @Test + public void testGetPropertySourceFromConfigurationService() { + // Load configs from files + ConfigurationService cfg = getKernel().getConfigurationService(); + assertNotNull("ConfigurationService returned null", cfg); + assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property")); + + // Load test bean which is defined by TestDynamicAnnotationConfiguration + TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("propertyBeanUsingAnnotation", + TestDynamicPropertyBean.class); + + // The Test bean's property should be automatically set (see TestDynamicAnnotationConfiguration) + String configValue = bean.getProperty(); + + assertNotNull("PropertySource config returned null", configValue); + + // The value of "configValue" should be equal to "testDynamicBean.property" in our configuration. + // This is because configValue is set via an @Value annotation in TestDynamicAnnotationConfiguration + assertEquals("PropertySource config does not match configuration", cfg.getProperty("testDynamicBean.property"), + configValue); + } + /** * Test that automatic reloading of configuration via bean settings also works. * * @TODO: This test does not actually work yet, because Commons Configuration v2 doesn't yet have a * org.apache.commons.configuration2.spring.ConfigurationPropertiesFactoryBean that supports reloading properties. + * NOTE: This test also fails in Commons Configuration v1 (e.g. in DSpace 6.x). So, it's possible we may not be + * able to support reloadable properties via Spring beans (until Commons Configuration does) */ /*@Test public void testReloadBeanSettingFromConfigurationService() throws ConfigurationException, InterruptedException { diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java new file mode 100644 index 0000000000..581e33e2a3 --- /dev/null +++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java @@ -0,0 +1,33 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.servicemanager.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * A test bean which we will configure to load its one property via @Value annotation + *

+ * See DSpaceConfigurationFactoryBeanTest. + * + * @author Tim Donohue + */ +@Configuration +public class TestDynamicAnnotationConfiguration { + // This setting should be loaded from the "testDynamicBean.property" configuration in local.properties + @Value("${testDynamicBean.property}") + private String value; + + @Bean + public TestDynamicPropertyBean propertyBeanUsingAnnotation() { + TestDynamicPropertyBean bean = new TestDynamicPropertyBean(); + bean.setProperty(value); + return bean; + } +} diff --git a/dspace-services/src/test/resources/spring/spring-test-beans.xml b/dspace-services/src/test/resources/spring/spring-test-beans.xml index 970b461726..ed53d7f8f4 100644 --- a/dspace-services/src/test/resources/spring/spring-test-beans.xml +++ b/dspace-services/src/test/resources/spring/spring-test-beans.xml @@ -10,11 +10,18 @@ --> + http://www.springframework.org/schema/beans/spring-beans-2.5.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-2.5.xsd"> + + + From 3ec449f3dfd508a05d3bf708eaf70f6525a00a27 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 19 Oct 2018 14:56:38 -0500 Subject: [PATCH 134/193] Update dspace-api code to Commons Config v2 --- .../org/dspace/core/ConfigurationManager.java | 4 ++-- .../content/StatisticsDataWorkflow.java | 19 +++++++++++-------- .../util/SpiderDetectorServiceImpl.java | 4 ++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java b/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java index 30d6cf800a..5e2b30f36d 100644 --- a/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java +++ b/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java @@ -10,8 +10,8 @@ package org.dspace.core; import java.util.Enumeration; import java.util.Properties; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.ConfigurationConverter; +import org.apache.commons.configuration2.Configuration; +import org.apache.commons.configuration2.ConfigurationConverter; import org.apache.log4j.Logger; import org.dspace.services.factory.DSpaceServicesFactory; diff --git a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java index 3d2719faa7..a8e87533f8 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java +++ b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java @@ -17,9 +17,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.PropertiesConfiguration; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.configuration2.PropertiesConfiguration; +import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; +import org.apache.commons.configuration2.builder.fluent.Configurations; +import org.apache.commons.configuration2.ex.ConfigurationException; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.QueryResponse; @@ -188,15 +190,16 @@ public class StatisticsDataWorkflow extends StatisticsData { Date oldestDate = (Date) solrDocument.getFieldValue("time"); //Store the date, we only need to retrieve this once ! try { - //Also store it in the solr-statics configuration file, the reason for this being that the sort - // query - //can be very time consuming & we do not want this delay each time we want to see workflow + // Also store it in the solr-statics configuration file, the reason for this being that the sort + // query can be very time consuming & we do not want this delay each time we want to see workflow // statistics String solrConfigDir = configurationService.getProperty("dspace.dir") + File.separator + "config" + File.separator + "modules" + File.separator + "usage-statistics.cfg"; - PropertiesConfiguration config = new PropertiesConfiguration(solrConfigDir); + FileBasedConfigurationBuilder builder = new Configurations() + .propertiesBuilder(solrConfigDir); + PropertiesConfiguration config = builder.getConfiguration(); config.setProperty("workflow-start-date", new DCDate(oldestDate)); - config.save(); + builder.save(); } catch (ConfigurationException e) { log.error("Error while storing workflow start date", e); } diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java index 508f6ffe64..0b5149df74 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java @@ -19,8 +19,8 @@ import java.util.Set; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; -import org.apache.commons.configuration.ConversionException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.configuration2.ex.ConversionException; +import org.apache.commons.lang3.StringUtils; import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.slf4j.Logger; From b4eac9e5ff5540d2f19ec0fd7d1a40564bb6258e Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 19 Oct 2018 15:19:30 -0500 Subject: [PATCH 135/193] Update config-definition.xml to be v2 compatible --- dspace/config/config-definition.xml | 45 +++++++++++------------------ 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/dspace/config/config-definition.xml b/dspace/config/config-definition.xml index 9ec6973395..4020752e1a 100644 --- a/dspace/config/config-definition.xml +++ b/dspace/config/config-definition.xml @@ -1,48 +1,37 @@ - -

- - -
- - - + https://commons.apache.org/proper/commons-configuration/userguide/howto_basicfeatures.html#Variable_Interpolation --> + - + - - - - + + - - - - + + - + From 200cede397d6dc1525c6b05018ce607dcbab0e66 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 19 Oct 2018 15:21:53 -0500 Subject: [PATCH 136/193] Upgrade to commons-lang3 to avoid dependency conv issues. --- dspace-api/pom.xml | 4 ++-- .../org/dspace/administer/CreateAdministrator.java | 2 +- .../org/dspace/app/bulkedit/MetadataImport.java | 2 +- .../app/itemexport/ItemExportServiceImpl.java | 2 +- .../app/itemimport/ItemImportServiceImpl.java | 4 ++-- .../dspace/app/itemupdate/MetadataUtilities.java | 2 +- .../dspace/app/mediafilter/MediaFilterCLITool.java | 2 +- .../requestitem/RequestItemHelpdeskStrategy.java | 2 +- .../requestitem/RequestItemMetadataStrategy.java | 2 +- .../dspace/app/sfx/SFXFileReaderServiceImpl.java | 2 +- .../java/org/dspace/app/sherpa/SHERPAResponse.java | 2 +- .../java/org/dspace/app/sherpa/SHERPAService.java | 2 +- .../app/sherpa/submit/SHERPASubmitService.java | 2 +- .../org/dspace/app/sitemap/GenerateSitemaps.java | 4 ++-- .../org/dspace/app/statistics/StatisticsLoader.java | 2 +- .../src/main/java/org/dspace/app/util/DCInput.java | 2 +- .../java/org/dspace/app/util/DailyFileAppender.java | 2 +- .../java/org/dspace/app/util/SyndicationFeed.java | 4 ++-- .../src/main/java/org/dspace/app/util/Util.java | 2 +- .../src/main/java/org/dspace/app/util/XMLUtils.java | 2 +- .../org/dspace/authenticate/LDAPAuthentication.java | 2 +- .../org/dspace/authenticate/ShibAuthentication.java | 2 +- .../org/dspace/authenticate/X509Authentication.java | 2 +- .../java/org/dspace/authority/AuthorityValue.java | 2 +- .../dspace/authority/AuthorityValueServiceImpl.java | 2 +- .../org/dspace/authority/PersonAuthorityValue.java | 4 ++-- .../authority/indexer/DSpaceAuthorityIndexer.java | 4 ++-- .../java/org/dspace/authority/orcid/Orcidv2.java | 2 +- .../authority/orcid/Orcidv2AuthorityValue.java | 2 +- .../java/org/dspace/authority/util/EnumUtils.java | 2 +- .../org/dspace/authorize/AuthorizeServiceImpl.java | 2 +- .../java/org/dspace/authorize/ResourcePolicy.java | 2 +- .../dspace/authorize/ResourcePolicyServiceImpl.java | 2 +- .../main/java/org/dspace/browse/ItemListConfig.java | 2 +- .../java/org/dspace/checker/MostRecentChecksum.java | 4 ++-- .../org/dspace/content/BitstreamServiceImpl.java | 2 +- .../java/org/dspace/content/BundleServiceImpl.java | 2 +- .../org/dspace/content/CollectionServiceImpl.java | 2 +- .../src/main/java/org/dspace/content/Community.java | 2 +- .../org/dspace/content/CommunityServiceImpl.java | 2 +- .../org/dspace/content/DSpaceObjectServiceImpl.java | 4 ++-- .../java/org/dspace/content/ItemComparator.java | 2 +- .../java/org/dspace/content/ItemServiceImpl.java | 2 +- .../main/java/org/dspace/content/WorkspaceItem.java | 2 +- .../java/org/dspace/content/authority/Choices.java | 2 +- .../dspace/content/authority/DCInputAuthority.java | 2 +- .../authority/DSpaceControlledVocabulary.java | 4 ++-- .../InputFormSelfRegisterWrapperAuthority.java | 2 +- .../org/dspace/content/authority/SolrAuthority.java | 2 +- .../org/dspace/content/authority/TestAuthority.java | 2 +- .../content/comparator/NameAscendingComparator.java | 4 ++-- .../crosswalk/DIMDisseminationCrosswalk.java | 2 +- .../crosswalk/METSDisseminationCrosswalk.java | 2 +- .../content/crosswalk/METSRightsCrosswalk.java | 4 ++-- .../crosswalk/MODSDisseminationCrosswalk.java | 2 +- .../crosswalk/OREDisseminationCrosswalk.java | 2 +- .../dspace/content/crosswalk/PREMISCrosswalk.java | 4 ++-- .../org/dspace/content/crosswalk/QDCCrosswalk.java | 2 +- .../crosswalk/SimpleDCDisseminationCrosswalk.java | 2 +- .../crosswalk/XSLTDisseminationCrosswalk.java | 2 +- .../content/crosswalk/XSLTIngestionCrosswalk.java | 2 +- .../content/dao/impl/MetadataFieldDAOImpl.java | 2 +- .../content/packager/DSpaceAIPDisseminator.java | 2 +- .../org/dspace/content/packager/PDFPackager.java | 2 +- .../src/main/java/org/dspace/core/I18nUtil.java | 2 +- .../org/dspace/curate/AbstractCurationTask.java | 2 +- .../java/org/dspace/discovery/SolrServiceImpl.java | 6 +++--- .../SolrServiceMetadataBrowseIndexingPlugin.java | 2 +- .../DiscoveryConfigurationService.java | 2 +- .../configuration/DiscoverySortConfiguration.java | 2 +- .../disseminate/CitationDocumentServiceImpl.java | 2 +- .../org/dspace/embargo/DefaultEmbargoSetter.java | 2 +- .../src/main/java/org/dspace/eperson/EPerson.java | 4 ++-- .../java/org/dspace/eperson/EPersonServiceImpl.java | 2 +- .../java/org/dspace/eperson/Group2GroupCache.java | 2 +- .../java/org/dspace/eperson/GroupServiceImpl.java | 4 ++-- .../java/org/dspace/eperson/SubscribeCLITool.java | 2 +- .../org/dspace/eperson/dao/impl/GroupDAOImpl.java | 2 +- .../src/main/java/org/dspace/event/Event.java | 2 +- .../java/org/dspace/event/EventServiceImpl.java | 2 +- .../java/org/dspace/handle/HandleServiceImpl.java | 2 +- .../main/java/org/dspace/harvest/OAIHarvester.java | 2 +- .../src/main/java/org/dspace/health/Report.java | 2 +- .../dspace/identifier/DOIIdentifierProvider.java | 2 +- .../dspace/identifier/IdentifierServiceImpl.java | 2 +- .../identifier/VersionedDOIIdentifierProvider.java | 2 +- ...andleIdentifierProviderWithCanonicalHandles.java | 2 +- .../transform/AuthorMetadataProcessorService.java | 2 +- .../dspace/license/CreativeCommonsServiceImpl.java | 2 +- .../src/main/java/org/dspace/rdf/RDFUtil.java | 2 +- .../rdf/conversion/MetadataConverterPlugin.java | 2 +- .../dspace/rdf/conversion/MetadataRDFMapping.java | 2 +- .../SimpleDSORelationsConverterPlugin.java | 2 +- .../java/org/dspace/rdf/negotiation/MediaRange.java | 2 +- .../java/org/dspace/rdf/negotiation/Negotiator.java | 2 +- .../org/dspace/rdf/storage/HandleURIGenerator.java | 2 +- .../org/dspace/rdf/storage/LocalURIGenerator.java | 2 +- .../java/org/dspace/rdf/storage/RDFStorageImpl.java | 2 +- .../src/main/java/org/dspace/sort/SortOption.java | 2 +- .../main/java/org/dspace/statistics/Dataset.java | 8 ++++---- .../dspace/statistics/SolrLoggerServiceImpl.java | 6 +++--- .../statistics/content/StatisticsDataSearches.java | 4 ++-- .../statistics/content/StatisticsDataVisits.java | 2 +- .../dspace/statistics/util/StatisticsImporter.java | 2 +- .../org/dspace/storage/rdbms/DatabaseUtils.java | 2 +- .../storage/rdbms/migration/MigrationUtils.java | 2 +- .../dspace/submit/lookup/ArXivFileDataLoader.java | 2 +- .../java/org/dspace/submit/lookup/ArXivService.java | 2 +- .../dspace/submit/lookup/CiNiiFileDataLoader.java | 2 +- .../java/org/dspace/submit/lookup/CiNiiUtils.java | 2 +- .../submit/lookup/CrossRefFileDataLoader.java | 2 +- .../org/dspace/submit/lookup/CrossRefService.java | 2 +- .../org/dspace/submit/lookup/CrossRefUtils.java | 2 +- .../lookup/DSpaceWorkspaceItemOutputGenerator.java | 2 +- .../dspace/submit/lookup/MapConverterModifier.java | 2 +- .../lookup/NetworkSubmissionLookupDataLoader.java | 2 +- .../dspace/submit/lookup/PubmedFileDataLoader.java | 2 +- .../org/dspace/submit/lookup/PubmedService.java | 2 +- .../java/org/dspace/submit/lookup/PubmedUtils.java | 2 +- .../dspace/submit/lookup/RemoveLastDotModifier.java | 2 +- .../submit/lookup/ValueConcatenationModifier.java | 2 +- .../java/org/dspace/submit/step/MetadataStep.java | 2 +- .../submit/util/SubmissionLookupPublication.java | 2 +- .../java/org/dspace/testing/PubMedToImport.java | 2 +- .../text/filter/MARC21InitialArticleWord.java | 4 ++-- .../main/java/org/dspace/util/SolrImportExport.java | 2 +- .../workflowbasic/BasicWorkflowServiceImpl.java | 2 +- .../java/org/dspace/xmlworkflow/WorkflowUtils.java | 2 +- .../test/java/org/dspace/content/DCDateTest.java | 2 +- .../src/test/java/org/dspace/content/ItemTest.java | 2 +- .../identifier/DOIIdentifierProviderTest.java | 2 +- dspace-oai/pom.xml | 4 ++-- .../xoai/filter/DSpaceAtLeastOneMetadataFilter.java | 2 +- .../services/impl/solr/DSpaceSolrQueryResolver.java | 2 +- .../tests/helpers/stubs/StubbedSetRepository.java | 2 +- dspace-rdf/pom.xml | 4 ++-- .../dspace/rdf/providing/DataProviderServlet.java | 2 +- .../rdf/providing/LocalURIRedirectionServlet.java | 2 +- dspace-services/pom.xml | 4 ++-- .../java/org/dspace/kernel/DSpaceKernelManager.java | 2 +- .../dspace/servicemanager/DSpaceServiceManager.java | 2 +- .../dspace/services/events/SystemEventService.java | 2 +- .../sessions/StatelessRequestServiceImpl.java | 2 +- .../dspace/app/rest/DiscoveryRestController.java | 2 +- .../rest/converter/AuthorityEntryRestConverter.java | 6 +++--- .../app/rest/converter/AuthorityRestConverter.java | 6 +++--- .../app/rest/converter/DiscoverFacetsConverter.java | 2 +- .../converter/SubmissionDefinitionConverter.java | 6 +++--- .../app/rest/converter/SubmissionFormConverter.java | 6 +++--- .../app/rest/converter/WorkspaceItemConverter.java | 2 +- .../rest/converter/query/SearchQueryConverter.java | 2 +- .../org/dspace/app/rest/parameter/SearchFilter.java | 2 +- .../parameter/resolver/SearchFilterResolver.java | 2 +- .../repository/AuthorityEntryLinkRepository.java | 2 +- .../app/rest/repository/EPersonRestRepository.java | 4 ++-- .../rest/repository/LicenseRestLinkRepository.java | 2 +- .../repository/WorkspaceItemRestRepository.java | 4 ++-- .../patch/factories/impl/PatchOperation.java | 2 +- .../jwt/JWTTokenRestAuthenticationServiceImpl.java | 2 +- .../dspace/app/rest/submit/SubmissionService.java | 2 +- .../factory/impl/LicenseAddPatchOperation.java | 2 +- .../factory/impl/LicenseReplacePatchOperation.java | 2 +- .../app/rest/submit/step/ExtractMetadataStep.java | 4 ++-- .../submit/step/validation/AbstractValidation.java | 2 +- .../submit/step/validation/MetadataValidation.java | 2 +- .../org/dspace/app/rest/utils/ScopeResolver.java | 2 +- .../test/AbstractControllerIntegrationTest.java | 2 +- .../dspace/sword/CommunityCollectionGenerator.java | 2 +- .../main/java/org/dspace/sword/DepositManager.java | 2 +- .../org/dspace/sword/ItemCollectionGenerator.java | 2 +- .../main/java/org/dspace/sword/ItemDepositor.java | 2 +- .../java/org/dspace/sword/ItemEntryGenerator.java | 2 +- .../main/java/org/dspace/sword/SWORDUrlManager.java | 2 +- .../src/main/java/org/purl/sword/base/XmlName.java | 4 ++-- .../dspace/sword2/CommunityCollectionGenerator.java | 2 +- .../dspace/sword2/GenericStatementDisseminator.java | 2 +- .../org/dspace/sword2/SimpleDCEntryIngester.java | 2 +- .../java/org/dspace/sword2/SwordAuthenticator.java | 2 +- .../org/dspace/sword2/SwordConfigurationDSpace.java | 4 ++-- .../org/dspace/sword2/SwordDisseminatorFactory.java | 2 +- pom.xml | 13 +++++++++---- 181 files changed, 228 insertions(+), 223 deletions(-) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 9ce448aef4..19f9b52beb 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -378,8 +378,8 @@ commons-io
- commons-lang - commons-lang + org.apache.commons + commons-lang3 org.apache.commons diff --git a/dspace-api/src/main/java/org/dspace/administer/CreateAdministrator.java b/dspace-api/src/main/java/org/dspace/administer/CreateAdministrator.java index 7d603158ba..a58691e251 100644 --- a/dspace-api/src/main/java/org/dspace/administer/CreateAdministrator.java +++ b/dspace-api/src/main/java/org/dspace/administer/CreateAdministrator.java @@ -15,7 +15,7 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.core.I18nUtil; diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java index 9f94506980..7245bb568d 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java @@ -25,7 +25,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authority.AuthorityValue; import org.dspace.authority.factory.AuthorityServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java index 170aa0c620..630afc0ee9 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java @@ -32,7 +32,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import javax.mail.MessagingException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.itemexport.service.ItemExportService; import org.dspace.content.Bitstream; diff --git a/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java index 829594f448..682c090f60 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java @@ -55,8 +55,8 @@ import gr.ekt.bteio.loaders.OAIPMHDataLoader; import org.apache.commons.collections4.ComparatorUtils; import org.apache.commons.io.FileDeleteStrategy; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.RandomStringUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.log4j.Logger; import org.apache.xpath.XPathAPI; diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/MetadataUtilities.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/MetadataUtilities.java index 82ed5f75a0..8b3907ce50 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemupdate/MetadataUtilities.java +++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/MetadataUtilities.java @@ -28,7 +28,7 @@ import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.xpath.XPathAPI; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/MediaFilterCLITool.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/MediaFilterCLITool.java index fb9a120aa3..74751aec7e 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/MediaFilterCLITool.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/MediaFilterCLITool.java @@ -22,7 +22,7 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.app.mediafilter.factory.MediaFilterServiceFactory; import org.dspace.app.mediafilter.service.MediaFilterService; import org.dspace.content.Collection; diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java index d9922a9179..1dfdeef349 100644 --- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java +++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java @@ -9,7 +9,7 @@ package org.dspace.app.requestitem; import java.sql.SQLException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.Item; import org.dspace.core.ConfigurationManager; diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemMetadataStrategy.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemMetadataStrategy.java index 652f81f8c7..4d2f78408a 100644 --- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemMetadataStrategy.java +++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemMetadataStrategy.java @@ -10,7 +10,7 @@ package org.dspace.app.requestitem; import java.sql.SQLException; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.Item; import org.dspace.content.MetadataValue; import org.dspace.content.service.ItemService; diff --git a/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java index 8d58347bc5..66feb0e91e 100644 --- a/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java @@ -15,7 +15,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.sfx.service.SFXFileReaderService; import org.dspace.content.DCPersonName; diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java index 2384225562..269cad21f2 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java @@ -13,7 +13,7 @@ import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java index d1680a687d..c1f8dd0478 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java @@ -7,7 +7,7 @@ */ package org.dspace.app.sherpa; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java b/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java index 732c606ae8..6608454ae9 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java @@ -11,7 +11,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.sherpa.SHERPAResponse; import org.dspace.app.sherpa.SHERPAService; diff --git a/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java b/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java index 9c0640e072..eca4a85165 100644 --- a/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java +++ b/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java @@ -27,8 +27,8 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-api/src/main/java/org/dspace/app/statistics/StatisticsLoader.java b/dspace-api/src/main/java/org/dspace/app/statistics/StatisticsLoader.java index 02957bde4f..a151892db7 100644 --- a/dspace-api/src/main/java/org/dspace/app/statistics/StatisticsLoader.java +++ b/dspace-api/src/main/java/org/dspace/app/statistics/StatisticsLoader.java @@ -21,7 +21,7 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.lang.time.DateUtils; +import org.apache.commons.lang3.time.DateUtils; import org.dspace.core.ConfigurationManager; /** diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInput.java b/dspace-api/src/main/java/org/dspace/app/util/DCInput.java index 5564b66806..58bdb75878 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DCInput.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DCInput.java @@ -13,7 +13,7 @@ import java.util.Map; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.MetadataSchema; import org.dspace.core.Utils; import org.slf4j.Logger; diff --git a/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java b/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java index db83bf19c4..f8dd80046f 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java @@ -14,7 +14,7 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import org.apache.commons.lang.time.DateUtils; +import org.apache.commons.lang3.time.DateUtils; import org.apache.log4j.FileAppender; import org.apache.log4j.helpers.LogLog; import org.apache.log4j.spi.LoggingEvent; diff --git a/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java b/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java index 5e79b69202..d2ca6c3f93 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java +++ b/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java @@ -34,8 +34,8 @@ import com.sun.syndication.feed.synd.SyndPerson; import com.sun.syndication.feed.synd.SyndPersonImpl; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedOutput; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; diff --git a/dspace-api/src/main/java/org/dspace/app/util/Util.java b/dspace-api/src/main/java/org/dspace/app/util/Util.java index b3b6049b00..0646472a9c 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/Util.java +++ b/dspace-api/src/main/java/org/dspace/app/util/Util.java @@ -23,7 +23,7 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.apache.commons.collections4.ListUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java b/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java index 7f1b72a565..884b2a6a92 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java +++ b/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Element; import org.w3c.dom.NodeList; diff --git a/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java index 13ba180c0f..349f944a6d 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java @@ -28,7 +28,7 @@ import javax.naming.ldap.StartTlsResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; diff --git a/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java index cdea32a183..b6a0bfa3d2 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java @@ -23,7 +23,7 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java b/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java index da2097d0dd..2cbb95122b 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java @@ -29,7 +29,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.log4j.Logger; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java b/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java index 80d9e16289..eb10aeebf2 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java @@ -14,7 +14,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java b/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java index 7780c79232..1b83af7ec4 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; diff --git a/dspace-api/src/main/java/org/dspace/authority/PersonAuthorityValue.java b/dspace-api/src/main/java/org/dspace/authority/PersonAuthorityValue.java index 179e06fc79..f937b5f7ed 100644 --- a/dspace-api/src/main/java/org/dspace/authority/PersonAuthorityValue.java +++ b/dspace-api/src/main/java/org/dspace/authority/PersonAuthorityValue.java @@ -12,8 +12,8 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import org.apache.commons.lang.ObjectUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; diff --git a/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java b/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java index 3b8cc1daf8..8d6c90724a 100644 --- a/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java +++ b/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authority.AuthorityValue; import org.dspace.authority.service.AuthorityValueService; @@ -124,7 +124,7 @@ public class DSpaceAuthorityIndexer implements AuthorityIndexerInterface, Initia * This method looks at the authority of a metadata value. * If the authority can be found in solr, that value is reused. * Otherwise a new authority value will be generated that will be indexed in solr. - * + * * If the authority starts with AuthorityValueGenerator.GENERATE, a specific type of AuthorityValue will be * generated. * Depending on the type this may involve querying an external REST service diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java index cf97bbe442..14f0f9888d 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java @@ -15,7 +15,7 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2AuthorityValue.java b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2AuthorityValue.java index 0aa0d292e7..456ccacd4d 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2AuthorityValue.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2AuthorityValue.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; import org.dspace.authority.AuthorityValue; diff --git a/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java b/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java index 72dc41d6b9..ed6bc0d7c5 100644 --- a/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java +++ b/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java @@ -7,7 +7,7 @@ */ package org.dspace.authority.util; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; /** diff --git a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java index 8eca4ccf52..936a7d6492 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.authorize.service.AuthorizeService; import org.dspace.authorize.service.ResourcePolicyService; import org.dspace.content.Bitstream; diff --git a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java index 68d7ecd4f5..f4208e5835 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java +++ b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java @@ -23,7 +23,7 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; -import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.ObjectUtils; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; import org.dspace.core.ReloadableEntity; diff --git a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java index 2609c6d165..2aaf2d1e0d 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Set; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.log4j.Logger; import org.dspace.authorize.dao.ResourcePolicyDAO; import org.dspace.authorize.service.ResourcePolicyService; diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemListConfig.java b/dspace-api/src/main/java/org/dspace/browse/ItemListConfig.java index 58e3d83a0c..9cbbe8f194 100644 --- a/dspace-api/src/main/java/org/dspace/browse/ItemListConfig.java +++ b/dspace-api/src/main/java/org/dspace/browse/ItemListConfig.java @@ -12,7 +12,7 @@ import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; diff --git a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java index f6af3d171b..5962d19f68 100644 --- a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java +++ b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java @@ -19,8 +19,8 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.dspace.content.Bitstream; /** diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java index e5e7cc57e4..ba720e24c4 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; diff --git a/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java index d8ee51fadf..46b201c454 100644 --- a/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java index bd7034856f..29e5a08d7c 100644 --- a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java @@ -20,7 +20,7 @@ import java.util.MissingResourceException; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; diff --git a/dspace-api/src/main/java/org/dspace/content/Community.java b/dspace-api/src/main/java/org/dspace/content/Community.java index 448e86e039..05eb8a3955 100644 --- a/dspace-api/src/main/java/org/dspace/content/Community.java +++ b/dspace-api/src/main/java/org/dspace/content/Community.java @@ -23,7 +23,7 @@ import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Transient; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.log4j.Logger; import org.dspace.content.comparator.NameAscendingComparator; import org.dspace.content.factory.ContentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java index 667b0268b1..7e8d890198 100644 --- a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java @@ -17,7 +17,7 @@ import java.util.MissingResourceException; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; diff --git a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java index 8ec6b9ae29..c56513aa93 100644 --- a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java @@ -17,8 +17,8 @@ import java.util.Map; import java.util.StringTokenizer; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.authority.Choices; diff --git a/dspace-api/src/main/java/org/dspace/content/ItemComparator.java b/dspace-api/src/main/java/org/dspace/content/ItemComparator.java index 27e869d40b..2daa61cf57 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemComparator.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemComparator.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.ItemService; import org.dspace.sort.OrderFormat; diff --git a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java index 41dff1e5a6..11287e4622 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java @@ -17,7 +17,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; diff --git a/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java b/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java index 42ecce9403..cfe6211b4a 100644 --- a/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java +++ b/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java @@ -25,7 +25,7 @@ import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.dspace.core.Context; import org.dspace.core.ReloadableEntity; import org.dspace.eperson.EPerson; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/Choices.java b/dspace-api/src/main/java/org/dspace/content/authority/Choices.java index ab5fa162cd..534e3083da 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/Choices.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/Choices.java @@ -7,7 +7,7 @@ */ package org.dspace.content.authority; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; /** * Record class to hold a set of Choices returned by an authority in response diff --git a/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java index bf01f37f02..207595cfb0 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java @@ -12,7 +12,7 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.log4j.Logger; import org.dspace.app.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java b/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java index 70159c89dd..21eb3f158d 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java @@ -16,8 +16,8 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.Collection; import org.dspace.core.SelfNamedPlugin; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java index acfe4292f6..889bc89ecb 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java @@ -13,7 +13,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java index e6dbe45cc0..b508c908e7 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java @@ -12,7 +12,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/TestAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/TestAuthority.java index 8c3c94e5f1..a017e8fe28 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/TestAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/TestAuthority.java @@ -10,7 +10,7 @@ package org.dspace.content.authority; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.Collection; /** diff --git a/dspace-api/src/main/java/org/dspace/content/comparator/NameAscendingComparator.java b/dspace-api/src/main/java/org/dspace/content/comparator/NameAscendingComparator.java index 980554228b..3240824169 100644 --- a/dspace-api/src/main/java/org/dspace/content/comparator/NameAscendingComparator.java +++ b/dspace-api/src/main/java/org/dspace/content/comparator/NameAscendingComparator.java @@ -9,8 +9,8 @@ package org.dspace.content.comparator; import java.util.Comparator; -import org.apache.commons.lang.ObjectUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; public class NameAscendingComparator implements Comparator { diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/DIMDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/DIMDisseminationCrosswalk.java index 05560f0b32..3f4d6bd44e 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/DIMDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/DIMDisseminationCrosswalk.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSDisseminationCrosswalk.java index efe24b63d5..c3b20bccb1 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSDisseminationCrosswalk.java @@ -13,7 +13,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.packager.PackageDisseminator; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java index 4b76afd90b..2b03a38422 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java @@ -17,8 +17,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java index 1258408493..567f6e41f8 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREDisseminationCrosswalk.java index aad95da99a..af9c64b858 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREDisseminationCrosswalk.java @@ -16,7 +16,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java index 0f3aa991cd..360a450696 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java @@ -13,8 +13,8 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java index a20699bf1a..457c6486f2 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/SimpleDCDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/SimpleDCDisseminationCrosswalk.java index 789fa9d6fb..c9a9ddd900 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/SimpleDCDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/SimpleDCDisseminationCrosswalk.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTDisseminationCrosswalk.java index 9e505ed87a..a64fd47623 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTDisseminationCrosswalk.java @@ -22,7 +22,7 @@ import java.util.Map; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java index de479a4647..8565b39c44 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java @@ -15,7 +15,7 @@ import java.util.List; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java index de517765ba..c53ea0c9a7 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java @@ -16,7 +16,7 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Join; import javax.persistence.criteria.Root; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.MetadataField; import org.dspace.content.MetadataField_; import org.dspace.content.MetadataSchema; diff --git a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java index 2fb65dc1bb..9544f66727 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java @@ -28,7 +28,7 @@ import edu.harvard.hul.ois.mets.Type; import edu.harvard.hul.ois.mets.helper.MetsException; import edu.harvard.hul.ois.mets.helper.PCData; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java b/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java index 0b26cc867b..6aa995d063 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java @@ -16,7 +16,7 @@ import java.sql.SQLException; import java.util.Calendar; import java.util.List; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.log4j.Logger; import org.apache.pdfbox.cos.COSDocument; import org.apache.pdfbox.io.MemoryUsageSetting; diff --git a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java index b8aeb959b4..0794ec2493 100644 --- a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java +++ b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java @@ -15,7 +15,7 @@ import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.StringTokenizer; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.eperson.EPerson; import org.dspace.services.ConfigurationService; diff --git a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java index cf9c9fe9de..16ad1e490f 100644 --- a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java +++ b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java index 263370ed62..f7c5738e65 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java @@ -37,9 +37,9 @@ import java.util.Vector; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.Transformer; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.DateFormatUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.validator.routines.UrlValidator; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java index b47f81b6a2..44af866892 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java @@ -11,7 +11,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.solr.common.SolrInputDocument; import org.dspace.browse.BrowseException; diff --git a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java index d2d32d5ad9..69f992a29b 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java +++ b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java @@ -11,7 +11,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.services.factory.DSpaceServicesFactory; diff --git a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoverySortConfiguration.java b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoverySortConfiguration.java index 8538b54db2..db6ac80f29 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoverySortConfiguration.java +++ b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoverySortConfiguration.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * @author Kevin Van de Velde (kevin at atmire dot com) diff --git a/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java b/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java index a96ed6c3d3..6d34af3502 100644 --- a/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java @@ -20,7 +20,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.log4j.Logger; import org.apache.pdfbox.pdmodel.PDDocument; diff --git a/dspace-api/src/main/java/org/dspace/embargo/DefaultEmbargoSetter.java b/dspace-api/src/main/java/org/dspace/embargo/DefaultEmbargoSetter.java index 45b2d407ac..7857a45eb8 100644 --- a/dspace-api/src/main/java/org/dspace/embargo/DefaultEmbargoSetter.java +++ b/dspace-api/src/main/java/org/dspace/embargo/DefaultEmbargoSetter.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Date; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.factory.AuthorizeServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/eperson/EPerson.java b/dspace-api/src/main/java/org/dspace/eperson/EPerson.java index 5835ebeac8..fc2950ee2b 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/EPerson.java +++ b/dspace-api/src/main/java/org/dspace/eperson/EPerson.java @@ -21,8 +21,8 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; -import org.apache.commons.lang.BooleanUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObjectLegacySupport; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java index 4c04482f1f..a76d9c5ad9 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java @@ -18,7 +18,7 @@ import java.util.UUID; import org.apache.commons.codec.DecoderException; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; diff --git a/dspace-api/src/main/java/org/dspace/eperson/Group2GroupCache.java b/dspace-api/src/main/java/org/dspace/eperson/Group2GroupCache.java index df57f173b3..09bdf34d4c 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/Group2GroupCache.java +++ b/dspace-api/src/main/java/org/dspace/eperson/Group2GroupCache.java @@ -81,7 +81,7 @@ public class Group2GroupCache implements Serializable { @Override public int hashCode() { - return new org.apache.commons.lang.builder.HashCodeBuilder() + return new org.apache.commons.lang3.builder.HashCodeBuilder() .append(parent == null ? "" : parent.getID()) .append(child == null ? "" : child.getID()) .toHashCode(); diff --git a/dspace-api/src/main/java/org/dspace/eperson/GroupServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/GroupServiceImpl.java index fccaf3f1c8..7851e1cdc3 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/GroupServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/GroupServiceImpl.java @@ -18,7 +18,7 @@ import java.util.Set; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.dspace.authorize.AuthorizeConfiguration; @@ -686,7 +686,7 @@ public class GroupServiceImpl extends DSpaceObjectServiceImpl implements @Override public Group findByIdOrLegacyId(Context context, String id) throws SQLException { - if (org.apache.commons.lang.StringUtils.isNumeric(id)) { + if (org.apache.commons.lang3.StringUtils.isNumeric(id)) { return findByLegacyId(context, Integer.parseInt(id)); } else { return find(context, UUIDUtils.fromString(id)); diff --git a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java index 1cdefcbbdd..f9b0ae014c 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java +++ b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java @@ -25,7 +25,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.dspace.content.Collection; diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java index 8050bd9755..3c26468cc0 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.UUID; import javax.persistence.Query; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.dspace.content.MetadataField; import org.dspace.core.AbstractHibernateDSODAO; diff --git a/dspace-api/src/main/java/org/dspace/event/Event.java b/dspace-api/src/main/java/org/dspace/event/Event.java index 45b54362d6..78efff480f 100644 --- a/dspace-api/src/main/java/org/dspace/event/Event.java +++ b/dspace-api/src/main/java/org/dspace/event/Event.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java b/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java index 891148b672..70765430a3 100644 --- a/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java @@ -14,7 +14,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.pool2.KeyedObjectPool; import org.apache.commons.pool2.KeyedPooledObjectFactory; import org.apache.commons.pool2.PoolUtils; diff --git a/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java b/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java index d322fdd5c2..daf0045dc3 100644 --- a/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.service.SiteService; diff --git a/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java b/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java index 4593f10592..76876caf43 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java +++ b/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java @@ -31,7 +31,7 @@ import ORG.oclc.oai.harvester2.verb.Identify; import ORG.oclc.oai.harvester2.verb.ListIdentifiers; import ORG.oclc.oai.harvester2.verb.ListMetadataFormats; import ORG.oclc.oai.harvester2.verb.ListRecords; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; diff --git a/dspace-api/src/main/java/org/dspace/health/Report.java b/dspace-api/src/main/java/org/dspace/health/Report.java index 9285898220..9a571a8d5f 100644 --- a/dspace-api/src/main/java/org/dspace/health/Report.java +++ b/dspace-api/src/main/java/org/dspace/health/Report.java @@ -20,7 +20,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.exception.ExceptionUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Email; diff --git a/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java index 31d9efa36e..46bc317d13 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.ObjectUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java b/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java index 4cfd365fc2..88f46c4dc7 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java index 777fa4811f..b155bf7150 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java index 72cbf7d4e7..4c47fe7729 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Date; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; diff --git a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/transform/AuthorMetadataProcessorService.java b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/transform/AuthorMetadataProcessorService.java index 948075d9dc..5b814510ee 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/transform/AuthorMetadataProcessorService.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/transform/AuthorMetadataProcessorService.java @@ -7,7 +7,7 @@ */ package org.dspace.importer.external.metadatamapping.transform; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * Removes the last point from an author name. diff --git a/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java b/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java index c88c7d8b4b..ee45a70984 100644 --- a/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java @@ -21,7 +21,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; diff --git a/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java b/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java index 1280f18cd9..7ce0c9cbed 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java +++ b/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.UUID; import com.hp.hpl.jena.rdf.model.Model; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java index 5dcd8c2e4a..ebf1412e89 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java @@ -25,7 +25,7 @@ import com.hp.hpl.jena.reasoner.ValidityReport; import com.hp.hpl.jena.util.FileManager; import com.hp.hpl.jena.util.FileUtils; import com.hp.hpl.jena.vocabulary.RDF; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.factory.UtilServiceFactory; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java index 9fdf139197..92d6d2e8d2 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java @@ -22,7 +22,7 @@ import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.vocabulary.RDF; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; /** diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java index 96927fc3b2..4f70c1d029 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java @@ -18,7 +18,7 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.util.FileManager; import com.hp.hpl.jena.util.FileUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.content.Bitstream; diff --git a/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java b/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java index f0cd45b8fa..7b047cc55e 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java +++ b/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; /** diff --git a/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java b/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java index fe7a0029a4..399dbdb795 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java @@ -14,7 +14,7 @@ import java.util.Comparator; import java.util.Iterator; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.rdf.RDFUtil; import org.dspace.services.factory.DSpaceServicesFactory; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java b/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java index 7ed4c9f552..1ed54c7e3e 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java b/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java index 2aa9209ac1..b577b212ca 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java b/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java index 5656f409d7..a301762bf8 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java @@ -25,7 +25,7 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.sparql.core.DatasetGraph; import com.hp.hpl.jena.update.GraphStore; import com.hp.hpl.jena.update.GraphStoreFactory; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.jena.atlas.web.auth.HttpAuthenticator; import org.apache.jena.atlas.web.auth.SimpleAuthenticator; import org.apache.jena.web.DatasetGraphAccessor; diff --git a/dspace-api/src/main/java/org/dspace/sort/SortOption.java b/dspace-api/src/main/java/org/dspace/sort/SortOption.java index 5c1cdfa95d..5ce96fb41c 100644 --- a/dspace-api/src/main/java/org/dspace/sort/SortOption.java +++ b/dspace-api/src/main/java/org/dspace/sort/SortOption.java @@ -15,7 +15,7 @@ import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.core.ConfigurationManager; diff --git a/dspace-api/src/main/java/org/dspace/statistics/Dataset.java b/dspace-api/src/main/java/org/dspace/statistics/Dataset.java index 1993dc5847..9204c56a21 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/Dataset.java +++ b/dspace-api/src/main/java/org/dspace/statistics/Dataset.java @@ -18,8 +18,8 @@ import java.util.List; import java.util.Map; import au.com.bytecode.opencsv.CSVWriter; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; /** * @author kevinvandevelde at atmire.com @@ -54,8 +54,8 @@ public class Dataset { initRowLabels(rows); } - public Dataset(float[][] matrix) { - this.matrix = (String[][]) ArrayUtils.clone(matrix); + public Dataset(String[][] matrix) { + this.matrix = ArrayUtils.clone(matrix); nbRows = matrix.length; if (0 < matrix.length && 0 < matrix[0].length) { nbCols = matrix[0].length; diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java index 3a7105931f..a003169054 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java @@ -39,9 +39,9 @@ import com.maxmind.geoip2.DatabaseReader; import com.maxmind.geoip2.exception.GeoIp2Exception; import com.maxmind.geoip2.model.CityResponse; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.DateFormatUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; diff --git a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataSearches.java b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataSearches.java index a7c20688be..5a3d92e8f9 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataSearches.java +++ b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataSearches.java @@ -14,8 +14,8 @@ import java.text.ParseException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.util.ClientUtils; import org.dspace.content.DSpaceObject; diff --git a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java index cdd0cbbb73..5b003b3741 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java +++ b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.util.ClientUtils; import org.dspace.app.util.Util; diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java index 8588b381ce..91ae8d21fd 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java @@ -33,7 +33,7 @@ import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.time.DateFormatUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java index 13944f8de7..5037456018 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java @@ -23,7 +23,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.sql.DataSource; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.core.Context; import org.dspace.discovery.IndexingService; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/MigrationUtils.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/MigrationUtils.java index 4c4dcb2896..ce481d0caf 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/MigrationUtils.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/MigrationUtils.java @@ -12,7 +12,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * This Utility class offers utility methods which may be of use to perform diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java index 3711842fde..a41ed36082 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java @@ -25,7 +25,7 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.w3c.dom.Document; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivService.java index 44cd7ca541..0a32871758 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivService.java @@ -16,7 +16,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import gr.ekt.bte.core.Record; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java index 1ddc866568..ec602bd62d 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java @@ -25,7 +25,7 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiUtils.java index 65cf2bf609..929705371a 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiUtils.java @@ -17,7 +17,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.dspace.submit.util.SubmissionLookupPublication; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefFileDataLoader.java index 71b50e06dc..dcda4fdba5 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefFileDataLoader.java @@ -25,7 +25,7 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java index d1c0fa2654..fd72ffe5ff 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java @@ -24,7 +24,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import gr.ekt.bte.core.Record; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefUtils.java index c80af2b0a7..f9b64092af 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefUtils.java @@ -17,7 +17,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.dspace.submit.util.SubmissionLookupPublication; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java index 13d57a303d..8538ccb6ff 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java @@ -21,7 +21,7 @@ import gr.ekt.bte.core.OutputGenerator; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/MapConverterModifier.java b/dspace-api/src/main/java/org/dspace/submit/lookup/MapConverterModifier.java index b4885e9271..8698363924 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/MapConverterModifier.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/MapConverterModifier.java @@ -21,7 +21,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.services.ConfigurationService; /** diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/NetworkSubmissionLookupDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/NetworkSubmissionLookupDataLoader.java index 43e632e59f..c62afa6c35 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/NetworkSubmissionLookupDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/NetworkSubmissionLookupDataLoader.java @@ -19,7 +19,7 @@ import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.dspace.core.Context; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedFileDataLoader.java index e8213820b6..05a37e64d6 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedFileDataLoader.java @@ -25,7 +25,7 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java index 2bbb2af8bf..60a7df0483 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java @@ -19,7 +19,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import gr.ekt.bte.core.Record; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedUtils.java index 03f3e3ab03..bca34de295 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedUtils.java @@ -19,7 +19,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.dspace.submit.util.SubmissionLookupPublication; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/RemoveLastDotModifier.java b/dspace-api/src/main/java/org/dspace/submit/lookup/RemoveLastDotModifier.java index ed83d24aeb..24a7601b53 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/RemoveLastDotModifier.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/RemoveLastDotModifier.java @@ -16,7 +16,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * @author Andrea Bollini diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java index cdc9aa87db..8d52f1ba73 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java @@ -16,7 +16,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * @author Andrea Bollini diff --git a/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java b/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java index c0998bcb2e..0ef9fb00ce 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java @@ -19,7 +19,7 @@ import java.util.Set; import gr.ekt.bte.core.DataLoader; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java b/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java index e5b51cf95b..85c1fe7266 100644 --- a/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java +++ b/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java @@ -17,7 +17,7 @@ import java.util.Set; import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.submit.lookup.SubmissionLookupDataLoader; /** diff --git a/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java b/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java index 52c5599b3e..918ee7add5 100644 --- a/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java +++ b/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java @@ -21,7 +21,7 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; diff --git a/dspace-api/src/main/java/org/dspace/text/filter/MARC21InitialArticleWord.java b/dspace-api/src/main/java/org/dspace/text/filter/MARC21InitialArticleWord.java index 3985f19320..c82b9ccfcf 100644 --- a/dspace-api/src/main/java/org/dspace/text/filter/MARC21InitialArticleWord.java +++ b/dspace-api/src/main/java/org/dspace/text/filter/MARC21InitialArticleWord.java @@ -15,8 +15,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.services.factory.DSpaceServicesFactory; /** diff --git a/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java b/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java index b0ab3b4005..3f54426e71 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java @@ -27,7 +27,7 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java index c20de75ff8..b6af59d092 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java @@ -21,7 +21,7 @@ import java.util.UUID; import javax.mail.MessagingException; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java index 872ff2b21c..c09a785e60 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java @@ -17,7 +17,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import javax.servlet.http.HttpServletRequest; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-api/src/test/java/org/dspace/content/DCDateTest.java b/dspace-api/src/test/java/org/dspace/content/DCDateTest.java index ced07c72b2..da4d444c58 100644 --- a/dspace-api/src/test/java/org/dspace/content/DCDateTest.java +++ b/dspace-api/src/test/java/org/dspace/content/DCDateTest.java @@ -18,7 +18,7 @@ import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; -import org.apache.commons.lang.time.DateUtils; +import org.apache.commons.lang3.time.DateUtils; import org.apache.log4j.Logger; import org.junit.After; import org.junit.Before; diff --git a/dspace-api/src/test/java/org/dspace/content/ItemTest.java b/dspace-api/src/test/java/org/dspace/content/ItemTest.java index 32e6e5deb5..13d1e42d15 100644 --- a/dspace-api/src/test/java/org/dspace/content/ItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/ItemTest.java @@ -29,7 +29,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.commons.lang.time.DateUtils; +import org.apache.commons.lang3.time.DateUtils; import org.apache.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java b/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java index 51b0556401..a27315d1f7 100644 --- a/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java +++ b/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java @@ -21,7 +21,7 @@ import java.util.Date; import java.util.List; import java.util.Random; -import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index 136b8fc1dc..db1fbd7a9b 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -80,8 +80,8 @@ commons-io - commons-lang - commons-lang + org.apache.commons + commons-lang3 diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java index b84868cf23..8e75857bad 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java @@ -16,7 +16,7 @@ import com.lyncode.builder.ListBuilder; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterList; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.util.ClientUtils; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java index de58edd542..2e91f4c9d4 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java @@ -13,7 +13,7 @@ import java.util.List; import com.lyncode.xoai.dataprovider.filter.Scope; import com.lyncode.xoai.dataprovider.filter.ScopedFilter; import com.lyncode.xoai.dataprovider.filter.conditions.Condition; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.xoai.services.api.solr.SolrQueryResolver; import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver; import org.springframework.beans.factory.annotation.Autowired; diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedSetRepository.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedSetRepository.java index efe6125589..8432633e7b 100644 --- a/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedSetRepository.java +++ b/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedSetRepository.java @@ -8,7 +8,7 @@ package org.dspace.xoai.tests.helpers.stubs; import static java.lang.Math.min; -import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import java.util.ArrayList; import java.util.List; diff --git a/dspace-rdf/pom.xml b/dspace-rdf/pom.xml index 6e5284b85c..438fb9f091 100644 --- a/dspace-rdf/pom.xml +++ b/dspace-rdf/pom.xml @@ -72,8 +72,8 @@ log4j - commons-lang - commons-lang + org.apache.commons + commons-lang3 diff --git a/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java b/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java index 1e07364187..e5a757f9db 100644 --- a/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java +++ b/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java @@ -17,7 +17,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.hp.hpl.jena.rdf.model.Model; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; diff --git a/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java b/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java index 33b4107128..0cb3c7bdc0 100644 --- a/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java +++ b/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java @@ -14,7 +14,7 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml index 51d1f8b943..fb34e7ce60 100644 --- a/dspace-services/pom.xml +++ b/dspace-services/pom.xml @@ -95,8 +95,8 @@ compile - commons-lang - commons-lang + org.apache.commons + commons-lang3 diff --git a/dspace-services/src/main/java/org/dspace/kernel/DSpaceKernelManager.java b/dspace-services/src/main/java/org/dspace/kernel/DSpaceKernelManager.java index 00a938a27d..1f86c16b29 100644 --- a/dspace-services/src/main/java/org/dspace/kernel/DSpaceKernelManager.java +++ b/dspace-services/src/main/java/org/dspace/kernel/DSpaceKernelManager.java @@ -21,7 +21,7 @@ import javax.management.NotCompliantMBeanException; import javax.management.ObjectName; import javax.management.ReflectionException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/DSpaceServiceManager.java b/dspace-services/src/main/java/org/dspace/servicemanager/DSpaceServiceManager.java index 143f918bcb..a4520de0df 100644 --- a/dspace-services/src/main/java/org/dspace/servicemanager/DSpaceServiceManager.java +++ b/dspace-services/src/main/java/org/dspace/servicemanager/DSpaceServiceManager.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.kernel.Activator; import org.dspace.kernel.mixins.ConfigChangeListener; import org.dspace.kernel.mixins.InitializedService; diff --git a/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java b/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java index 3ef22825ce..de67e504a5 100644 --- a/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java +++ b/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java @@ -13,7 +13,7 @@ import java.util.Map; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.kernel.mixins.ShutdownService; import org.dspace.services.CachingService; import org.dspace.services.EventService; diff --git a/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java b/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java index 6f0b18ff40..07798a0225 100644 --- a/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java +++ b/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java @@ -18,7 +18,7 @@ import java.util.concurrent.ConcurrentHashMap; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.kernel.mixins.InitializedService; import org.dspace.kernel.mixins.ShutdownService; import org.dspace.services.ConfigurationService; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index 227f3edfee..31add4cbfe 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -11,7 +11,7 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.rest.link.HalLinkService; import org.dspace.app.rest.model.FacetConfigurationRest; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java index 2e4031338a..a278ae313d 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java @@ -7,7 +7,7 @@ */ package org.dspace.app.rest.converter; -import org.apache.commons.lang.NotImplementedException; +import org.apache.commons.lang3.NotImplementedException; import org.dspace.app.rest.model.AuthorityEntryRest; import org.dspace.app.rest.utils.AuthorityUtils; import org.dspace.content.authority.Choice; @@ -36,6 +36,6 @@ public class AuthorityEntryRestConverter extends DSpaceConverterapache-jena-libs pom ${jena.version} + + + org.apache.commons + commons-lang3 + + org.dspace @@ -1206,10 +1212,9 @@ 2.4 - commons-lang - commons-lang - 2.6 - + org.apache.commons + commons-lang3 + 3.7 commons-logging From 4d882bec608d6ded005044a6eb0d8c53f30a8fb2 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 26 Oct 2018 21:27:35 +0000 Subject: [PATCH 137/193] Remove unnecessary exclusion --- pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pom.xml b/pom.xml index 59c63ab1cb..307cef2944 100644 --- a/pom.xml +++ b/pom.xml @@ -1130,12 +1130,6 @@ apache-jena-libs pom ${jena.version} - - - org.apache.commons - commons-lang3 - - org.dspace From 34edf302b7ced3465fc7cceb3665058cdc6f7b4b Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 26 Oct 2018 21:30:06 +0000 Subject: [PATCH 138/193] Remove unnecessary PropertyPlaceholderConfigurer --- .../spring/spring-dspace-core-services.xml | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml index a817972c20..e5f14b2b07 100644 --- a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml +++ b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml @@ -16,30 +16,16 @@ - - - - - - - - - - - - + + to the above PropertySourcesPlaceholderConfigurer bean. --> From fb4e7ae9cbdb78c690836c81ada573cf5cd8e8de Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Tue, 6 Mar 2018 13:29:24 -0500 Subject: [PATCH 139/193] Update POMs to version 2.10.0 --- dspace-api/pom.xml | 10 ++++++++-- dspace-oai/pom.xml | 10 ++++++++-- dspace-rdf/pom.xml | 10 ++++++++-- dspace-rest/pom.xml | 10 ++++++++-- dspace-services/pom.xml | 10 ++++++++-- dspace-solr/pom.xml | 11 ++++++++--- dspace-sword/pom.xml | 24 ++++++++---------------- dspace-swordv2/pom.xml | 24 ++++++++---------------- pom.xml | 11 ++++++++--- 9 files changed, 72 insertions(+), 48 deletions(-) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 19f9b52beb..9dae1498f4 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -413,8 +413,14 @@ jdom - log4j - log4j + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 oro diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index db1fbd7a9b..5d5e4c8627 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -190,8 +190,14 @@ - log4j - log4j + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 org.slf4j diff --git a/dspace-rdf/pom.xml b/dspace-rdf/pom.xml index 438fb9f091..205eb2ef6c 100644 --- a/dspace-rdf/pom.xml +++ b/dspace-rdf/pom.xml @@ -68,8 +68,14 @@ provided - log4j - log4j + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 org.apache.commons diff --git a/dspace-rest/pom.xml b/dspace-rest/pom.xml index b4f54dbd32..81e6fc14e1 100644 --- a/dspace-rest/pom.xml +++ b/dspace-rest/pom.xml @@ -228,8 +228,14 @@ 1.2.1 - log4j - log4j + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 org.dspace diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml index fb34e7ce60..dafff484bb 100644 --- a/dspace-services/pom.xml +++ b/dspace-services/pom.xml @@ -144,8 +144,14 @@ slf4j-log4j12 - log4j - log4j + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 diff --git a/dspace-solr/pom.xml b/dspace-solr/pom.xml index f8e825bd13..ea569d8265 100644 --- a/dspace-solr/pom.xml +++ b/dspace-solr/pom.xml @@ -243,9 +243,14 @@ runtime - log4j - log4j - jar + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 javax.servlet diff --git a/dspace-sword/pom.xml b/dspace-sword/pom.xml index d93519952d..d5c6344306 100644 --- a/dspace-sword/pom.xml +++ b/dspace-sword/pom.xml @@ -121,22 +121,14 @@ test - log4j - log4j - - - jmxtools - com.sun.jdmk - - - jms - javax.jms - - - jmxri - com.sun.jmx - - + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 xom diff --git a/dspace-swordv2/pom.xml b/dspace-swordv2/pom.xml index 2d923f69d8..b201945817 100644 --- a/dspace-swordv2/pom.xml +++ b/dspace-swordv2/pom.xml @@ -112,22 +112,14 @@ dspace-api - log4j - log4j - - - jmxtools - com.sun.jdmk - - - jms - javax.jms - - - jmxri - com.sun.jmx - - + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 org.apache.abdera diff --git a/pom.xml b/pom.xml index 307cef2944..74b6fe894f 100644 --- a/pom.xml +++ b/pom.xml @@ -1258,9 +1258,14 @@ 1.1.3 - log4j - log4j - 1.2.17 + org.apache.logging.log4j + log4j-api + 2.10.0 + + + org.apache.logging.log4j + log4j-core + 2.10.0 oro From 7f4b4e9f8a8bbb7431cb7f4f06a5c527f4d05a5b Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Fri, 9 Mar 2018 17:54:01 -0500 Subject: [PATCH 140/193] Convert getLogger() and Log4J imports for Log4J 2 --- .../org/dspace/administer/RegistryLoader.java | 4 ++-- .../org/dspace/app/bulkedit/MetadataImport.java | 4 ++-- .../org/dspace/app/checker/ChecksumChecker.java | 5 +++-- .../app/itemexport/ItemExportServiceImpl.java | 4 ++-- .../app/itemimport/ItemImportServiceImpl.java | 4 ++-- .../org/dspace/app/itemupdate/ItemArchive.java | 4 ++-- .../org/dspace/app/mediafilter/ExcelFilter.java | 4 ++-- .../org/dspace/app/mediafilter/PDFFilter.java | 4 ++-- .../dspace/app/mediafilter/PowerPointFilter.java | 4 ++-- .../org/dspace/app/mediafilter/WordFilter.java | 4 ++-- .../requestitem/RequestItemHelpdeskStrategy.java | 4 ++-- .../app/requestitem/RequestItemServiceImpl.java | 4 ++-- .../dspace/app/sfx/SFXFileReaderServiceImpl.java | 4 ++-- .../org/dspace/app/sherpa/SHERPAService.java | 4 ++-- .../app/sherpa/submit/SHERPASubmitService.java | 4 ++-- .../org/dspace/app/sitemap/GenerateSitemaps.java | 4 ++-- .../dspace/app/util/DSpaceContextListener.java | 4 ++-- .../org/dspace/app/util/DailyFileAppender.java | 12 ++++++------ .../app/util/GoogleBitstreamComparator.java | 4 ++-- .../java/org/dspace/app/util/GoogleMetadata.java | 4 ++-- .../app/util/MetadataExposureServiceImpl.java | 4 ++-- .../dspace/app/util/OpenSearchServiceImpl.java | 4 ++-- .../app/util/OptimizeSelectCollection.java | 4 ++-- .../org/dspace/app/util/SubmissionConfig.java | 4 ++-- .../dspace/app/util/SubmissionConfigReader.java | 4 ++-- .../org/dspace/app/util/SyndicationFeed.java | 4 ++-- .../src/main/java/org/dspace/app/util/Util.java | 4 ++-- .../org/dspace/app/util/WebAppServiceImpl.java | 4 ++-- .../dspace/authenticate/IPAuthentication.java | 5 +++-- .../java/org/dspace/authenticate/IPMatcher.java | 4 ++-- .../dspace/authenticate/LDAPAuthentication.java | 4 ++-- .../authenticate/PasswordAuthentication.java | 4 ++-- .../dspace/authenticate/ShibAuthentication.java | 4 ++-- .../dspace/authenticate/X509Authentication.java | 4 ++-- .../authority/AuthoritySolrServiceImpl.java | 4 ++-- .../org/dspace/authority/AuthorityTypes.java | 4 ++-- .../org/dspace/authority/AuthorityValue.java | 4 ++-- .../authority/AuthorityValueServiceImpl.java | 4 ++-- .../org/dspace/authority/UpdateAuthorities.java | 4 ++-- .../authority/indexer/AuthorityConsumer.java | 4 ++-- .../authority/indexer/AuthorityIndexClient.java | 4 ++-- .../indexer/DSpaceAuthorityIndexer.java | 4 ++-- .../dspace/authority/orcid/xml/Converter.java | 4 ++-- .../org/dspace/authority/orcid/xml/XMLtoBio.java | 6 ++---- .../org/dspace/authority/rest/RESTConnector.java | 4 ++-- .../org/dspace/authority/util/EnumUtils.java | 4 ++-- .../java/org/dspace/authority/util/XMLUtils.java | 4 ++-- .../authorize/ResourcePolicyServiceImpl.java | 4 ++-- .../java/org/dspace/browse/BrowseEngine.java | 4 ++-- .../java/org/dspace/browse/ItemCountDAOSolr.java | 4 ++-- .../main/java/org/dspace/browse/ItemCounter.java | 4 ++-- .../org/dspace/browse/LocaleOrderingFilter.java | 4 ++-- .../java/org/dspace/browse/SolrBrowseDAO.java | 4 ++-- .../java/org/dspace/checker/CheckerCommand.java | 4 ++-- .../java/org/dspace/checker/CheckerConsumer.java | 4 ++-- .../org/dspace/checker/DailyReportEmailer.java | 4 ++-- .../org/dspace/checker/HandleDispatcher.java | 4 ++-- .../checker/MostRecentChecksumServiceImpl.java | 4 ++-- .../java/org/dspace/checker/ResultsLogger.java | 4 ++-- .../java/org/dspace/checker/ResultsPruner.java | 4 ++-- .../content/BitstreamFormatServiceImpl.java | 4 ++-- .../org/dspace/content/BitstreamServiceImpl.java | 4 ++-- .../org/dspace/content/BundleServiceImpl.java | 4 ++-- .../dspace/content/CollectionServiceImpl.java | 4 ++-- .../main/java/org/dspace/content/Community.java | 4 ++-- .../org/dspace/content/CommunityServiceImpl.java | 4 ++-- .../src/main/java/org/dspace/content/DCDate.java | 4 ++-- .../dspace/content/DSpaceObjectServiceImpl.java | 4 ++-- .../java/org/dspace/content/ItemServiceImpl.java | 4 ++-- .../dspace/content/MetadataFieldServiceImpl.java | 4 ++-- .../content/MetadataSchemaServiceImpl.java | 4 ++-- .../dspace/content/MetadataValueServiceImpl.java | 4 ++-- .../dspace/content/WorkspaceItemServiceImpl.java | 4 ++-- .../authority/ChoiceAuthorityServiceImpl.java | 4 ++-- .../content/authority/DCInputAuthority.java | 4 ++-- .../authority/DSpaceControlledVocabulary.java | 4 ++-- .../InputFormSelfRegisterWrapperAuthority.java | 4 ++-- .../content/authority/LCNameAuthority.java | 4 ++-- .../authority/MetadataAuthorityServiceImpl.java | 4 ++-- .../content/authority/SHERPARoMEOProtocol.java | 4 ++-- .../dspace/content/authority/SolrAuthority.java | 6 ++++-- .../content/crosswalk/AIPTechMDCrosswalk.java | 4 ++-- ...veCommonsRDFStreamDisseminationCrosswalk.java | 4 ++-- ...eativeCommonsRDFStreamIngestionCrosswalk.java | 4 ++-- ...eCommonsTextStreamDisseminationCrosswalk.java | 4 ++-- .../LicenseStreamDisseminationCrosswalk.java | 4 ++-- .../LicenseStreamIngestionCrosswalk.java | 4 ++-- .../content/crosswalk/METSRightsCrosswalk.java | 4 ++-- .../crosswalk/MODSDisseminationCrosswalk.java | 4 ++-- .../crosswalk/NullIngestionCrosswalk.java | 4 ++-- .../content/crosswalk/OREIngestionCrosswalk.java | 4 ++-- .../content/crosswalk/PREMISCrosswalk.java | 4 ++-- .../dspace/content/crosswalk/QDCCrosswalk.java | 4 ++-- .../XHTMLHeadDisseminationCrosswalk.java | 2 +- .../crosswalk/XSLTIngestionCrosswalk.java | 4 ++-- .../org/dspace/content/dao/impl/ItemDAOImpl.java | 4 ++-- .../packager/AbstractMETSDisseminator.java | 4 +++- .../content/packager/AbstractMETSIngester.java | 4 ++-- .../packager/AbstractPackageIngester.java | 4 ++-- .../content/packager/DSpaceAIPDisseminator.java | 4 ++-- .../content/packager/DSpaceAIPIngester.java | 4 ++-- .../dspace/content/packager/METSManifest.java | 4 ++-- .../org/dspace/content/packager/PDFPackager.java | 4 ++-- .../content/packager/PackageException.java | 2 +- .../dspace/content/packager/PackageUtils.java | 4 ++-- .../content/packager/RoleDisseminator.java | 4 ++-- .../org/dspace/core/ConfigurationManager.java | 4 ++-- .../src/main/java/org/dspace/core/Context.java | 4 ++-- .../src/main/java/org/dspace/core/Email.java | 4 ++-- .../src/main/java/org/dspace/core/I18nUtil.java | 4 ++-- .../org/dspace/core/LegacyPluginServiceImpl.java | 4 ++-- .../java/org/dspace/core/LoggerServiceImpl.java | 16 ++++++++-------- .../src/main/java/org/dspace/core/Utils.java | 4 ++-- .../dspace/ctask/general/AbstractTranslator.java | 4 ++-- .../dspace/ctask/general/BasicLinkChecker.java | 4 ++-- .../ctask/general/BitstreamsIntoMetadata.java | 4 ++-- .../dspace/ctask/general/MetadataWebService.java | 4 ++-- .../ctask/general/MicrosoftTranslator.java | 4 ++-- .../org/dspace/curate/AbstractCurationTask.java | 4 ++-- .../java/org/dspace/curate/CitationPage.java | 4 ++-- .../src/main/java/org/dspace/curate/Curator.java | 4 ++-- .../java/org/dspace/curate/FileTaskQueue.java | 4 ++-- .../java/org/dspace/curate/TaskResolver.java | 4 ++-- .../curate/WorkflowCuratorServiceImpl.java | 4 ++-- .../dspace/discovery/FullTextContentStreams.java | 4 ++-- .../java/org/dspace/discovery/IndexClient.java | 4 ++-- .../org/dspace/discovery/IndexEventConsumer.java | 4 ++-- .../org/dspace/discovery/SolrServiceImpl.java | 4 ++-- .../SolrServiceMetadataBrowseIndexingPlugin.java | 2 +- .../SolrServiceResourceRestrictionPlugin.java | 4 ++-- .../disseminate/CitationDocumentServiceImpl.java | 4 ++-- .../java/org/dspace/embargo/EmbargoCLITool.java | 4 ++-- .../org/dspace/embargo/EmbargoServiceImpl.java | 4 ++-- .../org/dspace/eperson/AccountServiceImpl.java | 4 ++-- .../java/org/dspace/eperson/EPersonConsumer.java | 4 ++-- .../org/dspace/eperson/EPersonServiceImpl.java | 4 ++-- .../org/dspace/eperson/SubscribeCLITool.java | 6 +++--- .../org/dspace/eperson/SubscribeServiceImpl.java | 4 ++-- .../java/org/dspace/event/BasicDispatcher.java | 4 ++-- .../java/org/dspace/event/ConsumerProfile.java | 4 ++-- .../src/main/java/org/dspace/event/Event.java | 4 ++-- .../java/org/dspace/event/EventServiceImpl.java | 4 ++-- .../main/java/org/dspace/event/TestConsumer.java | 4 ++-- .../java/org/dspace/google/GoogleAccount.java | 4 ++-- .../google/GoogleRecorderEventListener.java | 4 ++-- .../java/org/dspace/handle/HandlePlugin.java | 4 ++-- .../org/dspace/handle/HandleServiceImpl.java | 4 ++-- .../org/dspace/handle/UpdateHandlePrefix.java | 4 ++-- .../java/org/dspace/harvest/HarvestConsumer.java | 4 ++-- .../org/dspace/harvest/HarvestScheduler.java | 4 ++-- .../java/org/dspace/harvest/HarvestThread.java | 4 ++-- .../java/org/dspace/harvest/OAIHarvester.java | 4 ++-- .../src/main/java/org/dspace/health/Check.java | 4 ++-- .../src/main/java/org/dspace/health/Report.java | 4 ++-- .../identifier/HandleIdentifierProvider.java | 4 ++-- .../dspace/identifier/IdentifierServiceImpl.java | 4 ++-- .../VersionedDOIIdentifierProvider.java | 4 ++-- .../VersionedHandleIdentifierProvider.java | 4 ++-- ...leIdentifierProviderWithCanonicalHandles.java | 4 ++-- .../org/dspace/identifier/doi/DOIConsumer.java | 4 ++-- .../org/dspace/identifier/doi/DOIOrganiser.java | 4 ++-- .../AbstractMetadataFieldMapping.java | 4 ++-- .../PubmedDateMetadatumContributor.java | 4 ++-- .../PubmedLanguageMetadatumContributor.java | 4 ++-- .../importer/external/service/ImportService.java | 4 ++-- .../components/AbstractRemoteMetadataSource.java | 4 ++-- .../main/java/org/dspace/license/CCLookup.java | 4 ++-- .../license/CreativeCommonsServiceImpl.java | 4 ++-- .../java/org/dspace/license/LicenseCleanup.java | 4 ++-- .../main/java/org/dspace/rdf/RDFConsumer.java | 4 ++-- .../src/main/java/org/dspace/rdf/RDFUtil.java | 4 ++-- .../src/main/java/org/dspace/rdf/RDFizer.java | 4 ++-- .../rdf/conversion/MetadataConverterPlugin.java | 4 ++-- .../rdf/conversion/MetadataRDFMapping.java | 4 ++-- .../dspace/rdf/conversion/RDFConverterImpl.java | 4 ++-- .../SimpleDSORelationsConverterPlugin.java | 4 ++-- .../rdf/conversion/StaticDSOConverterPlugin.java | 4 ++-- .../org/dspace/rdf/factory/RDFFactoryImpl.java | 4 ++-- .../org/dspace/rdf/negotiation/MediaRange.java | 4 ++-- .../rdf/negotiation/NegotiationFilter.java | 4 ++-- .../org/dspace/rdf/negotiation/Negotiator.java | 4 ++-- .../org/dspace/rdf/storage/DOIURIGenerator.java | 4 ++-- .../dspace/rdf/storage/HandleURIGenerator.java | 4 ++-- .../dspace/rdf/storage/LocalURIGenerator.java | 4 ++-- .../org/dspace/rdf/storage/RDFStorageImpl.java | 4 ++-- .../src/main/java/org/dspace/search/Harvest.java | 4 ++-- .../org/dspace/sort/AbstractTextFilterOFD.java | 4 ++-- .../main/java/org/dspace/sort/SortOption.java | 4 ++-- .../dspace/statistics/SolrLoggerServiceImpl.java | 7 ++++--- .../statistics/SolrLoggerUsageEventListener.java | 4 ++-- .../content/StatisticsDataWorkflow.java | 4 ++-- .../util/ClassicDSpaceLogConverter.java | 4 ++-- .../dspace/statistics/util/LocationUtils.java | 4 ++-- .../dspace/statistics/util/StatisticsClient.java | 4 ++-- .../statistics/util/StatisticsImporter.java | 4 ++-- .../dspace/storage/bitstore/BitStoreMigrate.java | 4 ++-- .../bitstore/BitstreamStorageServiceImpl.java | 4 ++-- .../org/dspace/storage/bitstore/Cleanup.java | 4 ++-- .../storage/bitstore/DSBitStoreService.java | 4 ++-- .../storage/bitstore/S3BitStoreService.java | 4 ++-- .../org/dspace/storage/rdbms/DatabaseUtils.java | 4 ++-- .../storage/rdbms/GroupServiceInitializer.java | 4 ++-- .../storage/rdbms/PostgreSQLCryptoChecker.java | 4 ++-- .../storage/rdbms/SiteServiceInitializer.java | 4 ++-- ...01_26__DS_2188_Remove_DBMS_Browse_Tables.java | 4 ++-- .../submit/lookup/ArXivFileDataLoader.java | 4 ++-- .../submit/lookup/CiNiiFileDataLoader.java | 4 ++-- .../org/dspace/submit/lookup/CiNiiService.java | 4 ++-- .../dspace/submit/lookup/CrossRefService.java | 4 ++-- .../DSpaceWorkspaceItemOutputGenerator.java | 2 +- .../MultipleSubmissionLookupDataLoader.java | 2 +- .../submit/lookup/PubmedOnlineDataLoader.java | 4 ++-- .../org/dspace/submit/lookup/PubmedService.java | 4 ++-- .../submit/lookup/SubmissionItemDataLoader.java | 2 +- .../submit/lookup/SubmissionLookupService.java | 4 ++-- .../submit/lookup/SubmissionLookupUtils.java | 4 ++-- .../java/org/dspace/submit/step/AccessStep.java | 4 ++-- .../org/dspace/submit/step/CCLicenseStep.java | 4 ++-- .../org/dspace/submit/step/CompleteStep.java | 4 ++-- .../org/dspace/submit/step/DescribeStep.java | 8 ++++++-- .../java/org/dspace/submit/step/LicenseStep.java | 4 ++-- .../dspace/submit/step/SelectCollectionStep.java | 4 ++-- .../submit/step/StartSubmissionLookupStep.java | 2 +- .../java/org/dspace/submit/step/UploadStep.java | 4 ++-- .../submit/step/UploadWithEmbargoStep.java | 4 ++-- .../java/org/dspace/testing/PubMedToImport.java | 4 ++-- .../dspace/usage/LoggerUsageEventListener.java | 2 +- .../java/org/dspace/util/SolrImportExport.java | 4 ++-- .../versioning/DefaultItemVersionProvider.java | 4 ++-- .../org/dspace/versioning/VersionHistory.java | 4 ++-- .../BasicWorkflowItemServiceImpl.java | 4 ++-- .../workflowbasic/BasicWorkflowServiceImpl.java | 4 ++-- .../org/dspace/xmlworkflow/WorkflowUtils.java | 4 ++-- .../xmlworkflow/XmlWorkflowFactoryImpl.java | 4 ++-- .../xmlworkflow/XmlWorkflowServiceImpl.java | 4 ++-- .../xmlworkflow/migration/RestartWorkflow.java | 4 ++-- .../actions/userassignment/AutoAssignAction.java | 4 ++-- .../userassignment/UserSelectionAction.java | 4 ++-- .../XmlWorkflowItemServiceImpl.java | 4 ++-- .../test/java/org/dspace/AbstractDSpaceTest.java | 4 ++-- .../test/java/org/dspace/AbstractUnitTest.java | 4 ++-- .../org/dspace/app/bulkedit/DSpaceCSVTest.java | 4 ++-- .../org/dspace/app/util/GoogleMetadataTest.java | 4 ++-- .../org/dspace/content/BitstreamFormatTest.java | 4 ++-- .../java/org/dspace/content/BitstreamTest.java | 4 ++-- .../test/java/org/dspace/content/BundleTest.java | 4 ++-- .../java/org/dspace/content/CollectionTest.java | 4 ++-- .../java/org/dspace/content/CommunityTest.java | 4 ++-- .../test/java/org/dspace/content/DCDateTest.java | 4 ++-- .../org/dspace/content/FormatIdentifierTest.java | 4 ++-- .../dspace/content/ITCommunityCollection.java | 4 ++-- .../test/java/org/dspace/content/ITMetadata.java | 4 ++-- .../dspace/content/InProgressSubmissionTest.java | 4 ++-- .../java/org/dspace/content/InstallItemTest.java | 4 ++-- .../org/dspace/content/ItemComparatorTest.java | 4 ++-- .../test/java/org/dspace/content/ItemTest.java | 4 ++-- .../org/dspace/content/LicenseUtilsTest.java | 4 ++-- .../org/dspace/content/MetadataFieldTest.java | 4 ++-- .../org/dspace/content/MetadataSchemaTest.java | 4 ++-- .../org/dspace/content/MetadataValueTest.java | 4 ++-- .../content/NonUniqueMetadataExceptionTest.java | 4 ++-- .../test/java/org/dspace/content/SiteTest.java | 4 ++-- .../org/dspace/content/SupervisedItemTest.java | 4 ++-- .../java/org/dspace/content/ThumbnailTest.java | 4 ++-- .../java/org/dspace/content/VersioningTest.java | 4 ++-- .../org/dspace/content/WorkspaceItemTest.java | 4 ++-- .../org/dspace/content/packager/ITDSpaceAIP.java | 4 ++-- .../content/packager/PackageUtilsTest.java | 4 ++-- .../java/org/dspace/eperson/EPersonTest.java | 4 ++-- .../test/java/org/dspace/eperson/GroupTest.java | 4 ++-- .../handle/dao/impl/HandleDAOImplTest.java | 4 ++-- .../identifier/DOIIdentifierProviderTest.java | 4 ++-- .../identifier/EZIDIdentifierProviderTest.java | 2 +- .../BasicWorkflowAuthorizationIT.java | 4 ++-- .../BasicWorkflowAuthorizationRolesIT.java | 4 ++-- dspace-api/src/test/resources/log4j.properties | 8 ++++---- .../org/dspace/xoai/app/BasicConfiguration.java | 4 ++-- .../src/main/java/org/dspace/xoai/app/XOAI.java | 4 ++-- .../xoai/controller/DSpaceOAIDataProvider.java | 4 ++-- .../org/dspace/xoai/data/DSpaceSolrItem.java | 4 ++-- .../filter/DSpaceAtLeastOneMetadataFilter.java | 4 ++-- .../xoai/filter/DSpaceAuthorizationFilter.java | 4 ++-- .../xoai/filter/DSpaceMetadataExistsFilter.java | 4 ++-- .../dspace/xoai/filter/DSpaceSetSpecFilter.java | 4 ++-- .../org/dspace/xoai/filter/SolrFilterResult.java | 4 ++-- .../xoai/filter/results/SolrFilterResult.java | 4 ++-- .../impl/DSpaceEarliestDateResolver.java | 4 ++-- .../xoai/services/impl/MetadataFieldCache.java | 4 ++-- .../impl/solr/DSpaceSolrServerResolver.java | 4 ++-- .../impl/xoai/BaseDSpaceFilterResolver.java | 4 ++-- .../impl/xoai/DSpaceItemSolrRepository.java | 4 ++-- .../impl/xoai/DSpaceRepositoryConfiguration.java | 4 ++-- .../xoai/DSpaceResumptionTokenFormatter.java | 4 ++-- .../services/impl/xoai/DSpaceSetRepository.java | 4 ++-- .../org/dspace/xoai/solr/DSpaceSolrServer.java | 4 ++-- .../java/org/dspace/xoai/util/DateUtils.java | 4 ++-- .../java/org/dspace/xoai/util/ItemUtils.java | 4 ++-- .../main/java/org/dspace/xoai/util/URLUtils.java | 4 ++-- .../rdf/providing/DataProviderServlet.java | 4 ++-- .../providing/LocalURIRedirectionServlet.java | 4 ++-- .../java/org/dspace/rest/BitstreamResource.java | 4 ++-- .../org/dspace/rest/CollectionsResource.java | 4 ++-- .../org/dspace/rest/CommunitiesResource.java | 4 ++-- .../dspace/rest/FilteredCollectionsResource.java | 4 ++-- .../org/dspace/rest/FilteredItemsResource.java | 4 ++-- .../java/org/dspace/rest/FiltersResource.java | 4 ++-- .../java/org/dspace/rest/HandleResource.java | 4 ++-- .../java/org/dspace/rest/HierarchyResource.java | 4 ++-- .../main/java/org/dspace/rest/ItemsResource.java | 4 ++-- .../dspace/rest/MetadataRegistryResource.java | 4 ++-- .../src/main/java/org/dspace/rest/Resource.java | 4 ++-- .../src/main/java/org/dspace/rest/RestIndex.java | 4 ++-- .../main/java/org/dspace/rest/RestReports.java | 4 ++-- .../DSpaceAuthenticationProvider.java | 4 ++-- .../java/org/dspace/rest/common/Bitstream.java | 4 ++-- .../java/org/dspace/rest/common/Collection.java | 4 ++-- .../java/org/dspace/rest/common/Community.java | 4 ++-- .../dspace/rest/common/FilteredCollection.java | 4 ++-- .../main/java/org/dspace/rest/common/Item.java | 4 ++-- .../java/org/dspace/rest/common/ItemFilter.java | 4 ++-- .../org/dspace/rest/common/ItemFilterQuery.java | 4 ++-- .../dspace/rest/filter/ItemFilterDefsMeta.java | 4 ++-- .../dspace/rest/filter/ItemFilterDefsPerm.java | 4 ++-- .../org/dspace/rest/filter/ItemFilterSet.java | 4 ++-- .../org/dspace/rest/filter/ItemFilterUtil.java | 4 ++-- .../example/EventListenerExample.java | 2 +- .../src/test/resources/log4j.properties | 4 ++-- .../solr/filters/ConfigureLog4jListener.java | 14 +++++++------- .../app/rest/BitstreamContentRestController.java | 4 ++-- .../dspace/app/rest/DiscoveryRestController.java | 4 ++-- .../dspace/app/rest/RestResourceController.java | 4 ++-- .../app/rest/converter/BrowseEntryConverter.java | 4 ++-- .../app/rest/converter/CollectionConverter.java | 4 ++-- .../app/rest/converter/EPersonConverter.java | 4 ++-- .../app/rest/converter/GroupConverter.java | 4 ++-- .../dspace/app/rest/converter/ItemConverter.java | 4 ++-- .../converter/SubmissionDefinitionConverter.java | 4 ++-- .../converter/SubmissionSectionConverter.java | 4 ++-- .../rest/converter/WorkspaceItemConverter.java | 4 ++-- .../org/dspace/app/rest/link/HalLinkService.java | 4 ++-- .../rest/repository/DSpaceRestRepository.java | 4 ++-- .../rest/repository/DiscoveryRestRepository.java | 4 ++-- .../SubmissionUploadRestRepository.java | 4 ++-- .../repository/WorkspaceItemRestRepository.java | 4 ++-- .../app/rest/submit/SubmissionService.java | 4 ++-- .../app/rest/submit/step/DescribeStep.java | 4 ++-- .../step/validation/MetadataValidation.java | 4 ++-- .../submit/step/validation/UploadValidation.java | 4 ++-- .../org/dspace/app/rest/utils/ContextUtil.java | 4 ++-- .../app/rest/utils/DiscoverQueryBuilder.java | 4 ++-- .../org/dspace/app/rest/utils/ScopeResolver.java | 4 ++-- .../dspace/app/rest/builder/AbstractBuilder.java | 4 ++-- .../builder/AbstractDSpaceObjectBuilder.java | 4 ++-- .../app/rest/builder/BitstreamFormatBuilder.java | 4 ++-- .../app/rest/builder/MetadataFieldBuilder.java | 4 ++-- .../app/rest/builder/MetadataSchemaBuilder.java | 4 ++-- .../rest/test/AbstractDSpaceIntegrationTest.java | 4 ++-- .../AbstractIntegrationTestWithDatabase.java | 4 ++-- .../app/rest/utils/MultipartFileSenderTest.java | 4 ++-- .../java/org/dspace/solr/MockSolrServer.java | 4 ++-- .../src/test/resources/log4j.properties | 8 ++++---- .../dspace/sword/BitstreamEntryGenerator.java | 4 ++-- .../sword/CollectionCollectionGenerator.java | 4 ++-- .../org/dspace/sword/CollectionDepositor.java | 4 ++-- .../org/dspace/sword/CollectionLocation.java | 4 ++-- .../sword/CommunityCollectionGenerator.java | 2 +- .../java/org/dspace/sword/DSpaceSWORDServer.java | 4 ++-- .../java/org/dspace/sword/DepositManager.java | 4 ++-- .../org/dspace/sword/ItemEntryGenerator.java | 4 ++-- .../org/dspace/sword/SWORDAuthenticator.java | 4 ++-- .../org/dspace/sword/SWORDConfiguration.java | 4 ++-- .../java/org/dspace/sword/SWORDMETSIngester.java | 4 ++-- .../main/java/org/dspace/sword/SWORDService.java | 4 ++-- .../main/java/org/purl/sword/atom/Content.java | 4 ++-- .../src/main/java/org/purl/sword/atom/Entry.java | 4 ++-- .../main/java/org/purl/sword/atom/Generator.java | 4 ++-- .../src/main/java/org/purl/sword/atom/Link.java | 4 ++-- .../main/java/org/purl/sword/atom/Source.java | 4 ++-- .../java/org/purl/sword/atom/TextConstruct.java | 4 ++-- .../org/purl/sword/base/BasicContentElement.java | 4 ++-- .../java/org/purl/sword/base/ChecksumUtils.java | 4 ++-- .../java/org/purl/sword/base/Collection.java | 4 ++-- .../main/java/org/purl/sword/base/Deposit.java | 4 ++-- .../org/purl/sword/base/DepositResponse.java | 4 ++-- .../main/java/org/purl/sword/base/Service.java | 4 ++-- .../purl/sword/base/SwordAcceptPackaging.java | 4 ++-- .../sword/base/SwordContentPackageTypes.java | 4 ++-- .../main/java/org/purl/sword/base/Workspace.java | 4 ++-- .../java/org/purl/sword/base/XmlElement.java | 4 ++-- .../main/java/org/purl/sword/client/Client.java | 4 ++-- .../org/purl/sword/client/ClientFactory.java | 2 +- .../org/purl/sword/client/ClientOptions.java | 4 ++-- .../java/org/purl/sword/client/CmdClient.java | 4 ++-- .../org/purl/sword/server/DepositServlet.java | 4 ++-- .../java/org/purl/sword/server/DummyServer.java | 4 ++-- .../sword/server/ServiceDocumentServlet.java | 4 ++-- .../sword2/AbstractSwordContentIngester.java | 4 ++-- .../sword2/CollectionCollectionGenerator.java | 4 ++-- .../sword2/CollectionDepositManagerDSpace.java | 2 +- .../sword2/CommunityCollectionGenerator.java | 2 +- .../dspace/sword2/ContainerManagerDSpace.java | 4 ++-- .../java/org/dspace/sword2/DSpaceSwordAPI.java | 4 ++-- .../sword2/MediaResourceManagerDSpace.java | 2 +- .../java/org/dspace/sword2/ReceiptGenerator.java | 4 ++-- .../sword2/ServiceDocumentManagerDSpace.java | 2 +- .../org/dspace/sword2/SimpleDCEntryIngester.java | 4 ++-- .../dspace/sword2/StatementManagerDSpace.java | 4 ++-- .../org/dspace/sword2/SwordAuthenticator.java | 4 ++-- .../dspace/sword2/SwordConfigurationDSpace.java | 2 +- .../dspace/sword2/SwordMETSContentIngester.java | 4 ++-- dspace/config/log4j-console.properties | 4 ++-- dspace/config/log4j-handle-plugin.properties | 4 ++-- dspace/config/log4j-solr.properties | 8 ++++---- dspace/config/log4j.properties | 4 ++-- 414 files changed, 844 insertions(+), 835 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/administer/RegistryLoader.java b/dspace-api/src/main/java/org/dspace/administer/RegistryLoader.java index f1b8a0684c..b2f7280252 100644 --- a/dspace-api/src/main/java/org/dspace/administer/RegistryLoader.java +++ b/dspace-api/src/main/java/org/dspace/administer/RegistryLoader.java @@ -17,7 +17,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.xpath.XPathAPI; import org.dspace.authorize.AuthorizeException; import org.dspace.content.BitstreamFormat; @@ -47,7 +47,7 @@ public class RegistryLoader { /** * log4j category */ - private static Logger log = Logger.getLogger(RegistryLoader.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RegistryLoader.class); protected static BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() .getBitstreamFormatService(); diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java index 7245bb568d..b8b7b7311f 100644 --- a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java @@ -26,7 +26,7 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.AuthorityValue; import org.dspace.authority.factory.AuthorityServiceFactory; import org.dspace.authority.service.AuthorityValueService; @@ -92,7 +92,7 @@ public class MetadataImport { /** * Logger */ - protected static final Logger log = Logger.getLogger(MetadataImport.class); + protected static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataImport.class); protected final AuthorityValueService authorityValueService; diff --git a/dspace-api/src/main/java/org/dspace/app/checker/ChecksumChecker.java b/dspace-api/src/main/java/org/dspace/app/checker/ChecksumChecker.java index 40cea2f786..28f7b6644a 100644 --- a/dspace-api/src/main/java/org/dspace/app/checker/ChecksumChecker.java +++ b/dspace-api/src/main/java/org/dspace/app/checker/ChecksumChecker.java @@ -23,7 +23,8 @@ import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.checker.BitstreamDispatcher; import org.dspace.checker.CheckerCommand; import org.dspace.checker.HandleDispatcher; @@ -48,7 +49,7 @@ import org.dspace.core.Utils; * @author Nathan Sarr */ public final class ChecksumChecker { - private static final Logger LOG = Logger.getLogger(ChecksumChecker.class); + private static final Logger LOG = LogManager.getLogger(ChecksumChecker.class); private static final BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); diff --git a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java index 630afc0ee9..d3ffb14a9a 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java @@ -33,7 +33,7 @@ import java.util.zip.ZipOutputStream; import javax.mail.MessagingException; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.itemexport.service.ItemExportService; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -98,7 +98,7 @@ public class ItemExportServiceImpl implements ItemExportService { /** * log4j logger */ - private Logger log = Logger.getLogger(ItemExportServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemExportServiceImpl.class); protected ItemExportServiceImpl() { diff --git a/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java index 682c090f60..e848c7b9a3 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java @@ -58,7 +58,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.xpath.XPathAPI; import org.dspace.app.itemimport.service.ItemImportService; import org.dspace.app.util.LocalSchemaFilenameFilter; @@ -124,7 +124,7 @@ import org.xml.sax.SAXException; * allow the registration of files (bitstreams) into DSpace. */ public class ItemImportServiceImpl implements ItemImportService, InitializingBean { - private final Logger log = Logger.getLogger(ItemImportServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemImportServiceImpl.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java index 8b07335904..2270d736a8 100644 --- a/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java +++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java @@ -30,7 +30,7 @@ import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.LocalSchemaFilenameFilter; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; @@ -47,7 +47,7 @@ import org.w3c.dom.Document; * Encapsulates the Item in the context of the DSpace Archive Format */ public class ItemArchive { - private static final Logger log = Logger.getLogger(ItemArchive.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemArchive.class); public static final String DUBLIN_CORE_XML = "dublin_core.xml"; diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/ExcelFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/ExcelFilter.java index 28db4cea8a..c17d168c04 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/ExcelFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/ExcelFilter.java @@ -11,7 +11,7 @@ import java.io.InputStream; import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.poi.POITextExtractor; import org.apache.poi.extractor.ExtractorFactory; import org.apache.poi.hssf.extractor.ExcelExtractor; @@ -36,7 +36,7 @@ import org.dspace.content.Item; */ public class ExcelFilter extends MediaFilter { - private static Logger log = Logger.getLogger(ExcelFilter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ExcelFilter.class); public String getFilteredName(String oldFilename) { return oldFilename + ".txt"; diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFFilter.java index 6f398dabde..10ad5469d7 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFFilter.java @@ -16,7 +16,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.dspace.content.Item; @@ -30,7 +30,7 @@ import org.dspace.core.ConfigurationManager; */ public class PDFFilter extends MediaFilter { - private static Logger log = Logger.getLogger(PDFFilter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PDFFilter.class); @Override public String getFilteredName(String oldFilename) { diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/PowerPointFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/PowerPointFilter.java index e0345ed3e8..86b7096f68 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/PowerPointFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/PowerPointFilter.java @@ -10,7 +10,7 @@ package org.dspace.app.mediafilter; import java.io.ByteArrayInputStream; import java.io.InputStream; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.poi.POITextExtractor; import org.apache.poi.extractor.ExtractorFactory; import org.apache.poi.hslf.extractor.PowerPointExtractor; @@ -23,7 +23,7 @@ import org.dspace.content.Item; */ public class PowerPointFilter extends MediaFilter { - private static Logger log = Logger.getLogger(PowerPointFilter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PowerPointFilter.class); @Override public String getFilteredName(String oldFilename) { diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java index 5051c01fd4..d8fa8cc768 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java @@ -11,7 +11,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.textmining.extraction.TextExtractor; import org.textmining.extraction.word.WordTextExtractorFactory; @@ -24,7 +24,7 @@ import org.textmining.extraction.word.WordTextExtractorFactory; */ public class WordFilter extends MediaFilter { - private static Logger log = Logger.getLogger(WordFilter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(WordFilter.class); @Override public String getFilteredName(String oldFilename) { diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java index 1dfdeef349..a5f7341039 100644 --- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java +++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java @@ -10,7 +10,7 @@ package org.dspace.app.requestitem; import java.sql.SQLException; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; @@ -31,7 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class RequestItemHelpdeskStrategy extends RequestItemSubmitterStrategy { - private Logger log = Logger.getLogger(RequestItemHelpdeskStrategy.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(RequestItemHelpdeskStrategy.class); @Autowired(required = true) protected EPersonService ePersonService; diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemServiceImpl.java index baf64e8657..7f3d086c03 100644 --- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemServiceImpl.java @@ -10,7 +10,7 @@ package org.dspace.app.requestitem; import java.sql.SQLException; import java.util.Date; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.requestitem.dao.RequestItemDAO; import org.dspace.app.requestitem.service.RequestItemService; import org.dspace.content.Bitstream; @@ -28,7 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class RequestItemServiceImpl implements RequestItemService { - private final Logger log = Logger.getLogger(RequestItemServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(RequestItemServiceImpl.class); @Autowired(required = true) protected RequestItemDAO requestItemDAO; diff --git a/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java index 66feb0e91e..184f00a53e 100644 --- a/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java @@ -16,7 +16,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.sfx.service.SFXFileReaderService; import org.dspace.content.DCPersonName; import org.dspace.content.Item; @@ -58,7 +58,7 @@ public class SFXFileReaderServiceImpl implements SFXFileReaderService { /** * log4j logger */ - private final Logger log = Logger.getLogger(SFXFileReaderServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(SFXFileReaderServiceImpl.class); protected SFXFileReaderServiceImpl() { } diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java index c1f8dd0478..36c0c70f6d 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java @@ -16,7 +16,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; public class SHERPAService { @@ -29,7 +29,7 @@ public class SHERPAService { /** * log4j category */ - private static final Logger log = Logger.getLogger(SHERPAService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SHERPAService.class); public SHERPAService() { HttpClientBuilder builder = HttpClientBuilder.create(); diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java b/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java index 6608454ae9..44f2723539 100644 --- a/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java +++ b/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.sherpa.SHERPAResponse; import org.dspace.app.sherpa.SHERPAService; import org.dspace.content.Item; @@ -27,7 +27,7 @@ public class SHERPASubmitService { /** * log4j logger */ - private static Logger log = Logger.getLogger(SHERPASubmitService.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SHERPASubmitService.class); public void setConfiguration(SHERPASubmitConfigurationService configuration) { this.configuration = configuration; diff --git a/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java b/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java index eca4a85165..bf8bddcd8a 100644 --- a/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java +++ b/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java @@ -29,7 +29,7 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -52,7 +52,7 @@ public class GenerateSitemaps { /** * Logger */ - private static Logger log = Logger.getLogger(GenerateSitemaps.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GenerateSitemaps.class); private static final CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); private static final CollectionService collectionService = diff --git a/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java b/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java index f2dcd593dc..b0289ec4a4 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java @@ -16,14 +16,14 @@ import java.util.Enumeration; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Class to initialize / cleanup resources used by DSpace when the web application * is started or stopped. */ public class DSpaceContextListener implements ServletContextListener { - private static Logger log = Logger.getLogger(DSpaceContextListener.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceContextListener.class); /** * Initialize any resources required by the application. diff --git a/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java b/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java index f8dd80046f..ff45346715 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java @@ -15,9 +15,9 @@ import java.util.Calendar; import java.util.Date; import org.apache.commons.lang3.time.DateUtils; -import org.apache.log4j.FileAppender; -import org.apache.log4j.helpers.LogLog; -import org.apache.log4j.spi.LoggingEvent; +import org.apache.logging.log4j.FileAppender; +import org.apache.logging.log4j.helpers.LogLog; +import org.apache.logging.log4j.spi.LoggingEvent; /** * Special log appender for log4j. Adds the current date (ie. year-mon) to @@ -35,7 +35,7 @@ import org.apache.log4j.spi.LoggingEvent; * log4j.appender.A1.File=@@log.dir@@/dspace.log * log4j.appender.A1.DatePattern=yyyy-MM * log4j.appender.A1.MaxLogs=3 - * log4j.appender.A1.layout=org.apache.log4j.PatternLayout + * log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout * log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n */ public class DailyFileAppender extends FileAppender { @@ -81,7 +81,7 @@ public class DailyFileAppender extends FileAppender { } /* (non-Javadoc) - * @see org.apache.log4j.FileAppender#activateOptions() + * @see org.apache.logging.log4j.FileAppender#activateOptions() */ @Override public void activateOptions() { @@ -142,7 +142,7 @@ public class DailyFileAppender extends FileAppender { * Methods *----------------------------------------------------------------------------*/ /* (non-Javadoc) - * @see org.apache.log4j.WriterAppender#subAppend(org.apache.log4j.spi.LoggingEvent) + * @see org.apache.logging.log4j.WriterAppender#subAppend(org.apache.logging.log4j.spi.LoggingEvent) */ @Override protected void subAppend(LoggingEvent pobjEvent) { diff --git a/dspace-api/src/main/java/org/dspace/app/util/GoogleBitstreamComparator.java b/dspace-api/src/main/java/org/dspace/app/util/GoogleBitstreamComparator.java index 821fd2f3b5..add98af96f 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/GoogleBitstreamComparator.java +++ b/dspace-api/src/main/java/org/dspace/app/util/GoogleBitstreamComparator.java @@ -12,7 +12,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.factory.ContentServiceFactory; @@ -24,7 +24,7 @@ import org.dspace.core.Context; */ public class GoogleBitstreamComparator implements Comparator { - private final static Logger log = Logger.getLogger(GoogleBitstreamComparator.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleBitstreamComparator.class); HashMap priorityMap = new HashMap<>(); diff --git a/dspace-api/src/main/java/org/dspace/app/util/GoogleMetadata.java b/dspace-api/src/main/java/org/dspace/app/util/GoogleMetadata.java index f012395de4..c2bd6633f0 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/GoogleMetadata.java +++ b/dspace-api/src/main/java/org/dspace/app/util/GoogleMetadata.java @@ -26,7 +26,7 @@ import java.util.Properties; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -51,7 +51,7 @@ import org.jdom.Element; @SuppressWarnings("deprecation") public class GoogleMetadata { - private final static Logger log = Logger.getLogger(GoogleMetadata.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleMetadata.class); protected static final String GOOGLE_PREFIX = "google."; diff --git a/dspace-api/src/main/java/org/dspace/app/util/MetadataExposureServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/util/MetadataExposureServiceImpl.java index 3c3eb8ab4f..681867371a 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/MetadataExposureServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/util/MetadataExposureServiceImpl.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.service.MetadataExposureService; import org.dspace.authorize.service.AuthorizeService; import org.dspace.core.Context; @@ -58,7 +58,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @version $Revision: 3734 $ */ public class MetadataExposureServiceImpl implements MetadataExposureService { - protected Logger log = Logger.getLogger(MetadataExposureServiceImpl.class); + protected Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataExposureServiceImpl.class); protected Map> hiddenElementSets = null; protected Map>> hiddenElementMaps = null; diff --git a/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java index d0824923c7..c8d5a8dd9a 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java @@ -20,7 +20,7 @@ import com.sun.syndication.feed.module.opensearch.OpenSearchModule; import com.sun.syndication.feed.module.opensearch.entity.OSQuery; import com.sun.syndication.feed.module.opensearch.impl.OpenSearchModuleImpl; import com.sun.syndication.io.FeedException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.service.OpenSearchService; import org.dspace.content.DSpaceObject; import org.dspace.core.Constants; @@ -54,7 +54,7 @@ import org.w3c.dom.Document; * @author Richard Rodgers */ public class OpenSearchServiceImpl implements OpenSearchService, InitializingBean { - private static final Logger log = Logger.getLogger(OpenSearchServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(OpenSearchServiceImpl.class); // are open search queries enabled? protected boolean enabled = false; diff --git a/dspace-api/src/main/java/org/dspace/app/util/OptimizeSelectCollection.java b/dspace-api/src/main/java/org/dspace/app/util/OptimizeSelectCollection.java index c717ac3014..1e018ff889 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/OptimizeSelectCollection.java +++ b/dspace-api/src/main/java/org/dspace/app/util/OptimizeSelectCollection.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; @@ -28,7 +28,7 @@ import org.springframework.util.StopWatch; * Invocation: dsrun org.dspace.app.util.OptimizeSelectCollection */ public class OptimizeSelectCollection { - private static final Logger log = Logger.getLogger(OptimizeSelectCollection.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(OptimizeSelectCollection.class); private static Context context; private static ArrayList brokenPeople; diff --git a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfig.java b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfig.java index c231955ad4..94d61048bb 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfig.java +++ b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfig.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Class representing a single Item Submission config definition, organized into @@ -44,7 +44,7 @@ public class SubmissionConfig implements Serializable { /** * log4j logger */ - private static Logger log = Logger.getLogger(SubmissionConfig.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionConfig.class); /** * Constructs a new Submission Configuration object, based on the XML diff --git a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java index 407d9c2bef..c65b7d1c90 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java +++ b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java @@ -19,7 +19,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; @@ -71,7 +71,7 @@ public class SubmissionConfigReader { /** * log4j logger */ - private static Logger log = Logger.getLogger(SubmissionConfigReader.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionConfigReader.class); /** * The fully qualified pathname of the directory containing the Item Submission Configuration file diff --git a/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java b/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java index d2ca6c3f93..3e0caee543 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java +++ b/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java @@ -36,7 +36,7 @@ import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedOutput; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Collection; @@ -69,7 +69,7 @@ import org.w3c.dom.Document; * @author Larry Stone */ public class SyndicationFeed { - protected final Logger log = Logger.getLogger(SyndicationFeed.class); + protected final Logger log = org.apache.logging.log4j.LogManager.getLogger(SyndicationFeed.class); /** diff --git a/dspace-api/src/main/java/org/dspace/app/util/Util.java b/dspace-api/src/main/java/org/dspace/app/util/Util.java index 0646472a9c..7d4a5e8182 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/Util.java +++ b/dspace-api/src/main/java/org/dspace/app/util/Util.java @@ -24,7 +24,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.MetadataValue; @@ -44,7 +44,7 @@ public class Util { // cache for source version result private static String sourceVersion = null; - private static Logger log = Logger.getLogger(Util.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Util.class); /** * Default constructor. Must be protected as org.dspace.xmlworkflow.WorkflowUtils extends it diff --git a/dspace-api/src/main/java/org/dspace/app/util/WebAppServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/util/WebAppServiceImpl.java index 84cc21e642..5709867f24 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/WebAppServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/util/WebAppServiceImpl.java @@ -18,7 +18,7 @@ import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpHead; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.dao.WebAppDAO; import org.dspace.app.util.service.WebAppService; import org.dspace.core.Context; @@ -33,7 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class WebAppServiceImpl implements WebAppService { - private final Logger log = Logger.getLogger(WebAppServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(WebAppServiceImpl.class); @Autowired(required = true) protected WebAppDAO webAppDAO; diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java index a36c7dbb00..f78cc449be 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java @@ -17,7 +17,8 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; +import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.core.LogManager; import org.dspace.core.factory.CoreServiceFactory; @@ -50,7 +51,7 @@ public class IPAuthentication implements AuthenticationMethod { /** * Our logger */ - private static Logger log = Logger.getLogger(IPAuthentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IPAuthentication.class); /** * Whether to look for x-forwarded headers for logging IP addresses diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPMatcher.java b/dspace-api/src/main/java/org/dspace/authenticate/IPMatcher.java index 02825589cb..955b6c86d3 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/IPMatcher.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/IPMatcher.java @@ -10,7 +10,7 @@ package org.dspace.authenticate; import java.net.Inet6Address; import java.net.UnknownHostException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** *

@@ -38,7 +38,7 @@ import org.apache.log4j.Logger; * @version $Revision$ */ public class IPMatcher { - private static Logger log = Logger.getLogger(IPMatcher.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IPMatcher.class); /** * Network to match diff --git a/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java index 349f944a6d..ae793ec433 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java @@ -29,7 +29,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; import org.dspace.authorize.AuthorizeException; @@ -61,7 +61,7 @@ public class LDAPAuthentication /** * log4j category */ - private static Logger log = Logger.getLogger(LDAPAuthentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LDAPAuthentication.class); protected AuthenticationService authenticationService = AuthenticateServiceFactory.getInstance() .getAuthenticationService(); diff --git a/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java index a111be30ce..86cfb50c5f 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java @@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.LogManager; import org.dspace.eperson.EPerson; @@ -49,7 +49,7 @@ public class PasswordAuthentication /** * log4j category */ - private static Logger log = Logger.getLogger(PasswordAuthentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PasswordAuthentication.class); /** diff --git a/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java index b6a0bfa3d2..2ff0e457a8 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java @@ -24,7 +24,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authorize.AuthorizeException; import org.dspace.content.MetadataField; @@ -70,7 +70,7 @@ public class ShibAuthentication implements AuthenticationMethod { /** * log4j category */ - private static Logger log = Logger.getLogger(ShibAuthentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ShibAuthentication.class); /** * Additional metadata mappings diff --git a/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java b/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java index 2cbb95122b..df9e767116 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java @@ -30,7 +30,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; import org.dspace.authorize.AuthorizeException; @@ -105,7 +105,7 @@ public class X509Authentication implements AuthenticationMethod { /** * log4j category */ - private static Logger log = Logger.getLogger(X509Authentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(X509Authentication.class); /** * public key of CA to check client certs against. diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java b/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java index 56521ac950..2aeaa6e364 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java @@ -12,7 +12,7 @@ import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; @@ -30,7 +30,7 @@ import org.dspace.core.ConfigurationManager; */ public class AuthoritySolrServiceImpl implements AuthorityIndexingService, AuthoritySearchService { - private static final Logger log = Logger.getLogger(AuthoritySolrServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthoritySolrServiceImpl.class); protected AuthoritySolrServiceImpl() { diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthorityTypes.java b/dspace-api/src/main/java/org/dspace/authority/AuthorityTypes.java index 22f2f495cf..3ed16e9ce1 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthorityTypes.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthorityTypes.java @@ -12,7 +12,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * This class contains a list of active authority types. @@ -32,7 +32,7 @@ public class AuthorityTypes { /** * log4j logger */ - private static Logger log = Logger.getLogger(AuthorityTypes.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityTypes.class); protected List types = new ArrayList(); diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java b/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java index eb10aeebf2..acb5bd754d 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; import org.dspace.authorize.AuthorizeException; @@ -234,7 +234,7 @@ public class AuthorityValue { /** * log4j logger */ - private static Logger log = Logger.getLogger(AuthorityValue.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityValue.class); @Override public String toString() { diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java b/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java index 1b83af7ec4..194da3eba5 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.UUID; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; @@ -34,7 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class AuthorityValueServiceImpl implements AuthorityValueService { - private final Logger log = Logger.getLogger(AuthorityValueServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityValueServiceImpl.class); @Autowired(required = true) protected AuthorityTypes authorityTypes; diff --git a/dspace-api/src/main/java/org/dspace/authority/UpdateAuthorities.java b/dspace-api/src/main/java/org/dspace/authority/UpdateAuthorities.java index 44fd0a9241..db008c9db6 100644 --- a/dspace-api/src/main/java/org/dspace/authority/UpdateAuthorities.java +++ b/dspace-api/src/main/java/org/dspace/authority/UpdateAuthorities.java @@ -19,7 +19,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.factory.AuthorityServiceFactory; import org.dspace.authority.service.AuthorityValueService; import org.dspace.content.Item; @@ -40,7 +40,7 @@ public class UpdateAuthorities { /** * log4j logger */ - private static Logger log = Logger.getLogger(UpdateAuthorities.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(UpdateAuthorities.class); protected PrintWriter print = null; diff --git a/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityConsumer.java b/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityConsumer.java index c5029db53a..2105aa9488 100644 --- a/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityConsumer.java +++ b/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityConsumer.java @@ -12,7 +12,7 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.factory.AuthorityServiceFactory; import org.dspace.authority.service.AuthorityService; import org.dspace.content.DSpaceObject; @@ -33,7 +33,7 @@ import org.dspace.event.Event; */ public class AuthorityConsumer implements Consumer { - private final Logger log = Logger.getLogger(AuthorityConsumer.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityConsumer.class); /** * A set of all item IDs installed which need their authority updated diff --git a/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityIndexClient.java b/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityIndexClient.java index 2b933a3bff..f2a4dcf6c4 100644 --- a/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityIndexClient.java +++ b/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityIndexClient.java @@ -12,7 +12,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.AuthorityValue; import org.dspace.authority.factory.AuthorityServiceFactory; import org.dspace.authority.service.AuthorityService; @@ -29,7 +29,7 @@ import org.dspace.core.Context; */ public class AuthorityIndexClient { - private static Logger log = Logger.getLogger(AuthorityIndexClient.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityIndexClient.class); protected static final AuthorityService authorityService = AuthorityServiceFactory.getInstance().getAuthorityService(); diff --git a/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java b/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java index 8d6c90724a..20baef8f9c 100644 --- a/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java +++ b/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java @@ -14,7 +14,7 @@ import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.AuthorityValue; import org.dspace.authority.service.AuthorityValueService; import org.dspace.authorize.AuthorizeException; @@ -45,7 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class DSpaceAuthorityIndexer implements AuthorityIndexerInterface, InitializingBean { - private static final Logger log = Logger.getLogger(DSpaceAuthorityIndexer.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceAuthorityIndexer.class); /** * The list of metadata fields which are to be indexed * diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java index 784a3fdf24..f64b498235 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java @@ -14,9 +14,9 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; -import org.apache.log4j.Logger; import org.xml.sax.SAXException; +import org.apache.logging.log4j.Logger; /** * @param type @@ -30,7 +30,7 @@ public abstract class Converter { /** * log4j logger */ - private static Logger log = Logger.getLogger(Converter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Converter.class); public abstract T convert(InputStream document); diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java index 9fb4a50d5f..7f2de9f870 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java @@ -12,7 +12,6 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; import org.dspace.authority.orcid.Orcidv2; import org.dspace.utils.DSpace; import org.orcid.jaxb.model.common_v2.OrcidId; @@ -20,8 +19,7 @@ import org.orcid.jaxb.model.record_v2.Person; import org.orcid.jaxb.model.search_v2.Result; import org.orcid.jaxb.model.search_v2.Search; import org.xml.sax.SAXException; - - +import org.apache.logging.log4j.Logger; /** * @author Antoine Snyers (antoine at atmire.com) @@ -34,7 +32,7 @@ public class XMLtoBio extends Converter { /** * log4j logger */ - private static Logger log = Logger.getLogger(XMLtoBio.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(XMLtoBio.class); @Override public List convert(InputStream xml) { diff --git a/dspace-api/src/main/java/org/dspace/authority/rest/RESTConnector.java b/dspace-api/src/main/java/org/dspace/authority/rest/RESTConnector.java index cfa21a66cb..df88985d3a 100644 --- a/dspace-api/src/main/java/org/dspace/authority/rest/RESTConnector.java +++ b/dspace-api/src/main/java/org/dspace/authority/rest/RESTConnector.java @@ -15,7 +15,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * @author Antoine Snyers (antoine at atmire.com) @@ -28,7 +28,7 @@ public class RESTConnector { /** * log4j logger */ - private static Logger log = Logger.getLogger(RESTConnector.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RESTConnector.class); private String url; diff --git a/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java b/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java index ed6bc0d7c5..43239ea459 100644 --- a/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java +++ b/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java @@ -8,7 +8,7 @@ package org.dspace.authority.util; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * @author Antoine Snyers (antoine at atmire.com) @@ -21,7 +21,7 @@ public class EnumUtils { /** * log4j logger */ - private static Logger log = Logger.getLogger(EnumUtils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(EnumUtils.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/authority/util/XMLUtils.java b/dspace-api/src/main/java/org/dspace/authority/util/XMLUtils.java index 5249f599e3..77568205af 100644 --- a/dspace-api/src/main/java/org/dspace/authority/util/XMLUtils.java +++ b/dspace-api/src/main/java/org/dspace/authority/util/XMLUtils.java @@ -17,7 +17,7 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.xpath.XPathExpressionException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.xpath.XPathAPI; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -36,7 +36,7 @@ public class XMLUtils { /** * log4j logger */ - private static Logger log = Logger.getLogger(XMLUtils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(XMLUtils.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java index 2aaf2d1e0d..4693599c31 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java @@ -16,7 +16,7 @@ import java.util.Set; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.dao.ResourcePolicyDAO; import org.dspace.authorize.service.ResourcePolicyService; import org.dspace.content.DSpaceObject; @@ -38,7 +38,7 @@ public class ResourcePolicyServiceImpl implements ResourcePolicyService { /** * log4j logger */ - private static Logger log = Logger.getLogger(ResourcePolicyServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ResourcePolicyServiceImpl.class); @Autowired(required = true) protected ContentServiceFactory contentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/browse/BrowseEngine.java b/dspace-api/src/main/java/org/dspace/browse/BrowseEngine.java index f7fb0b21ee..302d46eb0d 100644 --- a/dspace-api/src/main/java/org/dspace/browse/BrowseEngine.java +++ b/dspace-api/src/main/java/org/dspace/browse/BrowseEngine.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -34,7 +34,7 @@ public class BrowseEngine { /** * the logger for this class */ - private static final Logger log = Logger.getLogger(BrowseEngine.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BrowseEngine.class); /** * the browse scope which is the basis for our browse diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java index e39a584684..4b741847a8 100644 --- a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java +++ b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java @@ -11,7 +11,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -36,7 +36,7 @@ public class ItemCountDAOSolr implements ItemCountDAO { /** * Log4j logger */ - private static Logger log = Logger.getLogger(ItemCountDAOSolr.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemCountDAOSolr.class); /** * DSpace context diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java b/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java index 9b91f7afb9..c9c140fb0b 100644 --- a/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java +++ b/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java @@ -9,7 +9,7 @@ package org.dspace.browse; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -37,7 +37,7 @@ public class ItemCounter { /** * Log4j logger */ - private static Logger log = Logger.getLogger(ItemCounter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemCounter.class); /** * DAO to use to store and retrieve data diff --git a/dspace-api/src/main/java/org/dspace/browse/LocaleOrderingFilter.java b/dspace-api/src/main/java/org/dspace/browse/LocaleOrderingFilter.java index 40f889233a..c2a2bd9804 100644 --- a/dspace-api/src/main/java/org/dspace/browse/LocaleOrderingFilter.java +++ b/dspace-api/src/main/java/org/dspace/browse/LocaleOrderingFilter.java @@ -12,7 +12,7 @@ import java.util.Locale; import com.ibm.icu.text.CollationElementIterator; import com.ibm.icu.text.Collator; import com.ibm.icu.text.RuleBasedCollator; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.text.filter.TextFilter; @@ -32,7 +32,7 @@ import org.dspace.text.filter.TextFilter; * @author Graham Triggs */ public class LocaleOrderingFilter implements TextFilter { - private static Logger log = Logger.getLogger(LocaleOrderingFilter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LocaleOrderingFilter.class); /** * Uses a Locale dependent Collator to generate a sort string diff --git a/dspace-api/src/main/java/org/dspace/browse/SolrBrowseDAO.java b/dspace-api/src/main/java/org/dspace/browse/SolrBrowseDAO.java index 3e5415f7d4..98d5b8bbcb 100644 --- a/dspace-api/src/main/java/org/dspace/browse/SolrBrowseDAO.java +++ b/dspace-api/src/main/java/org/dspace/browse/SolrBrowseDAO.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.DSpaceObject; @@ -68,7 +68,7 @@ public class SolrBrowseDAO implements BrowseDAO { /** * Log4j log */ - private static final Logger log = Logger.getLogger(SolrBrowseDAO.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrBrowseDAO.class); /** * The DSpace context diff --git a/dspace-api/src/main/java/org/dspace/checker/CheckerCommand.java b/dspace-api/src/main/java/org/dspace/checker/CheckerCommand.java index 2ae27e5ec6..6b16d51bfe 100644 --- a/dspace-api/src/main/java/org/dspace/checker/CheckerCommand.java +++ b/dspace-api/src/main/java/org/dspace/checker/CheckerCommand.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.Map; import org.apache.commons.collections4.MapUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.factory.CheckerServiceFactory; import org.dspace.checker.service.ChecksumHistoryService; import org.dspace.checker.service.ChecksumResultService; @@ -42,7 +42,7 @@ public final class CheckerCommand { /** * Usual Log4J logger. */ - private static final Logger LOG = Logger.getLogger(CheckerCommand.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(CheckerCommand.class); private Context context; diff --git a/dspace-api/src/main/java/org/dspace/checker/CheckerConsumer.java b/dspace-api/src/main/java/org/dspace/checker/CheckerConsumer.java index f4266a7a79..4601e3867f 100644 --- a/dspace-api/src/main/java/org/dspace/checker/CheckerConsumer.java +++ b/dspace-api/src/main/java/org/dspace/checker/CheckerConsumer.java @@ -7,7 +7,7 @@ */ package org.dspace.checker; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.factory.CheckerServiceFactory; import org.dspace.checker.service.ChecksumHistoryService; import org.dspace.content.Bitstream; @@ -26,7 +26,7 @@ public class CheckerConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(CheckerConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CheckerConsumer.class); protected ChecksumHistoryService checksumHistoryService = CheckerServiceFactory.getInstance() .getChecksumHistoryService(); diff --git a/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java b/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java index 0b54ede0c5..56dabb0460 100644 --- a/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java +++ b/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java @@ -21,7 +21,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.factory.CheckerServiceFactory; import org.dspace.checker.service.SimpleReporterService; import org.dspace.core.ConfigurationManager; @@ -43,7 +43,7 @@ public class DailyReportEmailer { /** * log4j logger. */ - private static Logger log = Logger.getLogger(DailyReportEmailer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DailyReportEmailer.class); /** * Default constructor. diff --git a/dspace-api/src/main/java/org/dspace/checker/HandleDispatcher.java b/dspace-api/src/main/java/org/dspace/checker/HandleDispatcher.java index cec2d8f566..e68b37e180 100644 --- a/dspace-api/src/main/java/org/dspace/checker/HandleDispatcher.java +++ b/dspace-api/src/main/java/org/dspace/checker/HandleDispatcher.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; @@ -35,7 +35,7 @@ public class HandleDispatcher implements BitstreamDispatcher { /** * Log 4j logger. */ - private static final Logger LOG = Logger.getLogger(HandleDispatcher.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(HandleDispatcher.class); protected Context context; diff --git a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java index 82a8ace677..5e875a152d 100644 --- a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.Date; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.dao.MostRecentChecksumDAO; import org.dspace.checker.service.ChecksumResultService; import org.dspace.checker.service.MostRecentChecksumService; @@ -28,7 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author kevinvandevelde at atmire.com */ public class MostRecentChecksumServiceImpl implements MostRecentChecksumService { - private static final Logger log = Logger.getLogger(MostRecentChecksumServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MostRecentChecksumServiceImpl.class); @Autowired(required = true) protected MostRecentChecksumDAO mostRecentChecksumDAO; diff --git a/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java b/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java index e0cf489d8c..358d0c4018 100644 --- a/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java +++ b/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java @@ -12,7 +12,7 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.core.Context; import org.dspace.core.I18nUtil; @@ -30,7 +30,7 @@ public class ResultsLogger implements ChecksumResultsCollector { /** * Usual Log4J logger. */ - private static final Logger LOG = Logger.getLogger(ResultsLogger.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(ResultsLogger.class); /** * Utility date format. diff --git a/dspace-api/src/main/java/org/dspace/checker/ResultsPruner.java b/dspace-api/src/main/java/org/dspace/checker/ResultsPruner.java index 2d595a19f8..d3c0b130da 100644 --- a/dspace-api/src/main/java/org/dspace/checker/ResultsPruner.java +++ b/dspace-api/src/main/java/org/dspace/checker/ResultsPruner.java @@ -19,7 +19,7 @@ import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.factory.CheckerServiceFactory; import org.dspace.checker.service.ChecksumHistoryService; import org.dspace.core.ConfigurationManager; @@ -40,7 +40,7 @@ public final class ResultsPruner { /** * Default logger. */ - private static final Logger LOG = Logger.getLogger(ResultsPruner.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(ResultsPruner.class); /** * Factory method for the default results pruner configuration using diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamFormatServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BitstreamFormatServiceImpl.java index 978b3070fc..7239424d91 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamFormatServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamFormatServiceImpl.java @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.BitstreamFormatDAO; @@ -33,7 +33,7 @@ public class BitstreamFormatServiceImpl implements BitstreamFormatService { /** * log4j logger */ - private static Logger log = Logger.getLogger(BitstreamFormat.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamFormat.class); @Autowired(required = true) protected BitstreamFormatDAO bitstreamFormatDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java index ba720e24c4..bef2012202 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java @@ -16,7 +16,7 @@ import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.BitstreamDAO; @@ -43,7 +43,7 @@ public class BitstreamServiceImpl extends DSpaceObjectServiceImpl imp /** * log4j logger */ - private static Logger log = Logger.getLogger(BitstreamServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamServiceImpl.class); @Autowired(required = true) diff --git a/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java index 46b201c454..1e4f4daa07 100644 --- a/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java @@ -17,7 +17,7 @@ import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; @@ -45,7 +45,7 @@ public class BundleServiceImpl extends DSpaceObjectServiceImpl implement /** * log4j logger */ - private static Logger log = Logger.getLogger(Bundle.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Bundle.class); @Autowired(required = true) protected BundleDAO bundleDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java index 29e5a08d7c..d76c4798f1 100644 --- a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java @@ -21,7 +21,7 @@ import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; @@ -61,7 +61,7 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i /** * log4j category */ - private static final Logger log = Logger.getLogger(CollectionServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionServiceImpl.class); @Autowired(required = true) protected CollectionDAO collectionDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/Community.java b/dspace-api/src/main/java/org/dspace/content/Community.java index 05eb8a3955..abd5f11852 100644 --- a/dspace-api/src/main/java/org/dspace/content/Community.java +++ b/dspace-api/src/main/java/org/dspace/content/Community.java @@ -24,7 +24,7 @@ import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.comparator.NameAscendingComparator; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CommunityService; @@ -52,7 +52,7 @@ public class Community extends DSpaceObject implements DSpaceObjectLegacySupport /** * log4j category */ - private static final Logger log = Logger.getLogger(Community.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Community.class); @Column(name = "community_id", insertable = false, updatable = false) private Integer legacyId; diff --git a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java index 7e8d890198..ac939434a5 100644 --- a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java @@ -18,7 +18,7 @@ import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; @@ -51,7 +51,7 @@ public class CommunityServiceImpl extends DSpaceObjectServiceImpl imp /** * log4j category */ - private static Logger log = Logger.getLogger(CommunityServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CommunityServiceImpl.class); @Autowired(required = true) protected CommunityDAO communityDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/DCDate.java b/dspace-api/src/main/java/org/dspace/content/DCDate.java index 729b1d3753..4acccb2d84 100644 --- a/dspace-api/src/main/java/org/dspace/content/DCDate.java +++ b/dspace-api/src/main/java/org/dspace/content/DCDate.java @@ -18,7 +18,7 @@ import java.util.Locale; import java.util.Map; import java.util.TimeZone; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; // FIXME: Not very robust - assumes dates will always be valid @@ -45,7 +45,7 @@ public class DCDate { /** * Logger */ - private static Logger log = Logger.getLogger(DCDate.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DCDate.class); // UTC timezone private static final TimeZone utcZone = TimeZone.getTimeZone("UTC"); diff --git a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java index c56513aa93..ddd9a6371d 100644 --- a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java @@ -19,7 +19,7 @@ import java.util.StringTokenizer; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.authority.Choices; import org.dspace.content.authority.service.ChoiceAuthorityService; @@ -48,7 +48,7 @@ public abstract class DSpaceObjectServiceImpl implements /** * log4j category */ - private static final Logger log = Logger.getLogger(DSpaceObjectServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceObjectServiceImpl.class); @Autowired(required = true) protected ChoiceAuthorityService choiceAuthorityService; diff --git a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java index 11287e4622..d65f8d4240 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java @@ -18,7 +18,7 @@ import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; @@ -63,7 +63,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It /** * log4j category */ - private static final Logger log = Logger.getLogger(Item.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Item.class); @Autowired(required = true) protected ItemDAO itemDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataFieldServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/MetadataFieldServiceImpl.java index c48ff015e4..e3ed9c8ae7 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataFieldServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataFieldServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.MetadataFieldDAO; @@ -33,7 +33,7 @@ public class MetadataFieldServiceImpl implements MetadataFieldService { /** * log4j logger */ - private static Logger log = Logger.getLogger(MetadataFieldServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataFieldServiceImpl.class); @Autowired(required = true) protected MetadataFieldDAO metadataFieldDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataSchemaServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/MetadataSchemaServiceImpl.java index f2b13fb8ea..185addfb01 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataSchemaServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataSchemaServiceImpl.java @@ -10,7 +10,7 @@ package org.dspace.content; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.MetadataSchemaDAO; @@ -31,7 +31,7 @@ public class MetadataSchemaServiceImpl implements MetadataSchemaService { /** * log4j logger */ - private static Logger log = Logger.getLogger(MetadataSchemaServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataSchemaServiceImpl.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java index 396265467b..e7b00ab85c 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.MetadataValueDAO; @@ -33,7 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class MetadataValueServiceImpl implements MetadataValueService { - private static final Logger log = Logger.getLogger(MetadataValueServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataValueServiceImpl.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java index d378ecdb27..93357d1712 100644 --- a/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInputsReaderException; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; @@ -40,7 +40,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class WorkspaceItemServiceImpl implements WorkspaceItemService { - private static final Logger log = Logger.getLogger(WorkspaceItemServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkspaceItemServiceImpl.class); @Autowired(required = true) protected WorkspaceItemDAO workspaceItemDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java index 94d5696f5e..c6fe528fdb 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; import org.dspace.app.util.DCInputsReader; @@ -49,7 +49,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @see ChoiceAuthority */ public final class ChoiceAuthorityServiceImpl implements ChoiceAuthorityService { - private Logger log = Logger.getLogger(ChoiceAuthorityServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(ChoiceAuthorityServiceImpl.class); // map of field key to authority plugin protected Map controller = new HashMap(); diff --git a/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java index 207595cfb0..a64ebdd971 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java @@ -13,7 +13,7 @@ import java.util.Iterator; import java.util.List; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; import org.dspace.content.Collection; @@ -42,7 +42,7 @@ import org.dspace.core.SelfNamedPlugin; * fields. */ public class DCInputAuthority extends SelfNamedPlugin implements ChoiceAuthority { - private static Logger log = Logger.getLogger(DCInputAuthority.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DCInputAuthority.class); private String values[] = null; private String labels[] = null; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java b/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java index 21eb3f158d..516b9a06ae 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java @@ -18,7 +18,7 @@ import javax.xml.xpath.XPathFactory; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.core.SelfNamedPlugin; import org.dspace.services.ConfigurationService; @@ -56,7 +56,7 @@ import org.xml.sax.InputSource; public class DSpaceControlledVocabulary extends SelfNamedPlugin implements ChoiceAuthority { - private static Logger log = Logger.getLogger(DSpaceControlledVocabulary.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceControlledVocabulary.class); protected static String xpathTemplate = "//node[contains(translate(@label,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'," + "'abcdefghijklmnopqrstuvwxyz'),'%s')]"; protected static String idTemplate = "//node[@id = '%s']"; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java index 889bc89ecb..08cd5d892e 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; import org.dspace.content.Collection; @@ -32,7 +32,7 @@ import org.dspace.content.Collection; */ public class InputFormSelfRegisterWrapperAuthority implements ChoiceAuthority { - private static Logger log = Logger.getLogger(InputFormSelfRegisterWrapperAuthority.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(InputFormSelfRegisterWrapperAuthority.class); private Map delegates = new HashMap(); diff --git a/dspace-api/src/main/java/org/dspace/content/authority/LCNameAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/LCNameAuthority.java index 77da8400ea..66bb7f1832 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/LCNameAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/LCNameAuthority.java @@ -22,7 +22,7 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DCPersonName; import org.dspace.core.ConfigurationManager; @@ -57,7 +57,7 @@ import org.xml.sax.helpers.DefaultHandler; * @version $Revision $ */ public class LCNameAuthority implements ChoiceAuthority { - private static final Logger log = Logger.getLogger(LCNameAuthority.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(LCNameAuthority.class); // get these from configuration protected static String url = null; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java index dc9797598f..6a5b17a029 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; import org.dspace.app.util.DCInputsReader; @@ -57,7 +57,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @see Choices */ public class MetadataAuthorityServiceImpl implements MetadataAuthorityService { - private static Logger log = Logger.getLogger(MetadataAuthorityServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataAuthorityServiceImpl.class); @Autowired(required = true) protected MetadataFieldService metadataFieldService; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/SHERPARoMEOProtocol.java b/dspace-api/src/main/java/org/dspace/content/authority/SHERPARoMEOProtocol.java index 5bc94bf06a..5f0af29760 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/SHERPARoMEOProtocol.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/SHERPARoMEOProtocol.java @@ -19,7 +19,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.core.ConfigurationManager; import org.xml.sax.Attributes; @@ -50,7 +50,7 @@ import org.xml.sax.helpers.DefaultHandler; * @see SHERPARoMEOJournalTitle */ public abstract class SHERPARoMEOProtocol implements ChoiceAuthority { - private static final Logger log = Logger.getLogger(SHERPARoMEOProtocol.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SHERPARoMEOProtocol.class); // contact URL from configuration private static String url = null; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java index b508c908e7..159f2901d0 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; @@ -36,10 +36,12 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class SolrAuthority implements ChoiceAuthority { - private static final Logger log = Logger.getLogger(SolrAuthority.class); protected SolrAuthorityInterface source = DSpaceServicesFactory.getInstance().getServiceManager() .getServiceByName("AuthoritySource", SolrAuthorityInterface.class); + + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrAuthority.class); + protected boolean externalResults = false; protected final AuthorityValueService authorityValueService = AuthorityServiceFactory.getInstance() .getAuthorityValueService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/AIPTechMDCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/AIPTechMDCrosswalk.java index 3f109d9a1e..d7ee2630e9 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/AIPTechMDCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/AIPTechMDCrosswalk.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -72,7 +72,7 @@ public class AIPTechMDCrosswalk implements IngestionCrosswalk, DisseminationCros /** * log4j category */ - private static Logger log = Logger.getLogger(AIPTechMDCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AIPTechMDCrosswalk.class); protected final BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() .getBitstreamFormatService(); protected final SiteService siteService = ContentServiceFactory.getInstance().getSiteService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java index d530f55905..fac15d99e7 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.OutputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.DSpaceObject; @@ -35,7 +35,7 @@ public class CreativeCommonsRDFStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(CreativeCommonsRDFStreamDisseminationCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsRDFStreamDisseminationCrosswalk.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); protected CreativeCommonsService creativeCommonsService = LicenseServiceFactory.getInstance() .getCreativeCommonsService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java index d011202921..55634df647 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -38,7 +38,7 @@ public class CreativeCommonsRDFStreamIngestionCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(CreativeCommonsRDFStreamIngestionCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsRDFStreamIngestionCrosswalk.class); protected CreativeCommonsService creativeCommonsService = LicenseServiceFactory.getInstance() .getCreativeCommonsService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java index bf6d97fbea..2da3876b06 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.OutputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.DSpaceObject; @@ -42,7 +42,7 @@ public class CreativeCommonsTextStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(CreativeCommonsTextStreamDisseminationCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsTextStreamDisseminationCrosswalk.class); @Override public boolean canDisseminate(Context context, DSpaceObject dso) { diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java index da10a212ec..911f2b91bb 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.OutputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.DSpaceObject; @@ -34,7 +34,7 @@ public class LicenseStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(LicenseStreamDisseminationCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseStreamDisseminationCrosswalk.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); @Override diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamIngestionCrosswalk.java index fb3653b4db..a7dcae944c 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamIngestionCrosswalk.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -39,7 +39,7 @@ public class LicenseStreamIngestionCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(LicenseStreamIngestionCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseStreamIngestionCrosswalk.class); @Override public void ingest(Context context, DSpaceObject dso, InputStream in, String MIMEType) diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java index 2b03a38422..559d463be2 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java @@ -19,7 +19,7 @@ import java.util.Map; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.factory.AuthorizeServiceFactory; @@ -61,7 +61,7 @@ public class METSRightsCrosswalk /** * log4j category */ - private static Logger log = Logger.getLogger(METSRightsCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(METSRightsCrosswalk.class); private static final Namespace METSRights_NS = Namespace.getNamespace("rights", "http://cosimo.stanford.edu/sdr/metsrights/"); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java index 567f6e41f8..ddf773dcec 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java @@ -21,7 +21,7 @@ import java.util.Map; import java.util.Properties; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -90,7 +90,7 @@ public class MODSDisseminationCrosswalk extends SelfNamedPlugin /** * log4j category */ - private static Logger log = Logger.getLogger(MODSDisseminationCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MODSDisseminationCrosswalk.class); private static final String CONFIG_PREFIX = "crosswalk.mods.properties."; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/NullIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/NullIngestionCrosswalk.java index f5cffdba15..994e15601d 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/NullIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/NullIngestionCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; @@ -43,7 +43,7 @@ public class NullIngestionCrosswalk /** * log4j category */ - private static Logger log = Logger.getLogger(NullIngestionCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(NullIngestionCrosswalk.class); private static XMLOutputter outputPretty = new XMLOutputter(Format.getPrettyFormat()); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java index 98a54ff624..6d7c716189 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java @@ -20,7 +20,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -54,7 +54,7 @@ public class OREIngestionCrosswalk /** * log4j category */ - private static Logger log = Logger.getLogger(OREDisseminationCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(OREDisseminationCrosswalk.class); /* Namespaces */ public static final Namespace ATOM_NS = diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java index 360a450696..9f927244c9 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java @@ -15,7 +15,7 @@ import java.util.List; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -48,7 +48,7 @@ public class PREMISCrosswalk /** * log4j category */ - private static Logger log = Logger.getLogger(PREMISCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PREMISCrosswalk.class); private static final Namespace PREMIS_NS = Namespace.getNamespace("premis", "http://www.loc.gov/standards/premis"); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java index 457c6486f2..630d1d45ef 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java @@ -20,7 +20,7 @@ import java.util.Map; import java.util.Properties; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -97,7 +97,7 @@ public class QDCCrosswalk extends SelfNamedPlugin /** * log4j category */ - private static Logger log = Logger.getLogger(QDCCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(QDCCrosswalk.class); // map of qdc to JDOM Element private Map qdc2element = new HashMap(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java index c16a78f376..8826fb1ce3 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java index 8565b39c44..3a5122b2de 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java @@ -16,7 +16,7 @@ import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -55,7 +55,7 @@ public class XSLTIngestionCrosswalk /** * log4j category */ - private static final Logger log = Logger.getLogger(XSLTIngestionCrosswalk.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(XSLTIngestionCrosswalk.class); private static final String DIRECTION = "submission"; diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index 67644ee7b4..025dab66e4 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -16,7 +16,7 @@ import java.util.UUID; import javax.persistence.Query; import javax.persistence.TemporalType; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.MetadataField; @@ -42,7 +42,7 @@ import org.hibernate.type.StandardBasicTypes; * @author kevinvandevelde at atmire.com */ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDAO { - private static final Logger log = Logger.getLogger(ItemDAOImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemDAOImpl.class); protected ItemDAOImpl() { super(); diff --git a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java index 77de1ef12e..e8e4e974b4 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java @@ -53,6 +53,7 @@ import edu.harvard.hul.ois.mets.helper.MetsException; import edu.harvard.hul.ois.mets.helper.MetsValidator; import edu.harvard.hul.ois.mets.helper.MetsWriter; import edu.harvard.hul.ois.mets.helper.PreformedXML; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; @@ -125,7 +126,8 @@ public abstract class AbstractMETSDisseminator /** * log4j category */ - private static final Logger log = LoggerFactory.getLogger(AbstractMETSDisseminator.class); + + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractMETSDisseminator.class); // JDOM xml output writer - indented format for readability. protected static XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); diff --git a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSIngester.java b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSIngester.java index 5ecaa5c09c..9cf6a7ca9f 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSIngester.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSIngester.java @@ -20,7 +20,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -109,7 +109,7 @@ public abstract class AbstractMETSIngester extends AbstractPackageIngester { /** * log4j category */ - private static Logger log = Logger.getLogger(AbstractMETSIngester.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractMETSIngester.class); protected final BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); protected final BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() diff --git a/dspace-api/src/main/java/org/dspace/content/packager/AbstractPackageIngester.java b/dspace-api/src/main/java/org/dspace/content/packager/AbstractPackageIngester.java index a9e8b9a509..da58f1cf0b 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/AbstractPackageIngester.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/AbstractPackageIngester.java @@ -16,7 +16,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; @@ -59,7 +59,7 @@ public abstract class AbstractPackageIngester /** * log4j category */ - private static Logger log = Logger.getLogger(AbstractPackageIngester.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractPackageIngester.class); protected final CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected final ItemService itemService = ContentServiceFactory.getInstance().getItemService(); diff --git a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java index 9544f66727..887520ad66 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java @@ -29,7 +29,7 @@ import edu.harvard.hul.ois.mets.helper.MetsException; import edu.harvard.hul.ois.mets.helper.PCData; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bundle; @@ -82,7 +82,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @see AbstractPackageDisseminator */ public class DSpaceAIPDisseminator extends AbstractMETSDisseminator { - private static final Logger log = Logger.getLogger(DSpaceAIPDisseminator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceAIPDisseminator.class); /** * Unique identifier for the profile of the METS document. diff --git a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPIngester.java b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPIngester.java index e23ab5f0b4..954a68bfc1 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPIngester.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPIngester.java @@ -10,7 +10,7 @@ package org.dspace.content.packager; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Collection; @@ -64,7 +64,7 @@ public class DSpaceAIPIngester /** * log4j category */ - private static Logger log = Logger.getLogger(DSpaceAIPIngester.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceAIPIngester.class); /** * Ensure it's an AIP generated by the complementary AIP disseminator. diff --git a/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java b/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java index d9d860d04e..53a8678df2 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java @@ -18,7 +18,7 @@ import java.util.Iterator; import java.util.List; import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -117,7 +117,7 @@ public class METSManifest { /** * log4j category */ - private static final Logger log = Logger.getLogger(METSManifest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(METSManifest.class); /** * Canonical filename of METS manifest within a package or as a bitstream. diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java b/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java index 6aa995d063..d80efb06e4 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java @@ -17,7 +17,7 @@ import java.util.Calendar; import java.util.List; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.pdfbox.cos.COSDocument; import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.io.RandomAccessBufferedFileInputStream; @@ -73,7 +73,7 @@ public class PDFPackager /** * log4j category */ - private static final Logger log = Logger.getLogger(PDFPackager.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PDFPackager.class); protected static final String BITSTREAM_FORMAT_NAME = "Adobe PDF"; diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java b/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java index 3da64df783..58f2621afb 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java @@ -10,7 +10,7 @@ package org.dspace.content.packager; import java.io.PrintWriter; import java.io.StringWriter; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * This is a superclass for exceptions representing a failure when diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PackageUtils.java b/dspace-api/src/main/java/org/dspace/content/packager/PackageUtils.java index 045f7963d0..2f4074063c 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PackageUtils.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PackageUtils.java @@ -21,7 +21,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -65,7 +65,7 @@ public class PackageUtils { /** * log4j category */ - private static final Logger log = Logger.getLogger(PackageUtils.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PackageUtils.class); // Map of metadata elements for Communities and Collections // Format is alternating key/value in a straight array; use this diff --git a/dspace-api/src/main/java/org/dspace/content/packager/RoleDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/RoleDisseminator.java index 5fc538e086..75bc512996 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/RoleDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/RoleDisseminator.java @@ -21,7 +21,7 @@ import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -47,7 +47,7 @@ public class RoleDisseminator implements PackageDisseminator { /** * log4j category */ - private static final Logger log = Logger.getLogger(RoleDisseminator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RoleDisseminator.class); /** * DSpace Roles XML Namespace in JDOM form. diff --git a/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java b/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java index 5e2b30f36d..8f2e92e2f0 100644 --- a/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java +++ b/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java @@ -12,7 +12,7 @@ import java.util.Properties; import org.apache.commons.configuration2.Configuration; import org.apache.commons.configuration2.ConfigurationConverter; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.services.factory.DSpaceServicesFactory; /** @@ -36,7 +36,7 @@ public class ConfigurationManager { /** * log4j category */ - private static final Logger log = Logger.getLogger(ConfigurationManager.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ConfigurationManager.class); protected ConfigurationManager() { diff --git a/dspace-api/src/main/java/org/dspace/core/Context.java b/dspace-api/src/main/java/org/dspace/core/Context.java index fac882c715..1771473c62 100644 --- a/dspace-api/src/main/java/org/dspace/core/Context.java +++ b/dspace-api/src/main/java/org/dspace/core/Context.java @@ -18,7 +18,7 @@ import java.util.Stack; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.ResourcePolicy; import org.dspace.content.DSpaceObject; import org.dspace.eperson.EPerson; @@ -50,7 +50,7 @@ import org.springframework.util.CollectionUtils; * @version $Revision$ */ public class Context implements AutoCloseable { - private static final Logger log = Logger.getLogger(Context.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Context.class); protected static final AtomicBoolean databaseUpdated = new AtomicBoolean(false); /** diff --git a/dspace-api/src/main/java/org/dspace/core/Email.java b/dspace-api/src/main/java/org/dspace/core/Email.java index 0ce631e6b8..aed7fc8a2d 100644 --- a/dspace-api/src/main/java/org/dspace/core/Email.java +++ b/dspace-api/src/main/java/org/dspace/core/Email.java @@ -37,7 +37,7 @@ import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; @@ -139,7 +139,7 @@ public class Email { */ private String charset; - private static final Logger log = Logger.getLogger(Email.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Email.class); /** * Create a new email message. diff --git a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java index 0794ec2493..37e48c4a4f 100644 --- a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java +++ b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java @@ -16,7 +16,7 @@ import java.util.ResourceBundle; import java.util.StringTokenizer; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.eperson.EPerson; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; @@ -35,7 +35,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class I18nUtil { - private static final Logger log = Logger.getLogger(I18nUtil.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(I18nUtil.class); // the default Locale of this DSpace Instance public static final Locale DEFAULTLOCALE = getDefaultLocale(); diff --git a/dspace-api/src/main/java/org/dspace/core/LegacyPluginServiceImpl.java b/dspace-api/src/main/java/org/dspace/core/LegacyPluginServiceImpl.java index 477143a04a..366de8314b 100644 --- a/dspace-api/src/main/java/org/dspace/core/LegacyPluginServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/core/LegacyPluginServiceImpl.java @@ -18,7 +18,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.service.PluginService; import org.dspace.services.ConfigurationService; import org.springframework.beans.factory.annotation.Autowired; @@ -70,7 +70,7 @@ public class LegacyPluginServiceImpl implements PluginService { /** * log4j category */ - private static Logger log = Logger.getLogger(LegacyPluginServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LegacyPluginServiceImpl.class); /** * Prefixes of names of properties to look for in DSpace Configuration diff --git a/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java index 47875d345a..1af1a702fb 100644 --- a/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java @@ -15,9 +15,9 @@ import java.net.MalformedURLException; import java.util.Enumeration; import java.util.Properties; -import org.apache.log4j.Logger; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.xml.DOMConfigurator; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.PropertyConfigurator; +import org.apache.logging.log4j.xml.DOMConfigurator; import org.dspace.services.ConfigurationService; import org.dspace.services.KernelStartupCallbackService; import org.dspace.services.factory.DSpaceServicesFactory; @@ -31,7 +31,7 @@ public class LoggerServiceImpl implements KernelStartupCallbackService { /** * log4j category */ - private static Logger log = Logger.getLogger(LoggerServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerServiceImpl.class); // System property which will disable DSpace's log4j setup private final String LOG_DISABLE_PROPERTY = "dspace.log.init.disable"; @@ -163,16 +163,16 @@ public class LoggerServiceImpl implements KernelStartupCallbackService { * Based on samples here: http://wiki.apache.org/logging-log4j/UsefulCode */ private boolean isLog4jConfigured() { - Enumeration appenders = org.apache.log4j.LogManager.getRootLogger() + Enumeration appenders = org.apache.logging.log4j.LogManager.getRootLogger() .getAllAppenders(); - if (!(appenders instanceof org.apache.log4j.helpers.NullEnumeration)) { + if (!(appenders instanceof org.apache.logging.log4j.helpers.NullEnumeration)) { return true; } else { - Enumeration loggers = org.apache.log4j.LogManager.getCurrentLoggers(); + Enumeration loggers = org.apache.logging.log4j.LogManager.getCurrentLoggers(); while (loggers.hasMoreElements()) { Logger c = (Logger) loggers.nextElement(); - if (!(c.getAllAppenders() instanceof org.apache.log4j.helpers.NullEnumeration)) { + if (!(c.getAllAppenders() instanceof org.apache.logging.log4j.helpers.NullEnumeration)) { return true; } } diff --git a/dspace-api/src/main/java/org/dspace/core/Utils.java b/dspace-api/src/main/java/org/dspace/core/Utils.java index a7e59a2e46..32c32776f7 100644 --- a/dspace-api/src/main/java/org/dspace/core/Utils.java +++ b/dspace-api/src/main/java/org/dspace/core/Utils.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; import com.coverity.security.Escape; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Utility functions for DSpace. @@ -42,7 +42,7 @@ public final class Utils { /** * log4j logger */ - private static Logger log = Logger.getLogger(Utils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Utils.class); private static final Pattern DURATION_PATTERN = Pattern .compile("(\\d+)([smhdwy])"); diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/AbstractTranslator.java b/dspace-api/src/main/java/org/dspace/ctask/general/AbstractTranslator.java index 6cc4e59204..67e882a558 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/AbstractTranslator.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/AbstractTranslator.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.content.MetadataValue; @@ -40,7 +40,7 @@ public abstract class AbstractTranslator extends AbstractCurationTask { protected String apiKey = ""; - private static Logger log = Logger.getLogger(AbstractTranslator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractTranslator.class); protected List results = new ArrayList(); diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/BasicLinkChecker.java b/dspace-api/src/main/java/org/dspace/ctask/general/BasicLinkChecker.java index dc59292afe..fbc6eebdb5 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/BasicLinkChecker.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/BasicLinkChecker.java @@ -13,7 +13,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.content.MetadataValue; @@ -40,7 +40,7 @@ public class BasicLinkChecker extends AbstractCurationTask { private List results = null; // The log4j logger for this class - private static Logger log = Logger.getLogger(BasicLinkChecker.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicLinkChecker.class); /** diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/BitstreamsIntoMetadata.java b/dspace-api/src/main/java/org/dspace/ctask/general/BitstreamsIntoMetadata.java index 79da1eff90..d7ba7fed1f 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/BitstreamsIntoMetadata.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/BitstreamsIntoMetadata.java @@ -10,7 +10,7 @@ package org.dspace.ctask.general; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -33,7 +33,7 @@ public class BitstreamsIntoMetadata extends AbstractCurationTask { protected List results = null; // The log4j logger for this class - private static Logger log = Logger.getLogger(BitstreamsIntoMetadata.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamsIntoMetadata.class); /** diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/MetadataWebService.java b/dspace-api/src/main/java/org/dspace/ctask/general/MetadataWebService.java index 9b49105c36..2b6c52d0d6 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/MetadataWebService.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/MetadataWebService.java @@ -33,7 +33,7 @@ import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -130,7 +130,7 @@ public class MetadataWebService extends AbstractCurationTask implements Namespac /** * log4j category */ - private static final Logger log = Logger.getLogger(MetadataWebService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataWebService.class); // transform token parsing pattern protected Pattern ttPattern = Pattern.compile("\'([^\']*)\'|(\\S+)"); // URL of web service with template parameters diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/MicrosoftTranslator.java b/dspace-api/src/main/java/org/dspace/ctask/general/MicrosoftTranslator.java index 88700be299..43f61d13f8 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/MicrosoftTranslator.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/MicrosoftTranslator.java @@ -16,7 +16,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; /** @@ -36,7 +36,7 @@ public class MicrosoftTranslator extends AbstractTranslator { protected final String baseUrl = "http://api.microsofttranslator.com/V2/Http.svc/Translate"; - private static final Logger log = Logger.getLogger(MicrosoftTranslator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MicrosoftTranslator.class); @Override diff --git a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java index 16ad1e490f..2fa1291979 100644 --- a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java +++ b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java @@ -13,7 +13,7 @@ import java.util.Iterator; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -40,7 +40,7 @@ public abstract class AbstractCurationTask implements CurationTask { // curator-assigned taskId protected String taskId = null; // logger - private static Logger log = Logger.getLogger(AbstractCurationTask.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractCurationTask.class); protected CommunityService communityService; protected ItemService itemService; protected HandleService handleService; diff --git a/dspace-api/src/main/java/org/dspace/curate/CitationPage.java b/dspace-api/src/main/java/org/dspace/curate/CitationPage.java index 8634eeb5bb..386bf0ba92 100644 --- a/dspace-api/src/main/java/org/dspace/curate/CitationPage.java +++ b/dspace-api/src/main/java/org/dspace/curate/CitationPage.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.tuple.Pair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -46,7 +46,7 @@ public class CitationPage extends AbstractCurationTask { /** * Class Logger */ - private static Logger log = Logger.getLogger(CitationPage.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CitationPage.class); protected int status = Curator.CURATE_UNSET; protected String result = null; diff --git a/dspace-api/src/main/java/org/dspace/curate/Curator.java b/dspace-api/src/main/java/org/dspace/curate/Curator.java index 55d9843cb3..e513a91003 100644 --- a/dspace-api/src/main/java/org/dspace/curate/Curator.java +++ b/dspace-api/src/main/java/org/dspace/curate/Curator.java @@ -15,7 +15,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -78,7 +78,7 @@ public class Curator { ; - private static final Logger log = Logger.getLogger(Curator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Curator.class); protected static final ThreadLocal curationCtx = new ThreadLocal<>(); diff --git a/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java b/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java index fc665bcf2c..979ade99a5 100644 --- a/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java +++ b/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java @@ -19,7 +19,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.services.factory.DSpaceServicesFactory; @@ -30,7 +30,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @author richardrodgers */ public class FileTaskQueue implements TaskQueue { - private static Logger log = Logger.getLogger(TaskQueue.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TaskQueue.class); // base directory for curation task queues protected String tqDir; diff --git a/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java b/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java index 706992093b..a9a8e8906a 100644 --- a/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java +++ b/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java @@ -20,7 +20,7 @@ import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.factory.CoreServiceFactory; import org.dspace.services.factory.DSpaceServicesFactory; @@ -64,7 +64,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; public class TaskResolver { // logging service - private static Logger log = Logger.getLogger(TaskResolver.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TaskResolver.class); // base directory of task scripts & catalog name protected static final String CATALOG = "task.catalog"; diff --git a/dspace-api/src/main/java/org/dspace/curate/WorkflowCuratorServiceImpl.java b/dspace-api/src/main/java/org/dspace/curate/WorkflowCuratorServiceImpl.java index 580f8c42c3..5cecc13b89 100644 --- a/dspace-api/src/main/java/org/dspace/curate/WorkflowCuratorServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/curate/WorkflowCuratorServiceImpl.java @@ -23,7 +23,7 @@ import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Item; @@ -58,7 +58,7 @@ public class WorkflowCuratorServiceImpl implements WorkflowCuratorService { /** * log4j logger */ - private Logger log = Logger.getLogger(WorkflowCuratorServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkflowCuratorServiceImpl.class); protected Map tsMap = new HashMap(); diff --git a/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java b/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java index 933ba459cb..78872a8bc7 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java +++ b/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java @@ -27,7 +27,7 @@ import com.google.common.collect.Iterables; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.Charsets; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.common.util.ContentStreamBase; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; @@ -42,7 +42,7 @@ import org.dspace.core.Context; * Construct a ContentStream from a File */ public class FullTextContentStreams extends ContentStreamBase { - private static final Logger log = Logger.getLogger(FullTextContentStreams.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(FullTextContentStreams.class); public static final String FULLTEXT_BUNDLE = "TEXT"; diff --git a/dspace-api/src/main/java/org/dspace/discovery/IndexClient.java b/dspace-api/src/main/java/org/dspace/discovery/IndexClient.java index 7aaf63fe2d..1381e4dda2 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/IndexClient.java +++ b/dspace-api/src/main/java/org/dspace/discovery/IndexClient.java @@ -16,7 +16,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -37,7 +37,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class IndexClient { - private static final Logger log = Logger.getLogger(IndexClient.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(IndexClient.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/discovery/IndexEventConsumer.java b/dspace-api/src/main/java/org/dspace/discovery/IndexEventConsumer.java index d8ec35806e..9117dd7ad2 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/IndexEventConsumer.java +++ b/dspace-api/src/main/java/org/dspace/discovery/IndexEventConsumer.java @@ -10,7 +10,7 @@ package org.dspace.discovery; import java.util.HashSet; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bundle; import org.dspace.content.DSpaceObject; import org.dspace.core.Constants; @@ -30,7 +30,7 @@ public class IndexEventConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(IndexEventConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IndexEventConsumer.class); // collect Items, Collections, Communities that need indexing private Set objectsToUpdate = null; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java index f7c5738e65..9a19bf0646 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java @@ -47,7 +47,7 @@ import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrRequest; import org.apache.solr.client.solrj.SolrServer; @@ -134,7 +134,7 @@ import org.springframework.stereotype.Service; @Service public class SolrServiceImpl implements SearchService, IndexingService { - private static final Logger log = Logger.getLogger(SolrServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrServiceImpl.class); protected static final String LAST_INDEXED_FIELD = "SolrIndexer.lastIndexed"; protected static final String HANDLE_FIELD = "handle"; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java index 44af866892..83b9c14c5f 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.common.SolrInputDocument; import org.dspace.browse.BrowseException; import org.dspace.browse.BrowseIndex; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java index 4bea98390d..8ba43ef417 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.List; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.common.SolrInputDocument; import org.dspace.authorize.ResourcePolicy; @@ -39,7 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SolrServiceResourceRestrictionPlugin implements SolrServiceIndexPlugin, SolrServiceSearchPlugin { - private static final Logger log = Logger.getLogger(SolrServiceResourceRestrictionPlugin.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrServiceResourceRestrictionPlugin.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java b/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java index 6d34af3502..60081d1153 100644 --- a/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java @@ -22,7 +22,7 @@ import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; @@ -59,7 +59,7 @@ public class CitationDocumentServiceImpl implements CitationDocumentService, Ini /** * Class Logger */ - private static Logger log = Logger.getLogger(CitationDocumentServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CitationDocumentServiceImpl.class); /** * A set of MIME types that can have a citation page added to them. That is, diff --git a/dspace-api/src/main/java/org/dspace/embargo/EmbargoCLITool.java b/dspace-api/src/main/java/org/dspace/embargo/EmbargoCLITool.java index c0ee6ad720..49d2650bfd 100644 --- a/dspace-api/src/main/java/org/dspace/embargo/EmbargoCLITool.java +++ b/dspace-api/src/main/java/org/dspace/embargo/EmbargoCLITool.java @@ -16,7 +16,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DCDate; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -37,7 +37,7 @@ public class EmbargoCLITool { /** * log4j category */ - private static final Logger log = Logger.getLogger(EmbargoServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(EmbargoServiceImpl.class); private static final EmbargoService embargoService = EmbargoServiceFactory.getInstance().getEmbargoService(); diff --git a/dspace-api/src/main/java/org/dspace/embargo/EmbargoServiceImpl.java b/dspace-api/src/main/java/org/dspace/embargo/EmbargoServiceImpl.java index 68efce46e1..69c601034a 100644 --- a/dspace-api/src/main/java/org/dspace/embargo/EmbargoServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/embargo/EmbargoServiceImpl.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DCDate; import org.dspace.content.Item; @@ -51,7 +51,7 @@ public class EmbargoServiceImpl implements EmbargoService { /** * log4j category */ - private final Logger log = Logger.getLogger(EmbargoServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(EmbargoServiceImpl.class); // Metadata field components for user-supplied embargo terms // set from the DSpace configuration by init() diff --git a/dspace-api/src/main/java/org/dspace/eperson/AccountServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/AccountServiceImpl.java index 6b9531788a..0e1034328a 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/AccountServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/AccountServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Locale; import javax.mail.MessagingException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; @@ -42,7 +42,7 @@ public class AccountServiceImpl implements AccountService { /** * log4j log */ - private static Logger log = Logger.getLogger(AccountServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AccountServiceImpl.class); @Autowired(required = true) protected EPersonService ePersonService; @Autowired(required = true) diff --git a/dspace-api/src/main/java/org/dspace/eperson/EPersonConsumer.java b/dspace-api/src/main/java/org/dspace/eperson/EPersonConsumer.java index 62761444a5..4f094bb5c5 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/EPersonConsumer.java +++ b/dspace-api/src/main/java/org/dspace/eperson/EPersonConsumer.java @@ -11,7 +11,7 @@ import java.util.Date; import java.util.UUID; import javax.mail.MessagingException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Constants; import org.dspace.core.Context; @@ -35,7 +35,7 @@ public class EPersonConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(EPersonConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(EPersonConsumer.class); protected EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); diff --git a/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java index a76d9c5ad9..f173250cf3 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java @@ -19,7 +19,7 @@ import java.util.UUID; import org.apache.commons.codec.DecoderException; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.DSpaceObjectServiceImpl; @@ -50,7 +50,7 @@ public class EPersonServiceImpl extends DSpaceObjectServiceImpl impleme /** * log4j logger */ - private final Logger log = Logger.getLogger(EPersonServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(EPersonServiceImpl.class); @Autowired(required = true) protected EPersonDAO ePersonDAO; diff --git a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java index f9b0ae014c..c02e655387 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java +++ b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java @@ -26,8 +26,8 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DCDate; import org.dspace.content.Item; @@ -55,7 +55,7 @@ import org.dspace.search.HarvestedItemInfo; */ public class SubscribeCLITool { - private static final Logger log = Logger.getLogger(SubscribeCLITool.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubscribeCLITool.class); private static HandleService handleService = HandleServiceFactory.getInstance().getHandleService(); private static ItemService itemService = ContentServiceFactory.getInstance().getItemService(); diff --git a/dspace-api/src/main/java/org/dspace/eperson/SubscribeServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/SubscribeServiceImpl.java index cd9e078463..34dbcdbeaa 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/SubscribeServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/SubscribeServiceImpl.java @@ -10,7 +10,7 @@ package org.dspace.eperson; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.Collection; @@ -32,7 +32,7 @@ public class SubscribeServiceImpl implements SubscribeService { /** * log4j logger */ - private Logger log = Logger.getLogger(SubscribeServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(SubscribeServiceImpl.class); @Autowired(required = true) protected SubscriptionDAO subscriptionDAO; diff --git a/dspace-api/src/main/java/org/dspace/event/BasicDispatcher.java b/dspace-api/src/main/java/org/dspace/event/BasicDispatcher.java index 63b2dab1a9..543ad934b3 100644 --- a/dspace-api/src/main/java/org/dspace/event/BasicDispatcher.java +++ b/dspace-api/src/main/java/org/dspace/event/BasicDispatcher.java @@ -9,7 +9,7 @@ package org.dspace.event; import java.util.Iterator; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.Utils; @@ -29,7 +29,7 @@ public class BasicDispatcher extends Dispatcher { /** * log4j category */ - private static Logger log = Logger.getLogger(BasicDispatcher.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicDispatcher.class); @Override public void addConsumerProfile(ConsumerProfile cp) diff --git a/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java b/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java index f43cc370f1..01f0d4fc56 100644 --- a/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java +++ b/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java @@ -10,7 +10,7 @@ package org.dspace.event; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; /** @@ -25,7 +25,7 @@ public class ConsumerProfile { /** * log4j category */ - private static Logger log = Logger.getLogger(ConsumerProfile.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ConsumerProfile.class); /** * Name matching the key in DSpace Configuration diff --git a/dspace-api/src/main/java/org/dspace/event/Event.java b/dspace-api/src/main/java/org/dspace/event/Event.java index 78efff480f..45b6407b28 100644 --- a/dspace-api/src/main/java/org/dspace/event/Event.java +++ b/dspace-api/src/main/java/org/dspace/event/Event.java @@ -17,7 +17,7 @@ import java.util.Map; import java.util.UUID; import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.core.Constants; @@ -224,7 +224,7 @@ public class Event implements Serializable { /** * log4j category */ - private static Logger log = Logger.getLogger(Event.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Event.class); /** * Constructor. diff --git a/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java b/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java index 70765430a3..1afc0a22f5 100644 --- a/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java @@ -22,7 +22,7 @@ import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.impl.DefaultPooledObject; import org.apache.commons.pool2.impl.GenericKeyedObjectPool; import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.event.service.EventService; import org.dspace.services.ConfigurationService; @@ -39,7 +39,7 @@ public class EventServiceImpl implements EventService { /** * log4j category */ - private Logger log = Logger.getLogger(EventServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(EventServiceImpl.class); protected DispatcherPoolFactory dispatcherFactory = null; diff --git a/dspace-api/src/main/java/org/dspace/event/TestConsumer.java b/dspace-api/src/main/java/org/dspace/event/TestConsumer.java index 379276ccda..e40c0d9a36 100644 --- a/dspace-api/src/main/java/org/dspace/event/TestConsumer.java +++ b/dspace-api/src/main/java/org/dspace/event/TestConsumer.java @@ -12,7 +12,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.eperson.EPerson; @@ -27,7 +27,7 @@ import org.dspace.eperson.EPerson; */ public class TestConsumer implements Consumer { // Log4j logger - private static Logger log = Logger.getLogger(TestConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TestConsumer.class); // Send diagnostic output here - set to null to turn it off. private static PrintStream out = ConfigurationManager diff --git a/dspace-api/src/main/java/org/dspace/google/GoogleAccount.java b/dspace-api/src/main/java/org/dspace/google/GoogleAccount.java index 6c95a89e25..a24c02a2e1 100644 --- a/dspace-api/src/main/java/org/dspace/google/GoogleAccount.java +++ b/dspace-api/src/main/java/org/dspace/google/GoogleAccount.java @@ -20,7 +20,7 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.analytics.Analytics; import com.google.api.services.analytics.AnalyticsScopes; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.services.factory.DSpaceServicesFactory; /** @@ -47,7 +47,7 @@ public class GoogleAccount { private volatile static GoogleAccount uniqueInstance; - private static Logger log = Logger.getLogger(GoogleAccount.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleAccount.class); private GoogleAccount() { diff --git a/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java b/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java index a2ba14f6be..ec86e5b410 100644 --- a/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java +++ b/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java @@ -23,7 +23,7 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.core.Constants; import org.dspace.service.ClientInfoService; @@ -46,7 +46,7 @@ public class GoogleRecorderEventListener extends AbstractUsageEventListener { private String analyticsKey; private CloseableHttpClient httpclient; private String GoogleURL = "https://www.google-analytics.com/collect"; - private static Logger log = Logger.getLogger(GoogleRecorderEventListener.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleRecorderEventListener.class); protected ContentServiceFactory contentServiceFactory; protected ConfigurationService configurationService; diff --git a/dspace-api/src/main/java/org/dspace/handle/HandlePlugin.java b/dspace-api/src/main/java/org/dspace/handle/HandlePlugin.java index a965ade577..9e8d04faf2 100644 --- a/dspace-api/src/main/java/org/dspace/handle/HandlePlugin.java +++ b/dspace-api/src/main/java/org/dspace/handle/HandlePlugin.java @@ -21,7 +21,7 @@ import net.handle.hdllib.HandleValue; import net.handle.hdllib.ScanCallback; import net.handle.hdllib.Util; import net.handle.util.StreamTable; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.handle.factory.HandleServiceFactory; import org.dspace.handle.service.HandleService; @@ -51,7 +51,7 @@ public class HandlePlugin implements HandleStorage { /** * log4j category */ - private static Logger log = Logger.getLogger(HandlePlugin.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HandlePlugin.class); /** * The DSpace service manager kernel diff --git a/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java b/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java index daf0045dc3..ca545e0722 100644 --- a/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java @@ -13,7 +13,7 @@ import java.util.List; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.service.SiteService; import org.dspace.core.Constants; @@ -41,7 +41,7 @@ public class HandleServiceImpl implements HandleService { /** * log4j category */ - private static Logger log = Logger.getLogger(HandleServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleServiceImpl.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/handle/UpdateHandlePrefix.java b/dspace-api/src/main/java/org/dspace/handle/UpdateHandlePrefix.java index 333ac801f8..5710f8cf81 100644 --- a/dspace-api/src/main/java/org/dspace/handle/UpdateHandlePrefix.java +++ b/dspace-api/src/main/java/org/dspace/handle/UpdateHandlePrefix.java @@ -12,7 +12,7 @@ import java.io.InputStreamReader; import java.sql.SQLException; import java.util.Iterator; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.MetadataValue; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.MetadataValueService; @@ -33,7 +33,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class UpdateHandlePrefix { - private static final Logger log = Logger.getLogger(UpdateHandlePrefix.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(UpdateHandlePrefix.class); private static final ConfigurationService configurationService = DSpaceServicesFactory.getInstance() .getConfigurationService(); diff --git a/dspace-api/src/main/java/org/dspace/harvest/HarvestConsumer.java b/dspace-api/src/main/java/org/dspace/harvest/HarvestConsumer.java index 37690fa8d0..727c41ee37 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/HarvestConsumer.java +++ b/dspace-api/src/main/java/org/dspace/harvest/HarvestConsumer.java @@ -9,7 +9,7 @@ package org.dspace.harvest; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.core.Constants; @@ -31,7 +31,7 @@ public class HarvestConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(HarvestConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HarvestConsumer.class); protected HarvestedCollectionService harvestedCollectionService; protected HarvestedItemService harvestedItemService; diff --git a/dspace-api/src/main/java/org/dspace/harvest/HarvestScheduler.java b/dspace-api/src/main/java/org/dspace/harvest/HarvestScheduler.java index 2867a804c9..d668b09bc4 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/HarvestScheduler.java +++ b/dspace-api/src/main/java/org/dspace/harvest/HarvestScheduler.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Stack; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; @@ -32,7 +32,7 @@ import org.dspace.harvest.service.HarvestedCollectionService; * @author alexey */ public class HarvestScheduler implements Runnable { - protected static Logger log = Logger.getLogger(HarvestScheduler.class); + protected static Logger log = org.apache.logging.log4j.LogManager.getLogger(HarvestScheduler.class); protected static EPerson harvestAdmin; diff --git a/dspace-api/src/main/java/org/dspace/harvest/HarvestThread.java b/dspace-api/src/main/java/org/dspace/harvest/HarvestThread.java index c021d455bd..52498558d4 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/HarvestThread.java +++ b/dspace-api/src/main/java/org/dspace/harvest/HarvestThread.java @@ -10,7 +10,7 @@ package org.dspace.harvest; import java.sql.SQLException; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; @@ -25,7 +25,7 @@ import org.dspace.harvest.service.HarvestedCollectionService; */ public class HarvestThread extends Thread { - private static final Logger log = Logger.getLogger(HarvestThread.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HarvestThread.class); protected UUID collectionId; protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected HarvestedCollectionService harvestedCollectionService = diff --git a/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java b/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java index 76876caf43..4e78729105 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java +++ b/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java @@ -32,7 +32,7 @@ import ORG.oclc.oai.harvester2.verb.ListIdentifiers; import ORG.oclc.oai.harvester2.verb.ListMetadataFormats; import ORG.oclc.oai.harvester2.verb.ListRecords; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -88,7 +88,7 @@ public class OAIHarvester { /** * log4j category */ - private static Logger log = Logger.getLogger(OAIHarvester.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(OAIHarvester.class); private static final Namespace ATOM_NS = Namespace.getNamespace("http://www.w3.org/2005/Atom"); private static final Namespace ORE_NS = Namespace.getNamespace("http://www.openarchives.org/ore/terms/"); diff --git a/dspace-api/src/main/java/org/dspace/health/Check.java b/dspace-api/src/main/java/org/dspace/health/Check.java index c18e09e817..40f29c15f7 100644 --- a/dspace-api/src/main/java/org/dspace/health/Check.java +++ b/dspace-api/src/main/java/org/dspace/health/Check.java @@ -7,7 +7,7 @@ */ package org.dspace.health; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Abstract check interface. @@ -17,7 +17,7 @@ import org.apache.log4j.Logger; public abstract class Check { - protected static Logger log = Logger.getLogger(Check.class); + protected static Logger log = org.apache.logging.log4j.LogManager.getLogger(Check.class); long took_ = -1L; String report_ = null; private String errors_ = ""; diff --git a/dspace-api/src/main/java/org/dspace/health/Report.java b/dspace-api/src/main/java/org/dspace/health/Report.java index 9a571a8d5f..651d3ac1d7 100644 --- a/dspace-api/src/main/java/org/dspace/health/Report.java +++ b/dspace-api/src/main/java/org/dspace/health/Report.java @@ -21,7 +21,7 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Email; import org.dspace.core.factory.CoreServiceFactory; @@ -33,7 +33,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class Report { - private static Logger log = Logger.getLogger(Report.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Report.class); public static final String EMAIL_PATH = "config/emails/healthcheck"; // store the individual check reports private StringBuilder summary_; diff --git a/dspace-api/src/main/java/org/dspace/identifier/HandleIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/HandleIdentifierProvider.java index a91e6d06cd..2ae6ff63cb 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/HandleIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/HandleIdentifierProvider.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -38,7 +38,7 @@ public class HandleIdentifierProvider extends IdentifierProvider { /** * log4j category */ - private static Logger log = Logger.getLogger(HandleIdentifierProvider.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleIdentifierProvider.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java b/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java index 88f46c4dc7..17ab949cfe 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; @@ -36,7 +36,7 @@ public class IdentifierServiceImpl implements IdentifierService { /** * log4j category */ - private static Logger log = Logger.getLogger(IdentifierServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IdentifierServiceImpl.class); @Autowired(required = true) protected ContentServiceFactory contentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java index b155bf7150..a2045acf26 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -36,7 +36,7 @@ public class VersionedDOIIdentifierProvider extends DOIIdentifierProvider { /** * log4j category */ - private static Logger log = Logger.getLogger(VersionedDOIIdentifierProvider.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionedDOIIdentifierProvider.class); protected DOIConnector connector; diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProvider.java index da7f1d7882..f507348279 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProvider.java @@ -15,7 +15,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -46,7 +46,7 @@ public class VersionedHandleIdentifierProvider extends IdentifierProvider { /** * log4j category */ - private static Logger log = Logger.getLogger(VersionedHandleIdentifierProvider.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionedHandleIdentifierProvider.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java index 4c47fe7729..9396526d47 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -43,7 +43,7 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident /** * log4j category */ - private static Logger log = Logger.getLogger(VersionedHandleIdentifierProviderWithCanonicalHandles.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionedHandleIdentifierProviderWithCanonicalHandles.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java index 8ad93e6e56..654d275d87 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java +++ b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java @@ -7,7 +7,7 @@ */ package org.dspace.identifier.doi; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.content.factory.ContentServiceFactory; @@ -28,7 +28,7 @@ public class DOIConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(DOIConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DOIConsumer.class); @Override public void initialize() throws Exception { diff --git a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIOrganiser.java b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIOrganiser.java index ed59eb3cdf..37fb18a5e4 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIOrganiser.java +++ b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIOrganiser.java @@ -26,7 +26,7 @@ import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.ItemService; @@ -51,7 +51,7 @@ import org.dspace.utils.DSpace; */ public class DOIOrganiser { - private static final Logger LOG = Logger.getLogger(DOIOrganiser.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(DOIOrganiser.class); private DOIIdentifierProvider provider; private Context context; diff --git a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java index 1813d28659..3ce45d6048 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java @@ -12,7 +12,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.importer.external.metadatamapping.contributor.MetadataContributor; import org.dspace.importer.external.metadatamapping.transform.MetadataProcessorService; @@ -30,7 +30,7 @@ public abstract class AbstractMetadataFieldMapping /** * log4j logger */ - private static Logger log = Logger.getLogger(AbstractMetadataFieldMapping.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractMetadataFieldMapping.class); /* A map containing what processing has to be done on a given metadataFieldConfig. * The processing of a value is used to determine the actual value that will be returned used. diff --git a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java index dea509f470..fe8af76831 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java @@ -15,7 +15,7 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DCDate; import org.dspace.importer.external.metadatamapping.MetadataFieldConfig; import org.dspace.importer.external.metadatamapping.MetadataFieldMapping; @@ -30,7 +30,7 @@ import org.springframework.beans.factory.annotation.Required; * @author Philip Vissenaekens (philip at atmire dot com) */ public class PubmedDateMetadatumContributor implements MetadataContributor { - Logger log = Logger.getLogger(PubmedDateMetadatumContributor.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(PubmedDateMetadatumContributor.class); private MetadataFieldMapping> metadataFieldMapping; diff --git a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedLanguageMetadatumContributor.java b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedLanguageMetadatumContributor.java index 82da062036..18a706a4ed 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedLanguageMetadatumContributor.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedLanguageMetadatumContributor.java @@ -14,7 +14,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.importer.external.metadatamapping.MetadataFieldConfig; import org.dspace.importer.external.metadatamapping.MetadataFieldMapping; import org.dspace.importer.external.metadatamapping.MetadatumDTO; @@ -27,7 +27,7 @@ import org.dspace.importer.external.metadatamapping.contributor.MetadataContribu * @author Philip Vissenaekens (philip at atmire dot com) */ public class PubmedLanguageMetadatumContributor implements MetadataContributor { - Logger log = Logger.getLogger(PubmedDateMetadatumContributor.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(PubmedDateMetadatumContributor.class); private MetadataFieldMapping> metadataFieldMapping; private HashMap iso3toIso2; diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/ImportService.java b/dspace-api/src/main/java/org/dspace/importer/external/service/ImportService.java index 74f6b26a77..87c2bd0029 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/service/ImportService.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/ImportService.java @@ -15,7 +15,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.dspace.importer.external.datamodel.ImportRecord; import org.dspace.importer.external.datamodel.Query; @@ -36,7 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; public class ImportService implements Destroyable { private HashMap importSources = new HashMap<>(); - Logger log = Logger.getLogger(ImportService.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(ImportService.class); /** * Constructs an empty ImportService class object diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java index a0340236c5..38632a1a2b 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java @@ -16,7 +16,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.locks.ReentrantLock; import javax.annotation.Resource; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.importer.external.exception.MetadataSourceException; import org.dspace.importer.external.exception.SourceExceptionHandler; @@ -136,7 +136,7 @@ public abstract class AbstractRemoteMetadataSource { /** * log4j logger */ - private static Logger log = Logger.getLogger(AbstractRemoteMetadataSource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractRemoteMetadataSource.class); /** * Command pattern implementation. the callable.call method will be retried diff --git a/dspace-api/src/main/java/org/dspace/license/CCLookup.java b/dspace-api/src/main/java/org/dspace/license/CCLookup.java index 6ddd31a77d..c86aa78301 100644 --- a/dspace-api/src/main/java/org/dspace/license/CCLookup.java +++ b/dspace-api/src/main/java/org/dspace/license/CCLookup.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.license.factory.LicenseServiceFactory; import org.dspace.license.service.CreativeCommonsService; import org.dspace.services.ConfigurationService; @@ -45,7 +45,7 @@ public class CCLookup { /** * log4j logger */ - private static Logger log = Logger.getLogger(CCLookup.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CCLookup.class); private String cc_root; private String jurisdiction; diff --git a/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java b/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java index ee45a70984..384b82ddc3 100644 --- a/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java @@ -22,7 +22,7 @@ import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -46,7 +46,7 @@ public class CreativeCommonsServiceImpl implements CreativeCommonsService, Initi /** * log4j category */ - private static Logger log = Logger.getLogger(CreativeCommonsServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsServiceImpl.class); /** * The Bundle Name diff --git a/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java b/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java index 30d7147079..55eeb8d314 100644 --- a/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java +++ b/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java @@ -26,7 +26,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -44,7 +44,7 @@ import org.dspace.core.Context; */ public class LicenseCleanup { - private static final Logger log = Logger.getLogger(LicenseCleanup.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseCleanup.class); protected static final Templates templates; diff --git a/dspace-api/src/main/java/org/dspace/rdf/RDFConsumer.java b/dspace-api/src/main/java/org/dspace/rdf/RDFConsumer.java index f127d7ff48..76ae0cd2d2 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/RDFConsumer.java +++ b/dspace-api/src/main/java/org/dspace/rdf/RDFConsumer.java @@ -17,7 +17,7 @@ import java.util.NoSuchElementException; import java.util.UUID; import com.hp.hpl.jena.rdf.model.Model; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -40,7 +40,7 @@ import org.dspace.workflow.factory.WorkflowServiceFactory; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class RDFConsumer implements Consumer { - private static final Logger log = Logger.getLogger(RDFConsumer.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFConsumer.class); protected Deque toConvert; protected Deque toDelete; diff --git a/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java b/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java index 7ce0c9cbed..03ae589c62 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java +++ b/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java @@ -14,7 +14,7 @@ import java.util.UUID; import com.hp.hpl.jena.rdf.model.Model; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -31,7 +31,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class RDFUtil { - private static final Logger log = Logger.getLogger(RDFUtil.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFUtil.class); private static final AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance() .getAuthorizeService(); diff --git a/dspace-api/src/main/java/org/dspace/rdf/RDFizer.java b/dspace-api/src/main/java/org/dspace/rdf/RDFizer.java index a6f8804756..834ec15d4a 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/RDFizer.java +++ b/dspace-api/src/main/java/org/dspace/rdf/RDFizer.java @@ -26,7 +26,7 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -54,7 +54,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class RDFizer { - private static final Logger log = Logger.getLogger(RDFizer.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFizer.class); protected boolean stdout; protected boolean verbose; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java index ebf1412e89..36501b89c4 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java @@ -26,7 +26,7 @@ import com.hp.hpl.jena.util.FileManager; import com.hp.hpl.jena.util.FileUtils; import com.hp.hpl.jena.vocabulary.RDF; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.factory.UtilServiceFactory; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; @@ -50,7 +50,7 @@ public class MetadataConverterPlugin implements ConverterPlugin { public final static String METADATA_SCHEMA_URL_KEY = "rdf.metadata.schema"; public final static String METADATA_PREFIXES_KEY = "rdf.metadata.prefixes"; - private final static Logger log = Logger.getLogger(MetadataConverterPlugin.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataConverterPlugin.class); @Autowired(required = true) protected ConfigurationService configurationService; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java index 92d6d2e8d2..6286f3b87a 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java @@ -23,14 +23,14 @@ import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.vocabulary.RDF; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class MetadataRDFMapping { - private static final Logger log = Logger.getLogger(MetadataRDFMapping.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataRDFMapping.class); protected final String name; protected final Pattern fulfills; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/RDFConverterImpl.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/RDFConverterImpl.java index 382915cacc..93a9b6211d 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/RDFConverterImpl.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/RDFConverterImpl.java @@ -13,7 +13,7 @@ import java.util.List; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class RDFConverterImpl implements RDFConverter { - private static final Logger log = Logger.getLogger(RDFConverterImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFConverterImpl.class); protected ConfigurationService configurationService; protected List plugins; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java index 4f70c1d029..3337738b17 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java @@ -19,7 +19,7 @@ import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.util.FileManager; import com.hp.hpl.jena.util.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -57,7 +57,7 @@ public class SimpleDSORelationsConverterPlugin public static final String SIMPLE_RELATIONS_ITEM2BITSTREAM_KEY = "rdf.simplerelations.item2bitstream"; - private static final Logger log = Logger.getLogger(SimpleDSORelationsConverterPlugin.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SimpleDSORelationsConverterPlugin.class); @Autowired(required = true) protected BitstreamService bitstreamService; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/StaticDSOConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/StaticDSOConverterPlugin.java index cf52167325..f86af753e6 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/StaticDSOConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/StaticDSOConverterPlugin.java @@ -16,7 +16,7 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.util.FileManager; import com.hp.hpl.jena.util.FileUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.core.Constants; @@ -30,7 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class StaticDSOConverterPlugin implements ConverterPlugin { - private static final Logger log = Logger.getLogger(StaticDSOConverterPlugin.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(StaticDSOConverterPlugin.class); public static final String CONSTANT_DATA_FILENAME_KEY_PREFIX = "rdf.constant.data."; public static final String CONSTANT_DATA_GENERAL_KEY_SUFFIX = "GENERAL"; diff --git a/dspace-api/src/main/java/org/dspace/rdf/factory/RDFFactoryImpl.java b/dspace-api/src/main/java/org/dspace/rdf/factory/RDFFactoryImpl.java index 2f6b66bda6..2abcd41a1b 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/factory/RDFFactoryImpl.java +++ b/dspace-api/src/main/java/org/dspace/rdf/factory/RDFFactoryImpl.java @@ -8,7 +8,7 @@ package org.dspace.rdf.factory; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rdf.conversion.RDFConverter; import org.dspace.rdf.storage.RDFStorage; import org.dspace.rdf.storage.URIGenerator; @@ -23,7 +23,7 @@ public class RDFFactoryImpl extends RDFFactory { // by type here. So we use setters and properties in Spring configuration // instead. - private static final Logger log = Logger.getLogger(RDFFactoryImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFFactoryImpl.class); private RDFStorage storage; private URIGenerator generator; diff --git a/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java b/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java index 7b047cc55e..6b2caa598d 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java +++ b/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java @@ -14,7 +14,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) @@ -62,7 +62,7 @@ public class MediaRange { public static final String mediaRangeRegex = "(?:(" + token + ")/(" + token + "?)" + "(" + nonQualityParam + "*)" + qualityParam + "?(" + nonQualityParam + "*))"; - private final static Logger log = Logger.getLogger(MediaRange.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(MediaRange.class); protected final String type; protected final String subtype; diff --git a/dspace-api/src/main/java/org/dspace/rdf/negotiation/NegotiationFilter.java b/dspace-api/src/main/java/org/dspace/rdf/negotiation/NegotiationFilter.java index ed8840bb7a..998f57ca4f 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/negotiation/NegotiationFilter.java +++ b/dspace-api/src/main/java/org/dspace/rdf/negotiation/NegotiationFilter.java @@ -19,7 +19,7 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rdf.RDFUtil; import org.dspace.services.factory.DSpaceServicesFactory; @@ -29,7 +29,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; public class NegotiationFilter implements Filter { public static final String ACCEPT_HEADER_NAME = "Accept"; - private static final Logger log = Logger.getLogger(NegotiationFilter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(NegotiationFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { diff --git a/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java b/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java index 399dbdb795..dbf703e8de 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java @@ -15,7 +15,7 @@ import java.util.Iterator; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rdf.RDFUtil; import org.dspace.services.factory.DSpaceServicesFactory; @@ -34,7 +34,7 @@ public class Negotiator { public static final String DEFAULT_LANG = "html"; - private static final Logger log = Logger.getLogger(Negotiator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Negotiator.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/DOIURIGenerator.java b/dspace-api/src/main/java/org/dspace/rdf/storage/DOIURIGenerator.java index 935a4ed610..54071ab8a2 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/DOIURIGenerator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/DOIURIGenerator.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.core.Constants; @@ -26,7 +26,7 @@ import org.springframework.beans.factory.annotation.Required; * @author pbecker */ public class DOIURIGenerator implements URIGenerator { - private static final Logger log = Logger.getLogger(DOIURIGenerator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DOIURIGenerator.class); protected static URIGenerator fallback; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java b/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java index 1ed54c7e3e..3353fa35ef 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; @@ -26,7 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class HandleURIGenerator implements URIGenerator { - private static final Logger log = Logger.getLogger(HandleURIGenerator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleURIGenerator.class); @Autowired(required = true) protected SiteService siteService; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java b/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java index b577b212ca..b173010bd4 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; @@ -27,7 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class LocalURIGenerator implements URIGenerator { - private static final Logger log = Logger.getLogger(LocalURIGenerator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(LocalURIGenerator.class); @Autowired(required = true) protected SiteService siteService; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java b/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java index a301762bf8..fd84db5d5f 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java @@ -30,7 +30,7 @@ import org.apache.jena.atlas.web.auth.HttpAuthenticator; import org.apache.jena.atlas.web.auth.SimpleAuthenticator; import org.apache.jena.web.DatasetGraphAccessor; import org.apache.jena.web.DatasetGraphAccessorHTTP; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rdf.RDFUtil; import org.dspace.services.ConfigurationService; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +40,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class RDFStorageImpl implements RDFStorage { - private static final Logger log = Logger.getLogger(RDFStorageImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFStorageImpl.class); @Autowired(required = true) protected ConfigurationService configurationService; diff --git a/dspace-api/src/main/java/org/dspace/search/Harvest.java b/dspace-api/src/main/java/org/dspace/search/Harvest.java index 083a32d89d..677a760452 100644 --- a/dspace-api/src/main/java/org/dspace/search/Harvest.java +++ b/dspace-api/src/main/java/org/dspace/search/Harvest.java @@ -14,7 +14,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.Collection; @@ -46,7 +46,7 @@ public class Harvest { /** * log4j logger */ - private static final Logger log = Logger.getLogger(Harvest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Harvest.class); protected static final AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance() .getAuthorizeService(); diff --git a/dspace-api/src/main/java/org/dspace/sort/AbstractTextFilterOFD.java b/dspace-api/src/main/java/org/dspace/sort/AbstractTextFilterOFD.java index ec98ee874a..e1a14cc18c 100644 --- a/dspace-api/src/main/java/org/dspace/sort/AbstractTextFilterOFD.java +++ b/dspace-api/src/main/java/org/dspace/sort/AbstractTextFilterOFD.java @@ -7,7 +7,7 @@ */ package org.dspace.sort; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.text.filter.TextFilter; /** @@ -40,7 +40,7 @@ import org.dspace.text.filter.TextFilter; * @author Graham Triggs */ public abstract class AbstractTextFilterOFD implements OrderFormatDelegate { - private static final Logger log = Logger.getLogger(AbstractTextFilterOFD.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractTextFilterOFD.class); // Initialised in subclass in an object initializer protected TextFilter[] filters; diff --git a/dspace-api/src/main/java/org/dspace/sort/SortOption.java b/dspace-api/src/main/java/org/dspace/sort/SortOption.java index 5ce96fb41c..19634164ce 100644 --- a/dspace-api/src/main/java/org/dspace/sort/SortOption.java +++ b/dspace-api/src/main/java/org/dspace/sort/SortOption.java @@ -17,7 +17,7 @@ import java.util.regex.Pattern; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; /** @@ -26,7 +26,7 @@ import org.dspace.core.ConfigurationManager; * @author Richard Jones */ public class SortOption { - private static final Logger log = Logger.getLogger(SortOption.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SortOption.class); public static final String ASCENDING = "ASC"; public static final String DESCENDING = "DESC"; diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java index a003169054..bf3cd0d3dc 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java @@ -45,6 +45,7 @@ import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; @@ -104,9 +105,9 @@ import org.springframework.beans.factory.annotation.Autowired; * @author mdiggory at atmire.com */ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBean { - private static final Logger log - = LoggerFactory.getLogger(SolrLoggerServiceImpl.class); - + + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrLoggerServiceImpl.class); + private static final String MULTIPLE_VALUES_SPLITTER = "|"; protected SolrServer solr; diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java index deb0a92d5b..bce0a6f7b1 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java @@ -7,7 +7,7 @@ */ package org.dspace.statistics; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.eperson.EPerson; import org.dspace.services.model.Event; import org.dspace.statistics.service.SolrLoggerService; @@ -26,7 +26,7 @@ import org.springframework.util.CollectionUtils; */ public class SolrLoggerUsageEventListener extends AbstractUsageEventListener { - private static Logger log = Logger.getLogger(SolrLoggerUsageEventListener.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrLoggerUsageEventListener.class); protected SolrLoggerService solrLoggerService; diff --git a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java index a8e87533f8..a4d340b1e9 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java +++ b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java @@ -22,7 +22,7 @@ import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; import org.apache.commons.configuration2.builder.fluent.Configurations; import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; @@ -46,7 +46,7 @@ import org.dspace.statistics.content.filter.StatisticsFilter; */ public class StatisticsDataWorkflow extends StatisticsData { - private static final Logger log = Logger.getLogger(StatisticsDataWorkflow.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(StatisticsDataWorkflow.class); /** * Current DSpaceObject for which to generate the statistics. diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/ClassicDSpaceLogConverter.java b/dspace-api/src/main/java/org/dspace/statistics/util/ClassicDSpaceLogConverter.java index b26f747aca..3987f5df53 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/ClassicDSpaceLogConverter.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/ClassicDSpaceLogConverter.java @@ -28,7 +28,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.statistics.LogAnalyser; import org.dspace.app.statistics.LogLine; import org.dspace.content.DSpaceObject; @@ -44,7 +44,7 @@ import org.dspace.handle.factory.HandleServiceFactory; * @see StatisticsImporter */ public class ClassicDSpaceLogConverter { - private final Logger log = Logger.getLogger(ClassicDSpaceLogConverter.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(ClassicDSpaceLogConverter.class); /** * A DSpace context diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/LocationUtils.java b/dspace-api/src/main/java/org/dspace/statistics/util/LocationUtils.java index 693454a2cb..0b08085f52 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/LocationUtils.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/LocationUtils.java @@ -13,7 +13,7 @@ import java.util.MissingResourceException; import java.util.Properties; import java.util.ResourceBundle; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.I18nUtil; /** @@ -24,7 +24,7 @@ import org.dspace.core.I18nUtil; * @author ben at atmire.com */ public class LocationUtils { - private static final Logger logger = Logger.getLogger(LocationUtils.class); + private static final Logger logger = org.apache.logging.log4j.LogManager.getLogger(LocationUtils.class); private static final Properties countryToContinent = new Properties(); diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsClient.java b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsClient.java index 9662a3f7d9..61fd2619c2 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsClient.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsClient.java @@ -15,7 +15,7 @@ import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.tools.ant.taskdefs.Get; import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.statistics.factory.StatisticsServiceFactory; @@ -27,7 +27,7 @@ import org.dspace.statistics.service.SolrLoggerService; * @author Stuart Lewis */ public class StatisticsClient { - private static final Logger log = Logger.getLogger(StatisticsClient.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(StatisticsClient.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java index 91ae8d21fd..f236e1bc72 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java @@ -34,7 +34,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.time.DateFormatUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.common.SolrInputDocument; @@ -64,7 +64,7 @@ import org.dspace.statistics.service.SolrLoggerService; * @see ClassicDSpaceLogConverter */ public class StatisticsImporter { - private static final Logger log = Logger.getLogger(StatisticsImporter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(StatisticsImporter.class); /** * Date format (for solr) diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitStoreMigrate.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitStoreMigrate.java index 9aab7c4346..1c5ed69757 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitStoreMigrate.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitStoreMigrate.java @@ -13,7 +13,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; import org.dspace.core.Context; @@ -28,7 +28,7 @@ public class BitStoreMigrate { /** * log4j log */ - private static Logger log = Logger.getLogger(BitStoreMigrate.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitStoreMigrate.class); private static final BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); private static final BitstreamStorageService bitstreamStorageService = diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java index 18e1f33388..c63b4ebe7e 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java @@ -17,7 +17,7 @@ import java.util.Map; import java.util.UUID; import org.apache.commons.collections4.MapUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.checker.service.ChecksumHistoryService; import org.dspace.content.Bitstream; @@ -62,7 +62,7 @@ public class BitstreamStorageServiceImpl implements BitstreamStorageService, Ini /** * log4j log */ - private static Logger log = Logger.getLogger(BitstreamStorageServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamStorageServiceImpl.class); @Autowired(required = true) protected BitstreamService bitstreamService; diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/Cleanup.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/Cleanup.java index 97c2a512b7..5b8ff11c88 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/Cleanup.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/Cleanup.java @@ -13,7 +13,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.storage.bitstore.factory.StorageServiceFactory; /** @@ -26,7 +26,7 @@ public class Cleanup { /** * log4j log */ - private static Logger log = Logger.getLogger(Cleanup.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Cleanup.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/DSBitStoreService.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/DSBitStoreService.java index 31901c7f34..36f75c67f9 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/DSBitStoreService.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/DSBitStoreService.java @@ -17,7 +17,7 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.core.Utils; @@ -33,7 +33,7 @@ public class DSBitStoreService implements BitStoreService { /** * log4j log */ - private static Logger log = Logger.getLogger(DSBitStoreService.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSBitStoreService.class); // These settings control the way an identifier is hashed into // directory and file names diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java index 51072d2259..9d7ec14143 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java @@ -27,7 +27,7 @@ import com.amazonaws.services.s3.model.S3Object; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.core.ConfigurationManager; import org.dspace.core.Utils; @@ -45,7 +45,7 @@ public class S3BitStoreService implements BitStoreService { /** * log4j log */ - private static Logger log = Logger.getLogger(S3BitStoreService.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(S3BitStoreService.class); /** * Checksum algorithm diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java index 5037456018..a8ca129e85 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java @@ -24,7 +24,7 @@ import java.util.regex.Pattern; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.discovery.IndexingService; import org.dspace.discovery.SearchServiceException; @@ -54,7 +54,7 @@ public class DatabaseUtils { /** * log4j category */ - private static final Logger log = Logger.getLogger(DatabaseUtils.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DatabaseUtils.class); // Our Flyway DB object (initialized by setupFlyway()) private static Flyway flywaydb; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/GroupServiceInitializer.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/GroupServiceInitializer.java index 1517b29a31..11018d37e0 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/GroupServiceInitializer.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/GroupServiceInitializer.java @@ -9,7 +9,7 @@ package org.dspace.storage.rdbms; import java.sql.Connection; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.eperson.service.GroupService; import org.flywaydb.core.api.MigrationInfo; @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class GroupServiceInitializer implements FlywayCallback { - private final Logger log = Logger.getLogger(GroupServiceInitializer.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(GroupServiceInitializer.class); @Autowired(required = true) protected GroupService groupService; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/PostgreSQLCryptoChecker.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/PostgreSQLCryptoChecker.java index 410e922e0c..48f2e4e6f0 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/PostgreSQLCryptoChecker.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/PostgreSQLCryptoChecker.java @@ -11,7 +11,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.flywaydb.core.api.FlywayException; import org.flywaydb.core.api.MigrationInfo; import org.flywaydb.core.api.callback.FlywayCallback; @@ -29,7 +29,7 @@ import org.flywaydb.core.api.callback.FlywayCallback; * @author Tim Donohue */ public class PostgreSQLCryptoChecker implements FlywayCallback { - private Logger log = Logger.getLogger(PostgreSQLCryptoChecker.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(PostgreSQLCryptoChecker.class); /** * Check for pgcrypto (if needed). Throws an exception if pgcrypto is diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/SiteServiceInitializer.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/SiteServiceInitializer.java index 68f671c951..a4b7129546 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/SiteServiceInitializer.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/SiteServiceInitializer.java @@ -9,7 +9,7 @@ package org.dspace.storage.rdbms; import java.sql.Connection; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.service.SiteService; import org.dspace.core.Context; import org.flywaydb.core.api.MigrationInfo; @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SiteServiceInitializer implements FlywayCallback { - private Logger log = Logger.getLogger(SiteServiceInitializer.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(SiteServiceInitializer.class); @Autowired(required = true) protected SiteService siteService; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java index 366fc76b89..0ed07785d9 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java @@ -10,7 +10,7 @@ package org.dspace.storage.rdbms.migration; import java.sql.Connection; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.browse.BrowseException; import org.dspace.browse.BrowseIndex; import org.dspace.storage.rdbms.DatabaseUtils; @@ -27,7 +27,7 @@ public class V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables implements JdbcM /** * log4j category */ - private static final Logger log = Logger.getLogger(V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.class); /* The checksum to report for this migration (when successful) */ private int checksum = -1; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java index a41ed36082..ebc898e4cf 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java @@ -26,7 +26,7 @@ import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -40,7 +40,7 @@ import org.xml.sax.SAXException; */ public class ArXivFileDataLoader extends FileDataLoader { - private static Logger log = Logger.getLogger(ArXivFileDataLoader.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ArXivFileDataLoader.class); Map fieldMap; // mapping between service fields and local // intermediate fields diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java index ec602bd62d..410c30ca58 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java @@ -26,7 +26,7 @@ import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; @@ -38,7 +38,7 @@ import org.xml.sax.SAXException; */ public class CiNiiFileDataLoader extends FileDataLoader { - private static Logger log = Logger.getLogger(CiNiiFileDataLoader.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CiNiiFileDataLoader.class); Map fieldMap; // mapping between service fields and local // intermediate fields diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiService.java index db495906da..23026353fd 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiService.java @@ -23,7 +23,7 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -35,7 +35,7 @@ public class CiNiiService { /** * log4j category */ - private static final Logger log = Logger.getLogger(CiNiiService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CiNiiService.class); protected int timeout = 1000; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java index fd72ffe5ff..f73e9c0352 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java @@ -34,7 +34,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.dspace.core.Context; import org.dspace.core.LogManager; @@ -51,7 +51,7 @@ import org.xml.sax.SAXException; */ public class CrossRefService { - private static final Logger log = Logger.getLogger(CrossRefService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CrossRefService.class); protected int timeout = 1000; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java index 8538ccb6ff..a8ff5ef7fb 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java @@ -22,7 +22,7 @@ import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; import org.dspace.app.util.DCInputsReader; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java index 3ef5f65f80..f90c8e2bb8 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java @@ -21,7 +21,7 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; /** diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedOnlineDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedOnlineDataLoader.java index e78fd67405..094ce4e21d 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedOnlineDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedOnlineDataLoader.java @@ -16,7 +16,7 @@ import java.util.Set; import gr.ekt.bte.core.Record; import org.apache.http.HttpException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.LogManager; @@ -29,7 +29,7 @@ import org.dspace.core.LogManager; public class PubmedOnlineDataLoader extends NetworkSubmissionLookupDataLoader { protected boolean searchProvider = true; - private static final Logger log = Logger.getLogger(PubmedOnlineDataLoader.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PubmedOnlineDataLoader.class); protected PubmedService pubmedService = new PubmedService(); diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java index 60a7df0483..fa30ee8ea5 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java @@ -29,7 +29,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.dspace.core.ConfigurationManager; import org.w3c.dom.Document; @@ -44,7 +44,7 @@ import org.xml.sax.SAXException; */ public class PubmedService { - private static final Logger log = Logger.getLogger(PubmedService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PubmedService.class); protected int timeout = 1000; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java index a032331efc..a3c8bbfc8b 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java @@ -15,7 +15,7 @@ import gr.ekt.bte.core.DataLoadingSpec; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.submit.util.ItemSubmissionLookupDTO; /** diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java index b98581b807..7712b64041 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java @@ -17,7 +17,7 @@ import gr.ekt.bte.core.DataLoader; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.TransformationEngine; import gr.ekt.bte.dataloader.FileDataLoader; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.submit.util.SubmissionLookupDTO; /** @@ -35,7 +35,7 @@ public class SubmissionLookupService { public static final String PROVIDER_NAME_FIELD = "provider_name_field"; - private static Logger log = Logger.getLogger(SubmissionLookupService.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionLookupService.class); public static final String SEPARATOR_VALUE = "#######"; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java index 995fb6798f..d537b0a5aa 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java @@ -14,7 +14,7 @@ import java.util.regex.Pattern; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.Value; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.dspace.content.MetadataSchema; import org.dspace.content.MetadataValue; @@ -31,7 +31,7 @@ import org.dspace.core.Context; * @author Panagiotis Koutsourakis */ public class SubmissionLookupUtils { - private static Logger log = Logger.getLogger(SubmissionLookupUtils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionLookupUtils.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/submit/step/AccessStep.java b/dspace-api/src/main/java/org/dspace/submit/step/AccessStep.java index 3cb16908f3..72273b8037 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/AccessStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/AccessStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -17,7 +17,7 @@ public class AccessStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(AccessStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AccessStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/CCLicenseStep.java b/dspace-api/src/main/java/org/dspace/submit/step/CCLicenseStep.java index 1c22849c3d..88606e51ed 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/CCLicenseStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/CCLicenseStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.license.factory.LicenseServiceFactory; @@ -18,7 +18,7 @@ public class CCLicenseStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(CCLicenseStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CCLicenseStep.class); protected final CreativeCommonsService creativeCommonsService = LicenseServiceFactory.getInstance() .getCreativeCommonsService(); diff --git a/dspace-api/src/main/java/org/dspace/submit/step/CompleteStep.java b/dspace-api/src/main/java/org/dspace/submit/step/CompleteStep.java index 81966fedc9..edb7fc977c 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/CompleteStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/CompleteStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -16,7 +16,7 @@ public class CompleteStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(CompleteStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CompleteStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java b/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java index c1d679eab1..c429ea103c 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java @@ -7,7 +7,11 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; +import org.dspace.content.InProgressSubmission; +import org.dspace.core.Context; +import org.dspace.services.model.Request; +import org.dspace.submit.AbstractProcessingStep; /** * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) @@ -16,6 +20,6 @@ public class DescribeStep extends MetadataStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(DescribeStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DescribeStep.class); } diff --git a/dspace-api/src/main/java/org/dspace/submit/step/LicenseStep.java b/dspace-api/src/main/java/org/dspace/submit/step/LicenseStep.java index d54dbac79c..8eddebee2c 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/LicenseStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/LicenseStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -17,7 +17,7 @@ public class LicenseStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(LicenseStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/SelectCollectionStep.java b/dspace-api/src/main/java/org/dspace/submit/step/SelectCollectionStep.java index 11b9b3e126..ff3e97023c 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/SelectCollectionStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/SelectCollectionStep.java @@ -7,14 +7,14 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; public class SelectCollectionStep extends AbstractProcessingStep { - private static final Logger log = Logger.getLogger(SelectCollectionStep.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SelectCollectionStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java b/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java index 903100d1f6..b8513aefe0 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; diff --git a/dspace-api/src/main/java/org/dspace/submit/step/UploadStep.java b/dspace-api/src/main/java/org/dspace/submit/step/UploadStep.java index 8e528eb0a4..764f332c1d 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/UploadStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/UploadStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -16,7 +16,7 @@ public class UploadStep extends AbstractProcessingStep { /** * log4j logger */ - private static final Logger log = Logger.getLogger(UploadStep.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(UploadStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/UploadWithEmbargoStep.java b/dspace-api/src/main/java/org/dspace/submit/step/UploadWithEmbargoStep.java index 572b252773..d67887ccb5 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/UploadWithEmbargoStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/UploadWithEmbargoStep.java @@ -7,12 +7,12 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; public class UploadWithEmbargoStep extends UploadStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(UploadWithEmbargoStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(UploadWithEmbargoStep.class); } diff --git a/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java b/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java index 918ee7add5..ec20f3f911 100644 --- a/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java +++ b/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java @@ -22,7 +22,7 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.Format; @@ -46,7 +46,7 @@ import org.xml.sax.helpers.DefaultHandler; * which can then be loaded into DSpace using ItemImport. */ public class PubMedToImport { - private static final Logger log = Logger.getLogger(PubMedToImport.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PubMedToImport.class); private static File outputDir = null; diff --git a/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java b/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java index 9ffcf78110..9421f7d54b 100644 --- a/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java +++ b/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java @@ -7,7 +7,7 @@ */ package org.dspace.usage; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.core.Constants; diff --git a/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java b/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java index 3f54426e71..2d5449637f 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java @@ -28,7 +28,7 @@ import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; @@ -95,7 +95,7 @@ public class SolrImportExport { private static final String MULTIPLE_VALUES_SPLITTER = ","; - private static final Logger log = Logger.getLogger(SolrImportExport.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrImportExport.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java b/dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java index 9f02b18a95..7903a49c31 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java +++ b/dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.content.Item; @@ -32,7 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class DefaultItemVersionProvider extends AbstractVersionProvider implements ItemVersionProvider { - Logger log = Logger.getLogger(DefaultItemVersionProvider.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(DefaultItemVersionProvider.class); @Autowired(required = true) protected WorkspaceItemService workspaceItemService; diff --git a/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java b/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java index a8efdc329a..0f5b9384bd 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java +++ b/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java @@ -20,7 +20,7 @@ import javax.persistence.OrderBy; import javax.persistence.SequenceGenerator; import javax.persistence.Table; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.ReloadableEntity; import org.hibernate.proxy.HibernateProxyHelper; @@ -35,7 +35,7 @@ import org.hibernate.proxy.HibernateProxyHelper; @Table(name = "versionhistory") public class VersionHistory implements ReloadableEntity { - private static final Logger log = Logger.getLogger(VersionHistory.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionHistory.class); @Id @Column(name = "versionhistory_id") diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItemServiceImpl.java index 86134c62b5..2751fd33e1 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItemServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Item; @@ -37,7 +37,7 @@ public class BasicWorkflowItemServiceImpl implements BasicWorkflowItemService { /** * log4j category */ - protected static Logger log = Logger.getLogger(BasicWorkflowItem.class); + protected static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicWorkflowItem.class); @Autowired(required = true) protected BasicWorkflowItemDAO workflowItemDAO; diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java index b6af59d092..79dfa0ae3d 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java @@ -22,7 +22,7 @@ import javax.mail.MessagingException; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.service.AuthorizeService; @@ -104,7 +104,7 @@ public class BasicWorkflowServiceImpl implements BasicWorkflowService { /** * log4j logger */ - private final Logger log = Logger.getLogger(BasicWorkflowServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicWorkflowServiceImpl.class); @Override public int getWorkflowID(String state) { diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java index c09a785e60..8c62ed919b 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java @@ -18,7 +18,7 @@ import java.util.LinkedHashMap; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; @@ -47,7 +47,7 @@ public class WorkflowUtils extends Util { /** * log4j category */ - public static Logger log = Logger.getLogger(WorkflowUtils.class); + public static Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkflowUtils.class); protected static final CollectionRoleService collectionRoleService = XmlWorkflowServiceFactory.getInstance().getCollectionRoleService(); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowFactoryImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowFactoryImpl.java index 7f1076b206..950dd4318e 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowFactoryImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowFactoryImpl.java @@ -18,7 +18,7 @@ import javax.annotation.PostConstruct; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.TransformerException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.xpath.XPathAPI; import org.dspace.content.Collection; import org.dspace.services.ConfigurationService; @@ -45,7 +45,7 @@ import org.w3c.dom.NodeList; */ public class XmlWorkflowFactoryImpl implements XmlWorkflowFactory { - private Logger log = Logger.getLogger(XmlWorkflowFactoryImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlWorkflowFactoryImpl.class); @Autowired(required = true) protected ConfigurationService configurationService; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowServiceImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowServiceImpl.java index a6cbf73007..8983976cc2 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowServiceImpl.java @@ -22,7 +22,7 @@ import javax.mail.MessagingException; import javax.servlet.http.HttpServletRequest; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.service.AuthorizeService; @@ -84,7 +84,7 @@ public class XmlWorkflowServiceImpl implements XmlWorkflowService { /* support for 'no notification' */ protected Map noEMail = new HashMap<>(); - private Logger log = Logger.getLogger(XmlWorkflowServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlWorkflowServiceImpl.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/migration/RestartWorkflow.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/migration/RestartWorkflow.java index d64fa66843..a67a6d0cc3 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/migration/RestartWorkflow.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/migration/RestartWorkflow.java @@ -15,7 +15,7 @@ import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.dspace.content.WorkspaceItem; import org.dspace.core.Context; @@ -41,7 +41,7 @@ public class RestartWorkflow { /** * log4j category */ - private static Logger log = Logger.getLogger(RestartWorkflow.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RestartWorkflow.class); public static boolean useWorkflowSendEmail = false; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/AutoAssignAction.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/AutoAssignAction.java index d77ac39aaf..3c6ce50b0d 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/AutoAssignAction.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/AutoAssignAction.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.List; import javax.servlet.http.HttpServletRequest; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Context; import org.dspace.core.LogManager; @@ -42,7 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class AutoAssignAction extends UserSelectionAction { - private final Logger log = Logger.getLogger(AutoAssignAction.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(AutoAssignAction.class); @Autowired(required = true) protected GroupService groupService; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/UserSelectionAction.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/UserSelectionAction.java index b80496ab4a..bbeb7cd173 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/UserSelectionAction.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/UserSelectionAction.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.sql.SQLException; import javax.servlet.http.HttpServletRequest; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Context; import org.dspace.xmlworkflow.RoleMembers; @@ -36,7 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public abstract class UserSelectionAction extends Action { - protected Logger log = Logger.getLogger(UserSelectionAction.class); + protected Logger log = org.apache.logging.log4j.LogManager.getLogger(UserSelectionAction.class); public abstract boolean isFinished(XmlWorkflowItem wfi); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/XmlWorkflowItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/XmlWorkflowItemServiceImpl.java index 975719e800..7641c95403 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/XmlWorkflowItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/XmlWorkflowItemServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Item; @@ -52,7 +52,7 @@ public class XmlWorkflowItemServiceImpl implements XmlWorkflowItemService { /* * The current step in the workflow system in which this workflow item is present */ - private Logger log = Logger.getLogger(XmlWorkflowItemServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlWorkflowItemServiceImpl.class); protected XmlWorkflowItemServiceImpl() { diff --git a/dspace-api/src/test/java/org/dspace/AbstractDSpaceTest.java b/dspace-api/src/test/java/org/dspace/AbstractDSpaceTest.java index f62db49e4c..7326b7188e 100644 --- a/dspace-api/src/test/java/org/dspace/AbstractDSpaceTest.java +++ b/dspace-api/src/test/java/org/dspace/AbstractDSpaceTest.java @@ -16,7 +16,7 @@ import java.util.Properties; import java.util.TimeZone; import mockit.integration.junit4.JMockit; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.MockUtil; import org.dspace.servicemanager.DSpaceKernelImpl; import org.dspace.servicemanager.DSpaceKernelInit; @@ -50,7 +50,7 @@ public class AbstractDSpaceTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractDSpaceTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceTest.class); /** * Test properties. These configure our general test environment diff --git a/dspace-api/src/test/java/org/dspace/AbstractUnitTest.java b/dspace-api/src/test/java/org/dspace/AbstractUnitTest.java index c008b76d17..cf8a50fcf6 100644 --- a/dspace-api/src/test/java/org/dspace/AbstractUnitTest.java +++ b/dspace-api/src/test/java/org/dspace/AbstractUnitTest.java @@ -11,7 +11,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -43,7 +43,7 @@ public class AbstractUnitTest extends AbstractDSpaceTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractUnitTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractUnitTest.class); /** * Context mock object to use in the tests. diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/DSpaceCSVTest.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/DSpaceCSVTest.java index c4261f0b02..1ddba1a011 100644 --- a/dspace-api/src/test/java/org/dspace/app/bulkedit/DSpaceCSVTest.java +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/DSpaceCSVTest.java @@ -18,7 +18,7 @@ import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.junit.Test; @@ -32,7 +32,7 @@ public class DSpaceCSVTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(DSpaceCSVTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceCSVTest.class); /** * Test the reading and parsing of CSV files diff --git a/dspace-api/src/test/java/org/dspace/app/util/GoogleMetadataTest.java b/dspace-api/src/test/java/org/dspace/app/util/GoogleMetadataTest.java index a03b46ad57..3a64c5482c 100644 --- a/dspace-api/src/test/java/org/dspace/app/util/GoogleMetadataTest.java +++ b/dspace-api/src/test/java/org/dspace/app/util/GoogleMetadataTest.java @@ -15,7 +15,7 @@ import java.io.IOException; import java.sql.SQLException; import org.apache.commons.io.Charsets; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; @@ -37,7 +37,7 @@ public class GoogleMetadataTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(GoogleMetadataTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleMetadataTest.class); /** * Item instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/BitstreamFormatTest.java b/dspace-api/src/test/java/org/dspace/content/BitstreamFormatTest.java index 07b83c3755..c12234635c 100644 --- a/dspace-api/src/test/java/org/dspace/content/BitstreamFormatTest.java +++ b/dspace-api/src/test/java/org/dspace/content/BitstreamFormatTest.java @@ -22,7 +22,7 @@ import java.util.Collections; import java.util.List; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeServiceImpl; @@ -45,7 +45,7 @@ public class BitstreamFormatTest extends AbstractUnitTest { /** * log4j category */ - private final static Logger log = Logger.getLogger(BitstreamFormatTest.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamFormatTest.class); /** * Object to use in the tests diff --git a/dspace-api/src/test/java/org/dspace/content/BitstreamTest.java b/dspace-api/src/test/java/org/dspace/content/BitstreamTest.java index fd46c3ec17..b390de4598 100644 --- a/dspace-api/src/test/java/org/dspace/content/BitstreamTest.java +++ b/dspace-api/src/test/java/org/dspace/content/BitstreamTest.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamFormatService; @@ -43,7 +43,7 @@ public class BitstreamTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(BitstreamTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamTest.class); protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() diff --git a/dspace-api/src/test/java/org/dspace/content/BundleTest.java b/dspace-api/src/test/java/org/dspace/content/BundleTest.java index 09ca44ada1..abd9ce6947 100644 --- a/dspace-api/src/test/java/org/dspace/content/BundleTest.java +++ b/dspace-api/src/test/java/org/dspace/content/BundleTest.java @@ -29,7 +29,7 @@ import java.util.UUID; import mockit.NonStrictExpectations; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.core.Constants; @@ -47,7 +47,7 @@ public class BundleTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(BundleTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BundleTest.class); /** * Bundle instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/CollectionTest.java b/dspace-api/src/test/java/org/dspace/content/CollectionTest.java index 1e05353dcf..48f16dcbfe 100644 --- a/dspace-api/src/test/java/org/dspace/content/CollectionTest.java +++ b/dspace-api/src/test/java/org/dspace/content/CollectionTest.java @@ -25,7 +25,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Constants; @@ -48,7 +48,7 @@ public class CollectionTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(CollectionTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionTest.class); private LicenseService licenseService = CoreServiceFactory.getInstance().getLicenseService(); diff --git a/dspace-api/src/test/java/org/dspace/content/CommunityTest.java b/dspace-api/src/test/java/org/dspace/content/CommunityTest.java index 65bf7f6f73..e15e567520 100644 --- a/dspace-api/src/test/java/org/dspace/content/CommunityTest.java +++ b/dspace-api/src/test/java/org/dspace/content/CommunityTest.java @@ -25,7 +25,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Constants; @@ -45,7 +45,7 @@ public class CommunityTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(CommunityTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CommunityTest.class); /** * Community instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/DCDateTest.java b/dspace-api/src/test/java/org/dspace/content/DCDateTest.java index da4d444c58..e827fb4434 100644 --- a/dspace-api/src/test/java/org/dspace/content/DCDateTest.java +++ b/dspace-api/src/test/java/org/dspace/content/DCDateTest.java @@ -19,7 +19,7 @@ import java.util.Locale; import java.util.TimeZone; import org.apache.commons.lang3.time.DateUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -31,7 +31,7 @@ public class DCDateTest { /** * log4j category */ - private static Logger log = Logger.getLogger(DCDateTest.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DCDateTest.class); /** * Object to use in the tests diff --git a/dspace-api/src/test/java/org/dspace/content/FormatIdentifierTest.java b/dspace-api/src/test/java/org/dspace/content/FormatIdentifierTest.java index eb2b79c9dd..4e0711aac0 100644 --- a/dspace-api/src/test/java/org/dspace/content/FormatIdentifierTest.java +++ b/dspace-api/src/test/java/org/dspace/content/FormatIdentifierTest.java @@ -14,7 +14,7 @@ import static org.junit.Assert.assertThat; import java.io.File; import java.io.FileInputStream; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamFormatService; @@ -33,7 +33,7 @@ public class FormatIdentifierTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(FormatIdentifierTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(FormatIdentifierTest.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() diff --git a/dspace-api/src/test/java/org/dspace/content/ITCommunityCollection.java b/dspace-api/src/test/java/org/dspace/content/ITCommunityCollection.java index 2d7271896d..e7f9c29794 100644 --- a/dspace-api/src/test/java/org/dspace/content/ITCommunityCollection.java +++ b/dspace-api/src/test/java/org/dspace/content/ITCommunityCollection.java @@ -19,7 +19,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractIntegrationTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -51,7 +51,7 @@ public class ITCommunityCollection extends AbstractIntegrationTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ITCommunityCollection.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ITCommunityCollection.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/ITMetadata.java b/dspace-api/src/test/java/org/dspace/content/ITMetadata.java index e8bc5e5414..10afd4d85f 100644 --- a/dspace-api/src/test/java/org/dspace/content/ITMetadata.java +++ b/dspace-api/src/test/java/org/dspace/content/ITMetadata.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractIntegrationTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -40,7 +40,7 @@ public class ITMetadata extends AbstractIntegrationTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ITMetadata.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ITMetadata.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); diff --git a/dspace-api/src/test/java/org/dspace/content/InProgressSubmissionTest.java b/dspace-api/src/test/java/org/dspace/content/InProgressSubmissionTest.java index 28f56a790a..78be99bb01 100644 --- a/dspace-api/src/test/java/org/dspace/content/InProgressSubmissionTest.java +++ b/dspace-api/src/test/java/org/dspace/content/InProgressSubmissionTest.java @@ -7,7 +7,7 @@ */ package org.dspace.content; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.junit.After; import org.junit.Before; @@ -26,7 +26,7 @@ public class InProgressSubmissionTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(InProgressSubmissionTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(InProgressSubmissionTest.class); /** * This method will be run before every test as per @Before. It will diff --git a/dspace-api/src/test/java/org/dspace/content/InstallItemTest.java b/dspace-api/src/test/java/org/dspace/content/InstallItemTest.java index 72a7f626b8..129727bd14 100644 --- a/dspace-api/src/test/java/org/dspace/content/InstallItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/InstallItemTest.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.TimeZone; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -60,7 +60,7 @@ public class InstallItemTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(InstallItemTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(InstallItemTest.class); /** * Used to check/verify thrown exceptions in below tests diff --git a/dspace-api/src/test/java/org/dspace/content/ItemComparatorTest.java b/dspace-api/src/test/java/org/dspace/content/ItemComparatorTest.java index 71fdcb41e8..73c8bc0eb5 100644 --- a/dspace-api/src/test/java/org/dspace/content/ItemComparatorTest.java +++ b/dspace-api/src/test/java/org/dspace/content/ItemComparatorTest.java @@ -14,7 +14,7 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -40,7 +40,7 @@ public class ItemComparatorTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ItemComparatorTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemComparatorTest.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/ItemTest.java b/dspace-api/src/test/java/org/dspace/content/ItemTest.java index 13d1e42d15..c337b1e46b 100644 --- a/dspace-api/src/test/java/org/dspace/content/ItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/ItemTest.java @@ -30,7 +30,7 @@ import java.util.UUID; import mockit.NonStrictExpectations; import org.apache.commons.lang3.time.DateUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; @@ -56,7 +56,7 @@ public class ItemTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ItemTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemTest.class); /** * Item instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/LicenseUtilsTest.java b/dspace-api/src/test/java/org/dspace/content/LicenseUtilsTest.java index c1dee50994..ab96d0cde3 100644 --- a/dspace-api/src/test/java/org/dspace/content/LicenseUtilsTest.java +++ b/dspace-api/src/test/java/org/dspace/content/LicenseUtilsTest.java @@ -20,7 +20,7 @@ import java.util.Locale; import java.util.Map; import org.apache.commons.io.IOUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -49,7 +49,7 @@ public class LicenseUtilsTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(LicenseUtilsTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseUtilsTest.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataFieldTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataFieldTest.java index b41e8acd97..55c5315bb0 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataFieldTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataFieldTest.java @@ -18,7 +18,7 @@ import java.sql.SQLException; import java.util.List; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -38,7 +38,7 @@ public class MetadataFieldTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(MetadataFieldTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataFieldTest.class); /** * MetadataField instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataSchemaTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataSchemaTest.java index 35a82a9cec..13f7468543 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataSchemaTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataSchemaTest.java @@ -19,7 +19,7 @@ import java.sql.SQLException; import java.util.List; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -37,7 +37,7 @@ public class MetadataSchemaTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(MetadataSchemaTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataSchemaTest.class); /** * MetadataSchema instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataValueTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataValueTest.java index bee228aa05..947720ef87 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataValueTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataValueTest.java @@ -18,7 +18,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -42,7 +42,7 @@ public class MetadataValueTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(MetadataValueTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataValueTest.class); /** * MetadataValue instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java b/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java index 52a8e0fe17..2ba4aa44e2 100644 --- a/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java +++ b/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java @@ -9,7 +9,7 @@ package org.dspace.content; import static org.junit.Assert.assertTrue; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.junit.Test; /** @@ -23,7 +23,7 @@ public class NonUniqueMetadataExceptionTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(NonUniqueMetadataExceptionTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(NonUniqueMetadataExceptionTest.class); /** * Dummy test to avoid initialization errors diff --git a/dspace-api/src/test/java/org/dspace/content/SiteTest.java b/dspace-api/src/test/java/org/dspace/content/SiteTest.java index f0d0e4243c..421ce4b1bc 100644 --- a/dspace-api/src/test/java/org/dspace/content/SiteTest.java +++ b/dspace-api/src/test/java/org/dspace/content/SiteTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; @@ -35,7 +35,7 @@ public class SiteTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(SiteTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SiteTest.class); /** * Site instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/SupervisedItemTest.java b/dspace-api/src/test/java/org/dspace/content/SupervisedItemTest.java index f0c289442b..406b8ab1b3 100644 --- a/dspace-api/src/test/java/org/dspace/content/SupervisedItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/SupervisedItemTest.java @@ -18,7 +18,7 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -45,7 +45,7 @@ public class SupervisedItemTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(SupervisedItemTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SupervisedItemTest.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/ThumbnailTest.java b/dspace-api/src/test/java/org/dspace/content/ThumbnailTest.java index a350d3d0b8..93e231da1d 100644 --- a/dspace-api/src/test/java/org/dspace/content/ThumbnailTest.java +++ b/dspace-api/src/test/java/org/dspace/content/ThumbnailTest.java @@ -15,7 +15,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; @@ -34,7 +34,7 @@ public class ThumbnailTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ThumbnailTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ThumbnailTest.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); diff --git a/dspace-api/src/test/java/org/dspace/content/VersioningTest.java b/dspace-api/src/test/java/org/dspace/content/VersioningTest.java index 00ad114097..f66619f615 100644 --- a/dspace-api/src/test/java/org/dspace/content/VersioningTest.java +++ b/dspace-api/src/test/java/org/dspace/content/VersioningTest.java @@ -16,7 +16,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -47,7 +47,7 @@ import org.junit.Test; */ public class VersioningTest extends AbstractUnitTest { - private static final Logger log = Logger.getLogger(VersioningTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(VersioningTest.class); private String originalHandle; private Item originalItem; diff --git a/dspace-api/src/test/java/org/dspace/content/WorkspaceItemTest.java b/dspace-api/src/test/java/org/dspace/content/WorkspaceItemTest.java index 02a2953498..250ff35090 100644 --- a/dspace-api/src/test/java/org/dspace/content/WorkspaceItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/WorkspaceItemTest.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -48,7 +48,7 @@ public class WorkspaceItemTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(WorkspaceItemTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkspaceItemTest.class); /** * WorkspaceItem instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/packager/ITDSpaceAIP.java b/dspace-api/src/test/java/org/dspace/content/packager/ITDSpaceAIP.java index 9ea23718b7..963da2bfab 100644 --- a/dspace-api/src/test/java/org/dspace/content/packager/ITDSpaceAIP.java +++ b/dspace-api/src/test/java/org/dspace/content/packager/ITDSpaceAIP.java @@ -23,7 +23,7 @@ import java.util.Iterator; import java.util.List; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; @@ -80,7 +80,7 @@ public class ITDSpaceAIP extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ITDSpaceAIP.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ITDSpaceAIP.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/packager/PackageUtilsTest.java b/dspace-api/src/test/java/org/dspace/content/packager/PackageUtilsTest.java index a0b21f8221..c33c5d25d8 100644 --- a/dspace-api/src/test/java/org/dspace/content/packager/PackageUtilsTest.java +++ b/dspace-api/src/test/java/org/dspace/content/packager/PackageUtilsTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; @@ -44,7 +44,7 @@ import org.junit.Test; * for the University of Waikato's Institutional Research Repositories */ public class PackageUtilsTest extends AbstractUnitTest { - private static final Logger log = Logger.getLogger(PackageUtilsTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PackageUtilsTest.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/eperson/EPersonTest.java b/dspace-api/src/test/java/org/dspace/eperson/EPersonTest.java index 5e5e9c0fcc..8950bfa409 100644 --- a/dspace-api/src/test/java/org/dspace/eperson/EPersonTest.java +++ b/dspace-api/src/test/java/org/dspace/eperson/EPersonTest.java @@ -14,7 +14,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; import org.apache.commons.codec.DecoderException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Constants; @@ -28,7 +28,7 @@ import org.junit.Test; */ public class EPersonTest extends AbstractUnitTest { protected EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); - private static final Logger log = Logger.getLogger(EPersonTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(EPersonTest.class); public EPersonTest() { diff --git a/dspace-api/src/test/java/org/dspace/eperson/GroupTest.java b/dspace-api/src/test/java/org/dspace/eperson/GroupTest.java index 2dbd4c1428..d2cd08af72 100644 --- a/dspace-api/src/test/java/org/dspace/eperson/GroupTest.java +++ b/dspace-api/src/test/java/org/dspace/eperson/GroupTest.java @@ -21,7 +21,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.eperson.factory.EPersonServiceFactory; @@ -38,7 +38,7 @@ import org.junit.Test; */ public class GroupTest extends AbstractUnitTest { - private static final Logger log = Logger.getLogger(GroupTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(GroupTest.class); //TODO: test duplicate names ? diff --git a/dspace-api/src/test/java/org/dspace/handle/dao/impl/HandleDAOImplTest.java b/dspace-api/src/test/java/org/dspace/handle/dao/impl/HandleDAOImplTest.java index 8285e2552d..1560a5d04c 100644 --- a/dspace-api/src/test/java/org/dspace/handle/dao/impl/HandleDAOImplTest.java +++ b/dspace-api/src/test/java/org/dspace/handle/dao/impl/HandleDAOImplTest.java @@ -13,7 +13,7 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; @@ -46,7 +46,7 @@ public class HandleDAOImplTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(HandleDAOImplTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleDAOImplTest.class); /** * Item instances for the tests diff --git a/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java b/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java index a27315d1f7..c1c7b8ee7d 100644 --- a/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java +++ b/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Random; import org.apache.commons.lang3.ObjectUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; @@ -58,7 +58,7 @@ public class DOIIdentifierProviderTest /** * log4j category */ - private static final Logger log = Logger.getLogger(DOIIdentifierProviderTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DOIIdentifierProviderTest.class); private static final String PREFIX = "10.5072"; private static final String NAMESPACE_SEPARATOR = "dspaceUnitTests-"; diff --git a/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java b/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java index 496620e941..e2128669e9 100644 --- a/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java +++ b/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java @@ -466,7 +466,7 @@ public class EZIDIdentifierProviderTest PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); System.out.println(sw.toString()); - org.apache.log4j.Logger.getLogger(EZIDIdentifierProviderTest.class).fatal("Caught NPE", ex); + org.apache.logging.log4j.org.apache.logging.log4j.LogManager.getLogger(EZIDIdentifierProviderTest.class).fatal("Caught NPE", ex); throw ex; } } diff --git a/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationIT.java b/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationIT.java index 1bf2bc1ba8..e38f153d8f 100644 --- a/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationIT.java +++ b/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationIT.java @@ -12,7 +12,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractDSpaceTest; import org.dspace.AbstractIntegrationTest; import org.dspace.authorize.AuthorizeException; @@ -62,7 +62,7 @@ public class BasicWorkflowAuthorizationIT /** * log4j category */ - private static final Logger log = Logger.getLogger(BasicWorkflowAuthorizationIT.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicWorkflowAuthorizationIT.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationRolesIT.java b/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationRolesIT.java index cdaf38077d..83647738ea 100644 --- a/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationRolesIT.java +++ b/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationRolesIT.java @@ -17,7 +17,7 @@ import java.util.Date; import java.util.HashMap; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractDSpaceTest; import org.dspace.AbstractIntegrationTest; import org.dspace.authorize.AuthorizeException; @@ -65,7 +65,7 @@ public class BasicWorkflowAuthorizationRolesIT /** * log4j category */ - private static final Logger log = Logger.getLogger(BasicWorkflowAuthorizationIT.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicWorkflowAuthorizationIT.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/resources/log4j.properties b/dspace-api/src/test/resources/log4j.properties index 93a4ec7ff5..4e7fbff3e3 100644 --- a/dspace-api/src/test/resources/log4j.properties +++ b/dspace-api/src/test/resources/log4j.properties @@ -19,10 +19,10 @@ log4j.rootCategory=INFO, A1 # A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1=org.apache.logging.log4j.ConsoleAppender # A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n # block passwords from being exposed in Axis logs. @@ -44,9 +44,9 @@ log4j.logger.org.dspace.servicemanager=ERROR log4j.logger.org.dspace.providers=ERROR log4j.logger.org.dspace.utils=ERROR -log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout=org.apache.logging.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout=org.apache.logging.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # # Root logger option diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java b/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java index 2edac1ce43..bc83483d7b 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java @@ -8,7 +8,7 @@ package org.dspace.xoai.app; import com.lyncode.xoai.dataprovider.services.api.ResourceResolver; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.xoai.services.api.CollectionsService; import org.dspace.xoai.services.api.EarliestDateResolver; import org.dspace.xoai.services.api.FieldResolver; @@ -49,7 +49,7 @@ import org.springframework.context.annotation.Configuration; @Configuration public class BasicConfiguration { - private static final Logger log = Logger.getLogger(BasicConfiguration.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicConfiguration.class); @Bean public ConfigurationService configurationService() { diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java index aff9195264..1697b8d6d8 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java @@ -34,8 +34,8 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.apache.solr.client.solrj.SolrServer; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java b/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java index 456785c1e4..43c79681ea 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java @@ -9,7 +9,7 @@ package org.dspace.xoai.controller; import static java.util.Arrays.asList; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; -import static org.apache.log4j.Logger.getLogger; +import static org.apache.logging.log4j.org.apache.logging.log4j.LogManager.getLogger; import java.io.IOException; import java.io.OutputStream; @@ -28,7 +28,7 @@ import com.lyncode.xoai.dataprovider.core.XOAIManager; import com.lyncode.xoai.dataprovider.exceptions.InvalidContextException; import com.lyncode.xoai.dataprovider.exceptions.OAIException; import com.lyncode.xoai.dataprovider.exceptions.WritingXmlException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.xoai.services.api.cache.XOAICacheService; import org.dspace.xoai.services.api.config.XOAIManagerResolver; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSolrItem.java b/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSolrItem.java index a9b5818f3d..76d7336531 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSolrItem.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSolrItem.java @@ -14,8 +14,8 @@ import java.util.List; import com.lyncode.xoai.dataprovider.core.ItemMetadata; import com.lyncode.xoai.dataprovider.core.ReferenceSet; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.solr.common.SolrDocument; /** diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java index 8e75857bad..63ff355650 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java @@ -17,8 +17,8 @@ import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterList; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.util.ClientUtils; import org.dspace.xoai.data.DSpaceItem; import org.dspace.xoai.filter.data.DSpaceMetadataFilterOperator; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java index 5b6bd3d1b4..ebb19c84b5 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java @@ -10,8 +10,8 @@ package org.dspace.xoai.filter; import java.sql.SQLException; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.Item; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java index bad0c4975a..ac9c81600a 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java @@ -12,8 +12,8 @@ import java.util.List; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.xoai.data.DSpaceItem; import org.dspace.xoai.filter.results.SolrFilterResult; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java index 502653a39c..b89056943b 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java @@ -8,8 +8,8 @@ package org.dspace.xoai.filter; import com.lyncode.xoai.dataprovider.core.ReferenceSet; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.util.ClientUtils; import org.dspace.xoai.data.DSpaceItem; import org.dspace.xoai.filter.results.SolrFilterResult; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/SolrFilterResult.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/SolrFilterResult.java index 37aa1b1c13..41a2a667c3 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/SolrFilterResult.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/SolrFilterResult.java @@ -7,8 +7,8 @@ */ package org.dspace.xoai.filter; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @author Lyncode Development Team (dspace at lyncode dot com) diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/results/SolrFilterResult.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/results/SolrFilterResult.java index 38d0716950..21425fdda4 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/filter/results/SolrFilterResult.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/results/SolrFilterResult.java @@ -7,8 +7,8 @@ */ package org.dspace.xoai.filter.results; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @author Lyncode Development Team (dspace at lyncode dot com) diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java index 01ec853539..de8dc0d4ad 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java @@ -10,8 +10,8 @@ package org.dspace.xoai.services.impl; import java.sql.SQLException; import java.util.Date; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.content.MetadataValue; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.MetadataValueService; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java index bdcab2bbf4..5db2ff4103 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java @@ -10,8 +10,8 @@ package org.dspace.xoai.services.impl; import java.util.HashMap; import java.util.Map; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @author Lyncode Development Team (dspace at lyncode dot com) diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java index fe71aacad7..c2a26b53b3 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java @@ -7,8 +7,8 @@ */ package org.dspace.xoai.services.impl.solr; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java index 43df0dca82..41c2f76663 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java @@ -17,7 +17,7 @@ import com.lyncode.xoai.dataprovider.filter.conditions.CustomCondition; import com.lyncode.xoai.dataprovider.filter.conditions.NotCondition; import com.lyncode.xoai.dataprovider.filter.conditions.OrCondition; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterMap; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.xoai.filter.AndFilter; import org.dspace.xoai.filter.DSpaceFilter; import org.dspace.xoai.filter.NotFilter; @@ -30,7 +30,7 @@ import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver; import org.springframework.beans.factory.annotation.Autowired; public class BaseDSpaceFilterResolver implements DSpaceFilterResolver { - private static final Logger LOGGER = Logger.getLogger(BaseDSpaceFilterResolver.class); + private static final Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger(BaseDSpaceFilterResolver.class); @Autowired FieldResolver fieldResolver; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java index 1836444369..9d36797e10 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java @@ -19,8 +19,8 @@ import com.lyncode.xoai.dataprovider.data.Item; import com.lyncode.xoai.dataprovider.data.ItemIdentifier; import com.lyncode.xoai.dataprovider.exceptions.IdDoesNotExistException; import com.lyncode.xoai.dataprovider.filter.ScopedFilter; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.common.SolrDocument; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java index d6cc49c286..979520c199 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java @@ -19,8 +19,8 @@ import com.lyncode.xoai.dataprovider.core.DeleteMethod; import com.lyncode.xoai.dataprovider.core.Granularity; import com.lyncode.xoai.dataprovider.services.api.RepositoryConfiguration; import org.apache.commons.io.FileUtils; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.xoai.exceptions.InvalidMetadataFieldException; import org.dspace.xoai.services.api.EarliestDateResolver; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceResumptionTokenFormatter.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceResumptionTokenFormatter.java index f79cd873ee..c51b11eabf 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceResumptionTokenFormatter.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceResumptionTokenFormatter.java @@ -12,8 +12,8 @@ import java.util.Date; import com.lyncode.xoai.dataprovider.core.ResumptionToken; import com.lyncode.xoai.dataprovider.exceptions.BadResumptionToken; import com.lyncode.xoai.dataprovider.services.api.ResumptionTokenFormatter; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.xoai.util.DateUtils; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java index 859f2390a8..c322c988a5 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java @@ -14,8 +14,8 @@ import java.util.List; import com.lyncode.xoai.dataprovider.core.ListSetsResult; import com.lyncode.xoai.dataprovider.core.Set; import com.lyncode.xoai.dataprovider.services.api.SetRepository; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java b/dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java index 975bb8ada6..365a718a92 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java @@ -8,8 +8,8 @@ package org.dspace.xoai.solr; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/util/DateUtils.java b/dspace-oai/src/main/java/org/dspace/xoai/util/DateUtils.java index 611d0692f7..9ecef225a0 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/util/DateUtils.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/util/DateUtils.java @@ -13,8 +13,8 @@ import java.util.Date; import java.util.Locale; import java.util.TimeZone; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @author Lyncode Development Team (dspace at lyncode dot com) diff --git a/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java b/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java index 1faee45890..10bbc61e70 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java @@ -16,8 +16,8 @@ import java.util.List; import com.lyncode.xoai.dataprovider.xml.xoai.Element; import com.lyncode.xoai.dataprovider.xml.xoai.Metadata; import com.lyncode.xoai.util.Base64Utils; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.factory.UtilServiceFactory; import org.dspace.app.util.service.MetadataExposureService; import org.dspace.authorize.AuthorizeException; diff --git a/dspace-oai/src/main/java/org/dspace/xoai/util/URLUtils.java b/dspace-oai/src/main/java/org/dspace/xoai/util/URLUtils.java index c0ddf3e701..f7661d5908 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/util/URLUtils.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/util/URLUtils.java @@ -9,8 +9,8 @@ package org.dspace.xoai.util; import java.io.UnsupportedEncodingException; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.core.Constants; diff --git a/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java b/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java index e5a757f9db..526f138a71 100644 --- a/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java +++ b/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java @@ -18,7 +18,7 @@ import javax.servlet.http.HttpServletResponse; import com.hp.hpl.jena.rdf.model.Model; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; import org.dspace.handle.factory.HandleServiceFactory; @@ -33,7 +33,7 @@ public class DataProviderServlet extends HttpServlet { protected static final String DEFAULT_LANG = "TURTLE"; - private static final Logger log = Logger.getLogger(DataProviderServlet.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DataProviderServlet.class); protected final transient HandleService handleService = HandleServiceFactory.getInstance().getHandleService(); diff --git a/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java b/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java index 0cb3c7bdc0..b6a6854938 100644 --- a/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java +++ b/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java @@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; import org.dspace.handle.factory.HandleServiceFactory; @@ -28,7 +28,7 @@ import org.dspace.rdf.negotiation.Negotiator; public class LocalURIRedirectionServlet extends HttpServlet { public static final String ACCEPT_HEADER_NAME = "Accept"; - private final static Logger log = Logger.getLogger(LocalURIRedirectionServlet.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(LocalURIRedirectionServlet.class); protected final transient HandleService handleService = HandleServiceFactory.getInstance().getHandleService(); diff --git a/dspace-rest/src/main/java/org/dspace/rest/BitstreamResource.java b/dspace-rest/src/main/java/org/dspace/rest/BitstreamResource.java index eb96a53185..3a6ad85960 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/BitstreamResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/BitstreamResource.java @@ -32,7 +32,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -69,7 +69,7 @@ public class BitstreamResource extends Resource { .getResourcePolicyService(); protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService(); - private static Logger log = Logger.getLogger(BitstreamResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamResource.class); /** * Return bitstream properties without file data. It can throw diff --git a/dspace-rest/src/main/java/org/dspace/rest/CollectionsResource.java b/dspace-rest/src/main/java/org/dspace/rest/CollectionsResource.java index 7d5fd4c015..af06792b7b 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/CollectionsResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/CollectionsResource.java @@ -29,7 +29,7 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -60,7 +60,7 @@ public class CollectionsResource extends Resource { protected WorkspaceItemService workspaceItemService = ContentServiceFactory.getInstance().getWorkspaceItemService(); protected WorkflowService workflowService = WorkflowServiceFactory.getInstance().getWorkflowService(); - private static Logger log = Logger.getLogger(CollectionsResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionsResource.class); /** * Return instance of collection with passed id. You can add more properties diff --git a/dspace-rest/src/main/java/org/dspace/rest/CommunitiesResource.java b/dspace-rest/src/main/java/org/dspace/rest/CommunitiesResource.java index 331ae4cfd5..5ac25d69e9 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/CommunitiesResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/CommunitiesResource.java @@ -28,7 +28,7 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -51,7 +51,7 @@ public class CommunitiesResource extends Resource { protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); - private static Logger log = Logger.getLogger(CommunitiesResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CommunitiesResource.class); /** * Returns community with basic properties. If you want more, use expand diff --git a/dspace-rest/src/main/java/org/dspace/rest/FilteredCollectionsResource.java b/dspace-rest/src/main/java/org/dspace/rest/FilteredCollectionsResource.java index 7312e5c4b7..133ed50d9c 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/FilteredCollectionsResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/FilteredCollectionsResource.java @@ -24,7 +24,7 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.factory.ContentServiceFactory; @@ -45,7 +45,7 @@ public class FilteredCollectionsResource extends Resource { protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); - private static Logger log = Logger.getLogger(FilteredCollectionsResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(FilteredCollectionsResource.class); /** * Return array of all collections in DSpace. You can add more properties diff --git a/dspace-rest/src/main/java/org/dspace/rest/FilteredItemsResource.java b/dspace-rest/src/main/java/org/dspace/rest/FilteredItemsResource.java index 5129bce840..0f4331adc5 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/FilteredItemsResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/FilteredItemsResource.java @@ -25,7 +25,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Item; import org.dspace.content.MetadataField; @@ -58,7 +58,7 @@ public class FilteredItemsResource extends Resource { protected SiteService siteService = ContentServiceFactory.getInstance().getSiteService(); protected ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); - private static Logger log = Logger.getLogger(FilteredItemsResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(FilteredItemsResource.class); /** * Return instance of collection with passed id. You can add more properties diff --git a/dspace-rest/src/main/java/org/dspace/rest/FiltersResource.java b/dspace-rest/src/main/java/org/dspace/rest/FiltersResource.java index 904d62c6c8..bff755f2de 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/FiltersResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/FiltersResource.java @@ -17,7 +17,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rest.common.ItemFilter; /** @@ -27,7 +27,7 @@ import org.dspace.rest.common.ItemFilter; */ @Path("/filters") public class FiltersResource { - private static Logger log = Logger.getLogger(FiltersResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(FiltersResource.class); /** * Return all Use Case Item Filters in DSpace. diff --git a/dspace-rest/src/main/java/org/dspace/rest/HandleResource.java b/dspace-rest/src/main/java/org/dspace/rest/HandleResource.java index 71a3b8a084..51436a1c00 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/HandleResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/HandleResource.java @@ -18,7 +18,7 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.factory.ContentServiceFactory; @@ -44,7 +44,7 @@ public class HandleResource extends Resource { protected HandleService handleService = HandleServiceFactory.getInstance().getHandleService(); protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); - private static Logger log = Logger.getLogger(HandleResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleResource.class); @GET @Path("/{prefix}/{suffix}") diff --git a/dspace-rest/src/main/java/org/dspace/rest/HierarchyResource.java b/dspace-rest/src/main/java/org/dspace/rest/HierarchyResource.java index 716f361f76..b2ffc559b0 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/HierarchyResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/HierarchyResource.java @@ -21,7 +21,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.Collection; @@ -45,7 +45,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; @Path("/hierarchy") @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public class HierarchyResource extends Resource { - private static Logger log = Logger.getLogger(HierarchyResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HierarchyResource.class); protected SiteService siteService = ContentServiceFactory.getInstance().getSiteService(); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); diff --git a/dspace-rest/src/main/java/org/dspace/rest/ItemsResource.java b/dspace-rest/src/main/java/org/dspace/rest/ItemsResource.java index 84dd35e9a9..615aacac21 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/ItemsResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/ItemsResource.java @@ -32,7 +32,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -72,7 +72,7 @@ public class ItemsResource extends Resource { .getResourcePolicyService(); protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService(); - private static final Logger log = Logger.getLogger(ItemsResource.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemsResource.class); /** * Return item properties without metadata and bitstreams. You can add diff --git a/dspace-rest/src/main/java/org/dspace/rest/MetadataRegistryResource.java b/dspace-rest/src/main/java/org/dspace/rest/MetadataRegistryResource.java index 333f611f6c..79e655e63d 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/MetadataRegistryResource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/MetadataRegistryResource.java @@ -28,7 +28,7 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -70,7 +70,7 @@ public class MetadataRegistryResource extends Resource { protected MetadataSchemaService metadataSchemaService = ContentServiceFactory.getInstance() .getMetadataSchemaService(); protected SiteService siteService = ContentServiceFactory.getInstance().getSiteService(); - private static Logger log = Logger.getLogger(MetadataRegistryResource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataRegistryResource.class); /** * Return all metadata registry items in DSpace. diff --git a/dspace-rest/src/main/java/org/dspace/rest/Resource.java b/dspace-rest/src/main/java/org/dspace/rest/Resource.java index 65fdbd2048..7a7624fef0 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/Resource.java +++ b/dspace-rest/src/main/java/org/dspace/rest/Resource.java @@ -16,7 +16,7 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; import org.dspace.eperson.factory.EPersonServiceFactory; @@ -40,7 +40,7 @@ public class Resource { @javax.ws.rs.core.Context public ServletContext servletContext; - private static Logger log = Logger.getLogger(Resource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Resource.class); private static final boolean writeStatistics; diff --git a/dspace-rest/src/main/java/org/dspace/rest/RestIndex.java b/dspace-rest/src/main/java/org/dspace/rest/RestIndex.java index dfb5e2bb39..c09e924536 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/RestIndex.java +++ b/dspace-rest/src/main/java/org/dspace/rest/RestIndex.java @@ -23,7 +23,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authenticate.AuthenticationMethod; import org.dspace.authenticate.ShibAuthentication; import org.dspace.authenticate.factory.AuthenticateServiceFactory; @@ -44,7 +44,7 @@ import org.dspace.utils.DSpace; @Path("/") public class RestIndex { protected EPersonService epersonService = EPersonServiceFactory.getInstance().getEPersonService(); - private static Logger log = Logger.getLogger(RestIndex.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RestIndex.class); /** * Return html page with information about REST api. It contains methods all diff --git a/dspace-rest/src/main/java/org/dspace/rest/RestReports.java b/dspace-rest/src/main/java/org/dspace/rest/RestReports.java index dda44b5868..4af556b6f8 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/RestReports.java +++ b/dspace-rest/src/main/java/org/dspace/rest/RestReports.java @@ -20,7 +20,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rest.common.Report; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; @@ -34,7 +34,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ @Path("/reports") public class RestReports { - private static Logger log = Logger.getLogger(RestReports.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RestReports.class); protected ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); public static final String REST_RPT_URL = "rest.report-url."; diff --git a/dspace-rest/src/main/java/org/dspace/rest/authentication/DSpaceAuthenticationProvider.java b/dspace-rest/src/main/java/org/dspace/rest/authentication/DSpaceAuthenticationProvider.java index 65bedce85b..5d0bedb442 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/authentication/DSpaceAuthenticationProvider.java +++ b/dspace-rest/src/main/java/org/dspace/rest/authentication/DSpaceAuthenticationProvider.java @@ -13,7 +13,7 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authenticate.AuthenticationMethod; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; @@ -40,7 +40,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; */ public class DSpaceAuthenticationProvider implements AuthenticationProvider { - private static Logger log = Logger.getLogger(DSpaceAuthenticationProvider.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceAuthenticationProvider.class); protected AuthenticationService authenticationService = AuthenticateServiceFactory.getInstance() .getAuthenticationService(); diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Bitstream.java b/dspace-rest/src/main/java/org/dspace/rest/common/Bitstream.java index ecfc31ef26..7eb198990e 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/Bitstream.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/Bitstream.java @@ -14,7 +14,7 @@ import java.util.List; import javax.servlet.ServletContext; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bundle; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; @@ -35,7 +35,7 @@ public class Bitstream extends DSpaceObject { protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); protected BundleService bundleService = ContentServiceFactory.getInstance().getBundleService(); - Logger log = Logger.getLogger(Bitstream.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(Bitstream.class); private String bundleName; private String description; diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java b/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java index 9bb66dba20..5c2c9b817b 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java @@ -16,7 +16,7 @@ import javax.servlet.ServletContext; import javax.ws.rs.WebApplicationException; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; import org.dspace.content.service.CommunityService; @@ -36,7 +36,7 @@ public class Collection extends DSpaceObject { protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); - Logger log = Logger.getLogger(Collection.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(Collection.class); //Relationships private Bitstream logo; diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Community.java b/dspace-rest/src/main/java/org/dspace/rest/common/Community.java index 45d62ffe96..4f69eba0aa 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/Community.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/Community.java @@ -16,7 +16,7 @@ import javax.ws.rs.WebApplicationException; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.factory.ContentServiceFactory; @@ -37,7 +37,7 @@ public class Community extends DSpaceObject { protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); - private static Logger log = Logger.getLogger(Community.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Community.class); //Exandable relationships private Bitstream logo; diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java b/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java index 525b823301..c7ff0ef9b3 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java @@ -16,7 +16,7 @@ import javax.servlet.ServletContext; import javax.ws.rs.WebApplicationException; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; import org.dspace.content.service.CommunityService; @@ -34,7 +34,7 @@ public class FilteredCollection extends DSpaceObject { protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); - Logger log = Logger.getLogger(FilteredCollection.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(FilteredCollection.class); //Relationships private Community parentCommunity; diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Item.java b/dspace-rest/src/main/java/org/dspace/rest/common/Item.java index e336247736..3794153b7d 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/Item.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/Item.java @@ -16,7 +16,7 @@ import javax.ws.rs.WebApplicationException; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.factory.UtilServiceFactory; import org.dspace.app.util.service.MetadataExposureService; import org.dspace.authorize.factory.AuthorizeServiceFactory; @@ -43,7 +43,7 @@ public class Item extends DSpaceObject { .getMetadataExposureService(); protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); - Logger log = Logger.getLogger(Item.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(Item.class); String isArchived; String isWithdrawn; diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilter.java b/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilter.java index 6a1466eb35..bc5bd13134 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilter.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilter.java @@ -17,7 +17,7 @@ import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.factory.CoreServiceFactory; import org.dspace.rest.filter.ItemFilterDefs; @@ -32,7 +32,7 @@ import org.dspace.rest.filter.ItemFilterTest; */ @XmlRootElement(name = "item-filter") public class ItemFilter { - static Logger log = Logger.getLogger(ItemFilter.class); + static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilter.class); private ItemFilterTest itemFilterTest = null; private String filterName = ""; diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilterQuery.java b/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilterQuery.java index 448d3a8cfc..6f56e2b44c 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilterQuery.java +++ b/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilterQuery.java @@ -11,7 +11,7 @@ import javax.ws.rs.WebApplicationException; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Metadata Query for DSpace Items using the REST API @@ -20,7 +20,7 @@ import org.apache.log4j.Logger; */ @XmlRootElement(name = "item-filter-query") public class ItemFilterQuery { - Logger log = Logger.getLogger(ItemFilterQuery.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterQuery.class); private String field = ""; private String operation = ""; diff --git a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsMeta.java b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsMeta.java index 278c0c8a1e..96a866357d 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsMeta.java +++ b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsMeta.java @@ -9,7 +9,7 @@ package org.dspace.rest.filter; import java.util.regex.Pattern; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.ItemService; @@ -24,7 +24,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; public class ItemFilterDefsMeta implements ItemFilterList { protected static ItemService itemService = ContentServiceFactory.getInstance().getItemService(); - static Logger log = Logger.getLogger(ItemFilterDefsMeta.class); + static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterDefsMeta.class); public static final String CAT_META_GEN = "General Metadata Filters"; public static final String CAT_META_SPEC = "Specific Metadata Filters"; diff --git a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsPerm.java b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsPerm.java index daa5d022b2..9e80f31196 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsPerm.java +++ b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsPerm.java @@ -9,7 +9,7 @@ package org.dspace.rest.filter; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.Bitstream; @@ -26,7 +26,7 @@ import org.dspace.rest.filter.ItemFilterUtil.BundleName; public class ItemFilterDefsPerm implements ItemFilterList { protected static AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); public static final String CAT_PERM = "Perimission Filters"; - private static Logger log = Logger.getLogger(ItemFilterDefsPerm.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterDefsPerm.class); public ItemFilterDefsPerm() { } diff --git a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterSet.java b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterSet.java index 837ed4ee4b..f70bc9664d 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterSet.java +++ b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterSet.java @@ -14,7 +14,7 @@ import java.util.List; import javax.servlet.ServletContext; import javax.ws.rs.WebApplicationException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.core.Context; @@ -28,7 +28,7 @@ import org.dspace.rest.common.ItemFilter; */ public class ItemFilterSet { protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); - static Logger log = Logger.getLogger(ItemFilterSet.class); + static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterSet.class); private List itemFilters; private ItemFilter allFiltersFilter; diff --git a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterUtil.java b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterUtil.java index d6d68ba6a7..ddb75f0db8 100644 --- a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterUtil.java +++ b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterUtil.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.regex.Pattern; import com.ibm.icu.util.Calendar; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Item; @@ -25,7 +25,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; public class ItemFilterUtil { protected static ItemService itemService = ContentServiceFactory.getInstance().getItemService(); - static Logger log = Logger.getLogger(ItemFilterUtil.class); + static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterUtil.class); public enum BundleName { ORIGINAL, TEXT, LICENSE, THUMBNAIL } diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java index 0deaba1ac5..aa603fc295 100644 --- a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java +++ b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java @@ -7,7 +7,7 @@ */ package org.dspace.servicemanager.example; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.services.model.Event; import org.dspace.services.model.EventListener; diff --git a/dspace-services/src/test/resources/log4j.properties b/dspace-services/src/test/resources/log4j.properties index f90d80b3ad..7dbc0a3bd0 100644 --- a/dspace-services/src/test/resources/log4j.properties +++ b/dspace-services/src/test/resources/log4j.properties @@ -1,7 +1,7 @@ log4j.rootCategory=info log4j.rootLogger=info, stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout=org.apache.logging.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.logging.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %p %m [%d] (%F:%L) %n diff --git a/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java b/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java index a177e2db32..6281c471ad 100644 --- a/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java +++ b/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java @@ -15,13 +15,13 @@ import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; -import org.apache.log4j.Hierarchy; -import org.apache.log4j.Level; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.helpers.Loader; -import org.apache.log4j.spi.Configurator; -import org.apache.log4j.spi.RootLogger; -import org.apache.log4j.xml.DOMConfigurator; +import org.apache.logging.log4j.Hierarchy; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.PropertyConfigurator; +import org.apache.logging.log4j.helpers.Loader; +import org.apache.logging.log4j.spi.Configurator; +import org.apache.logging.log4j.spi.RootLogger; +import org.apache.logging.log4j.xml.DOMConfigurator; /** * Initialize Log4J at application startup. diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java index e60007d8ab..afb6a20f51 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java @@ -17,7 +17,7 @@ import javax.ws.rs.core.Response; import org.apache.catalina.connector.ClientAbortException; import org.apache.commons.lang3.tuple.Pair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.BitstreamRest; import org.dspace.app.rest.utils.ContextUtil; import org.dspace.app.rest.utils.MultipartFileSender; @@ -57,7 +57,7 @@ import org.springframework.web.bind.annotation.RestController; + "/{uuid:[0-9a-fxA-FX]{8}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{12}}/content") public class BitstreamContentRestController { - private static final Logger log = Logger.getLogger(BitstreamContentRestController.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamContentRestController.class); //Most file systems are configured to use block sizes of 4096 or 8192 and our buffer should be a multiple of that. private static final int BUFFER_SIZE = 4096 * 10; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index 31add4cbfe..6c29dc5283 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Objects; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.link.HalLinkService; import org.dspace.app.rest.model.FacetConfigurationRest; import org.dspace.app.rest.model.FacetResultsRest; @@ -47,7 +47,7 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/" + SearchResultsRest.CATEGORY) public class DiscoveryRestController implements InitializingBean { - private static final Logger log = Logger.getLogger(ScopeResolver.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ScopeResolver.class); @Autowired protected Utils utils; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index 864383d687..9e5c339455 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -28,7 +28,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.atteo.evo.inflector.English; import org.dspace.app.rest.converter.JsonPatchConverter; import org.dspace.app.rest.exception.PaginationException; @@ -111,7 +111,7 @@ public class RestResourceController implements InitializingBean { */ private static final String REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT = "/{id:\\d+}"; - private static final Logger log = Logger.getLogger(RestResourceController.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RestResourceController.class); @Autowired DiscoverableEndpointsService discoverableEndpointsService; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/BrowseEntryConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/BrowseEntryConverter.java index 7d093c0f9a..677ecc1549 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/BrowseEntryConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/BrowseEntryConverter.java @@ -7,7 +7,7 @@ */ package org.dspace.app.rest.converter; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.BrowseEntryRest; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; @@ -20,7 +20,7 @@ import org.springframework.stereotype.Component; */ @Component public class BrowseEntryConverter implements Converter { - private static final Logger log = Logger.getLogger(BrowseEntryConverter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BrowseEntryConverter.class); @Override public BrowseEntryRest convert(String[] source) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java index c432064b86..a4c368d2b4 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.UUID; import javax.servlet.http.HttpServletRequest; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.CollectionRest; import org.dspace.app.rest.model.ResourcePolicyRest; import org.dspace.app.rest.utils.ContextUtil; @@ -38,7 +38,7 @@ import org.springframework.stereotype.Component; public class CollectionConverter extends DSpaceObjectConverter { - private static final Logger log = Logger.getLogger(CollectionConverter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionConverter.class); @Autowired private BitstreamConverter bitstreamConverter; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java index 05632370f2..0e39d3a7fb 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.GroupRest; import org.dspace.core.Context; @@ -36,7 +36,7 @@ public class EPersonConverter extends DSpaceObjectConverter { - private static final Logger log = Logger.getLogger(GroupConverter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(GroupConverter.class); @Override public GroupRest fromModel(Group obj) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java index 51fb456d72..8c9743457c 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java @@ -10,7 +10,7 @@ package org.dspace.app.rest.converter; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.BitstreamRest; import org.dspace.app.rest.model.ItemRest; import org.dspace.content.Bitstream; @@ -33,7 +33,7 @@ public class ItemConverter extends DSpaceObjectConverter { - private static final Logger log = Logger.getLogger(SubmissionDefinitionConverter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionDefinitionConverter.class); @Autowired private SubmissionSectionConverter panelConverter; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionSectionConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionSectionConverter.java index 1a15e74d2b..33cf0303fa 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionSectionConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionSectionConverter.java @@ -7,7 +7,7 @@ */ package org.dspace.app.rest.converter; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.SubmissionSectionRest; import org.dspace.app.rest.model.SubmissionVisibilityRest; import org.dspace.app.rest.model.VisibilityEnum; @@ -25,7 +25,7 @@ import org.springframework.stereotype.Component; @Component public class SubmissionSectionConverter extends DSpaceConverter { - private static final Logger log = Logger.getLogger(SubmissionSectionConverter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionSectionConverter.class); private SubmissionConfigReader submissionConfigReader; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java index 752a220a6d..22cee05541 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.ErrorRest; import org.dspace.app.rest.model.SubmissionDefinitionRest; import org.dspace.app.rest.model.SubmissionSectionRest; @@ -37,7 +37,7 @@ import org.springframework.stereotype.Component; public class WorkspaceItemConverter extends DSpaceConverter { - private static final Logger log = Logger.getLogger(WorkspaceItemConverter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkspaceItemConverter.class); @Autowired private EPersonConverter epersonConverter; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java index 799623b7ff..2529d275ab 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java @@ -16,7 +16,7 @@ import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.hateoas.EmbeddedPage; import org.dspace.app.rest.model.hateoas.HALResource; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +33,7 @@ import org.springframework.stereotype.Component; @ComponentScan public class HalLinkService { - private static final Logger log = Logger.getLogger(HalLinkService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HalLinkService.class); @Autowired private List halLinkFactories; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java index e853121c6f..5248cf024f 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java @@ -14,7 +14,7 @@ import java.sql.SQLException; import javax.servlet.http.HttpServletRequest; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.exception.PatchBadRequestException; import org.dspace.app.rest.exception.RESTAuthorizationException; import org.dspace.app.rest.exception.RepositoryMethodNotImplementedException; @@ -44,7 +44,7 @@ public abstract class DSpaceRestRepository { - private static final Logger log = Logger.getLogger(DSpaceRestRepository.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceRestRepository.class); //Trick to make inner-calls to ourselves that are checked by Spring security //See: diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index fe76178100..ea2f70c469 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -11,7 +11,7 @@ import java.util.List; import javax.ws.rs.BadRequestException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.converter.DiscoverConfigurationConverter; import org.dspace.app.rest.converter.DiscoverFacetConfigurationConverter; import org.dspace.app.rest.converter.DiscoverFacetResultsConverter; @@ -48,7 +48,7 @@ import org.springframework.stereotype.Component; @Component(SearchResultsRest.CATEGORY + "." + SearchResultsRest.NAME) public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { - private static final Logger log = Logger.getLogger(ScopeResolver.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ScopeResolver.class); @Autowired private DiscoveryConfigurationService searchConfigurationService; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java index 0478cd7974..39ee598564 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.AccessConditionOptionRest; import org.dspace.app.rest.model.SubmissionUploadRest; import org.dspace.app.rest.model.hateoas.SubmissionUploadResource; @@ -43,7 +43,7 @@ import org.springframework.stereotype.Component; public class SubmissionUploadRestRepository extends DSpaceRestRepository implements LinkRestRepository { - private static final Logger log = Logger.getLogger(SubmissionUploadRestRepository.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionUploadRestRepository.class); private SubmissionConfigReader submissionConfigReader; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java index 4b4e30d059..95f24e0896 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java @@ -22,7 +22,7 @@ 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.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.Parameter; import org.dspace.app.rest.SearchRestMethod; import org.dspace.app.rest.converter.WorkspaceItemConverter; @@ -79,7 +79,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository { /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractDSpaceObjectBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceObjectBuilder.class); protected AbstractBuilder(Context context) { this.context = context; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java index 9d1322bcb4..f74d09adfc 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java @@ -9,7 +9,7 @@ package org.dspace.app.rest.builder; import java.util.Date; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.ResourcePolicy; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -34,7 +34,7 @@ public abstract class AbstractDSpaceObjectBuilder extends AbstractBuilder { /* Log4j logger*/ - private static final Logger log = Logger.getLogger(AbstractDSpaceObjectBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceObjectBuilder.class); protected AbstractDSpaceObjectBuilder(Context context) { super(context); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java index ddca4e622a..b0d169bfb8 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java @@ -9,7 +9,7 @@ package org.dspace.app.rest.builder; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.BitstreamFormat; import org.dspace.core.Context; @@ -22,7 +22,7 @@ import org.dspace.service.DSpaceCRUDService; public class BitstreamFormatBuilder extends AbstractCRUDBuilder { /* Log4j logger*/ - private static final Logger log = Logger.getLogger(BitstreamFormatBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamFormatBuilder.class); private BitstreamFormat bitstreamFormat; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java index 42f9c10752..061e5f7c0d 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java @@ -10,7 +10,7 @@ package org.dspace.app.rest.builder; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.MetadataField; import org.dspace.content.MetadataSchema; @@ -22,7 +22,7 @@ import org.dspace.discovery.SearchServiceException; public class MetadataFieldBuilder extends AbstractBuilder { /* Log4j logger*/ - private static final Logger log = Logger.getLogger(MetadataFieldBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataFieldBuilder.class); private MetadataField metadataField; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java index 5b42f0b24a..3f060accc4 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java @@ -9,7 +9,7 @@ package org.dspace.app.rest.builder; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.MetadataSchema; import org.dspace.content.NonUniqueMetadataException; @@ -20,7 +20,7 @@ import org.dspace.discovery.SearchServiceException; public class MetadataSchemaBuilder extends AbstractBuilder { /* Log4j logger*/ - private static final Logger log = Logger.getLogger(MetadataSchemaBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataSchemaBuilder.class); private MetadataSchema metadataSchema; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java index 3f129b5528..b2b550d69e 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java @@ -15,7 +15,7 @@ import java.sql.SQLException; import java.util.Properties; import java.util.TimeZone; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.builder.AbstractBuilder; import org.dspace.servicemanager.DSpaceKernelImpl; import org.dspace.servicemanager.DSpaceKernelInit; @@ -30,7 +30,7 @@ public class AbstractDSpaceIntegrationTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractDSpaceIntegrationTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceIntegrationTest.class); /** * Test properties. These configure our general test environment diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java index 7c38a89f4d..8af9da111a 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java @@ -12,7 +12,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; import java.util.Arrays; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.launcher.ScriptLauncher; import org.dspace.app.rest.builder.AbstractBuilder; import org.dspace.authorize.AuthorizeException; @@ -37,7 +37,7 @@ public class AbstractIntegrationTestWithDatabase extends AbstractDSpaceIntegrati /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractIntegrationTestWithDatabase.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractIntegrationTestWithDatabase.class); /** * Context mock object to use in the tests. diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java index 629e5fd1ef..c2665f4145 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java @@ -21,7 +21,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.CharEncoding; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.junit.After; import org.junit.Before; @@ -41,7 +41,7 @@ public class MultipartFileSenderTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(MultipartFileSenderTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MultipartFileSenderTest.class); private InputStream is; private String mimeType; diff --git a/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java b/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java index e5e62e25df..a71d33b82e 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java +++ b/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java @@ -13,7 +13,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; @@ -25,7 +25,7 @@ import org.dspace.app.rest.test.AbstractDSpaceIntegrationTest; */ public class MockSolrServer { - private static final Logger log = Logger.getLogger(MockSolrServer.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MockSolrServer.class); private static final ConcurrentMap loadedCores = new ConcurrentHashMap<>(); private static final ConcurrentMap usersPerCore = new ConcurrentHashMap<>(); private static CoreContainer container = null; diff --git a/dspace-spring-rest/src/test/resources/log4j.properties b/dspace-spring-rest/src/test/resources/log4j.properties index 2500bc47ea..b982e8bd74 100644 --- a/dspace-spring-rest/src/test/resources/log4j.properties +++ b/dspace-spring-rest/src/test/resources/log4j.properties @@ -19,10 +19,10 @@ log4j.rootCategory=INFO, A1 # A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1=org.apache.logging.log4j.ConsoleAppender # A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n ########################################################################### @@ -40,9 +40,9 @@ log4j.logger.org.dspace.servicemanager=ERROR log4j.logger.org.dspace.providers=ERROR log4j.logger.org.dspace.utils=ERROR -log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout=org.apache.logging.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout=org.apache.logging.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # # Root logger option diff --git a/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java index 3ce38aec47..14e65d81e1 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java @@ -10,7 +10,7 @@ package org.dspace.sword; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.Bundle; @@ -33,7 +33,7 @@ public class BitstreamEntryGenerator extends DSpaceATOMEntry { /** * logger */ - private static Logger log = Logger.getLogger(BitstreamEntryGenerator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamEntryGenerator.class); /** * Create a new ATOM Entry generator which can provide a SWORD Entry for diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java index d2cf664d5c..6c0927f016 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java @@ -10,7 +10,7 @@ package org.dspace.sword; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; @@ -26,7 +26,7 @@ public class CollectionCollectionGenerator extends ATOMCollectionGenerator { * logger */ private static Logger log = - Logger.getLogger(CollectionCollectionGenerator.class); + org.apache.logging.log4j.LogManager.getLogger(CollectionCollectionGenerator.class); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java index 5082e96511..98018ee811 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -40,7 +40,7 @@ public class CollectionDepositor extends Depositor { /** * logger */ - private static Logger log = Logger.getLogger(CollectionDepositor.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionDepositor.class); protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java index d2ff871a72..caa9a1fdca 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java @@ -11,7 +11,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; import org.dspace.core.ConfigurationManager; @@ -30,7 +30,7 @@ public class CollectionLocation { /** * Log4j logger */ - public static final Logger log = Logger.getLogger(CollectionLocation.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionLocation.class); protected HandleService handleService = HandleServiceFactory.getInstance() .getHandleService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java index af266547cf..3318a42b33 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java @@ -10,7 +10,7 @@ package org.dspace.sword; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; import org.dspace.content.MetadataValue; diff --git a/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java b/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java index d742bc1eae..ee6b430278 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java +++ b/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java @@ -7,7 +7,7 @@ */ package org.dspace.sword; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.LogManager; import org.purl.sword.base.AtomDocumentRequest; @@ -33,7 +33,7 @@ public class DSpaceSWORDServer implements SWORDServer { /** * Log4j logger */ - public static final Logger log = Logger.getLogger(DSpaceSWORDServer.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceSWORDServer.class); // methods required by SWORDServer interface //////////////////////////////////////////// diff --git a/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java b/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java index fddd3cf3ba..7535302139 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java +++ b/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java @@ -21,7 +21,7 @@ import java.io.PrintWriter; import java.util.Date; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -46,7 +46,7 @@ public class DepositManager { /** * Log4j logger */ - public static final Logger log = Logger.getLogger(DepositManager.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositManager.class); /** * The SWORD service implementation diff --git a/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java index 482a25fe85..da7dcead4c 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.Bundle; @@ -40,7 +40,7 @@ public class ItemEntryGenerator extends DSpaceATOMEntry { /** * logger */ - private static Logger log = Logger.getLogger(ItemEntryGenerator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemEntryGenerator.class); protected HandleService handleService = HandleServiceFactory.getInstance() .getHandleService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java index 4497532c25..ec46ab8f22 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authenticate.AuthenticationMethod; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; @@ -53,7 +53,7 @@ public class SWORDAuthenticator { /** * logger */ - private static Logger log = Logger.getLogger(SWORDAuthenticator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDAuthenticator.class); protected AuthenticationService authenticationService = AuthenticateServiceFactory.getInstance().getAuthenticationService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java index ad52eba956..0bc12934ca 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java @@ -13,7 +13,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.BitstreamFormat; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; @@ -44,7 +44,7 @@ public class SWORDConfiguration { /** * logger */ - public static final Logger log = Logger.getLogger(SWORDConfiguration.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDConfiguration.class); protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory .getInstance().getBitstreamFormatService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java index d734256501..6d7ca18367 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Date; import java.util.StringTokenizer; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DCDate; import org.dspace.content.DSpaceObject; @@ -38,7 +38,7 @@ public class SWORDMETSIngester implements SWORDIngester { /** * Log4j logger */ - public static final Logger log = Logger.getLogger(SWORDMETSIngester.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDMETSIngester.class); /* (non-Javadoc) * @see org.dspace.sword.SWORDIngester#ingest(org.dspace.core.Context, org.purl.sword.base.Deposit) diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java index 6bb30e2f23..a84289a934 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java @@ -12,7 +12,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.BitstreamFormat; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamFormatService; @@ -33,7 +33,7 @@ public class SWORDService { /** * Log4j logging instance */ - public static final Logger log = Logger.getLogger(SWORDService.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDService.class); protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory .getInstance().getBitstreamFormatService(); diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Content.java b/dspace-sword/src/main/java/org/purl/sword/atom/Content.java index 35e4bcf0ce..418fa6549e 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Content.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Content.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -51,7 +51,7 @@ public class Content extends XmlElement implements SwordElementInterface { /** * The log. */ - private static Logger log = Logger.getLogger(Content.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Content.class); /** * diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java b/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java index 09ceb31dc5..7f09d80412 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java @@ -14,7 +14,7 @@ import java.util.Properties; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.HttpHeaders; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; @@ -143,7 +143,7 @@ public class Entry extends XmlElement implements SwordElementInterface { /** * The log. */ - private static Logger log = Logger.getLogger(Entry.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Entry.class); /** * The prefix, local name and namespace used for this element. diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java b/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java index 8f28b8589a..128d39b210 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -62,7 +62,7 @@ public class Generator extends XmlElement implements SwordElementInterface { /** * The logger. */ - private static Logger log = Logger.getLogger(Generator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Generator.class); /** * The Xml name details for the element. diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Link.java b/dspace-sword/src/main/java/org/purl/sword/atom/Link.java index c7658ba999..9786a91216 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Link.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Link.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -102,7 +102,7 @@ public class Link extends XmlElement implements SwordElementInterface { /** * The logger. */ - private static Logger log = Logger.getLogger(Link.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Link.class); private static final XmlName XML_NAME = new XmlName( Namespaces.PREFIX_ATOM, "link", Namespaces.NS_ATOM); diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Source.java b/dspace-sword/src/main/java/org/purl/sword/atom/Source.java index 6b23d5429a..59d26c2ebb 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Source.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Source.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -42,7 +42,7 @@ public class Source extends XmlElement implements SwordElementInterface { /** * The log. */ - private static Logger log = Logger.getLogger(Source.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Source.class); /** * Create a new instance and set the prefix to diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java b/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java index 98dee816ea..23005d78e8 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -43,7 +43,7 @@ public class TextConstruct extends XmlElement /** * The log. */ - private static Logger log = Logger.getLogger(TextConstruct.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TextConstruct.class); /** * label for the type attribute. diff --git a/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java b/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java index 2ed1ba9400..f5604f3656 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Properties; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Represents a text construct in the ATOM elements. This is a superclass of @@ -25,7 +25,7 @@ public abstract class BasicContentElement extends XmlElement /** * The log. */ - private static Logger log = Logger.getLogger(BasicContentElement.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicContentElement.class); public BasicContentElement(String prefix, String name, String namespaceUri) { super(prefix, name, namespaceUri); diff --git a/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java b/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java index c2b2a6563a..ece4deeb90 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java @@ -13,7 +13,7 @@ import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Utility class that holds Checksum related methods. @@ -25,7 +25,7 @@ public class ChecksumUtils { /** * Logger */ - private static Logger log = Logger.getLogger(ChecksumUtils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ChecksumUtils.class); /** * Default constructor diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Collection.java b/dspace-sword/src/main/java/org/purl/sword/base/Collection.java index 34c2f3817d..cd78f27d50 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/Collection.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/Collection.java @@ -15,7 +15,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Accept; import org.purl.sword.atom.ContentType; import org.purl.sword.atom.Title; @@ -69,7 +69,7 @@ public class Collection extends XmlElement implements SwordElementInterface { /** * The logger. */ - private static Logger log = Logger.getLogger(Collection.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Collection.class); /** * Label for the Href attribute. diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java b/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java index 3c1e76a2f1..2473d28e4a 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java @@ -12,7 +12,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Represents a deposit. @@ -20,7 +20,7 @@ import org.apache.log4j.Logger; * @author Stuart Lewis */ public class Deposit { - private static final Logger log = Logger.getLogger(Deposit.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Deposit.class); /** * The File deposited diff --git a/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java b/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java index a731c020ed..453af3df35 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java @@ -16,7 +16,7 @@ import nu.xom.Document; import nu.xom.Element; import nu.xom.ParsingException; import nu.xom.Serializer; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Represents a deposit response. This holds the SWORD Entry element. @@ -43,7 +43,7 @@ public class DepositResponse { /** * Logger */ - private static Logger log = Logger.getLogger(DepositResponse.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositResponse.class); /** * Create a new response with the specified http code. diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Service.java b/dspace-sword/src/main/java/org/purl/sword/base/Service.java index c335aecf75..3edc86c14e 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/Service.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/Service.java @@ -14,7 +14,7 @@ import java.util.Properties; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Generator; @@ -47,7 +47,7 @@ public class Service extends XmlElement implements SwordElementInterface { /** * Logger */ - private static Logger log = Logger.getLogger(Service.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Service.class); /** * MaxUploadSize diff --git a/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java b/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java index 6d063c6c7e..aa0a545d97 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Represents a text construct in the ATOM elements. This is a superclass of @@ -36,7 +36,7 @@ public class SwordAcceptPackaging extends XmlElement /** * The log. */ - private static Logger log = Logger.getLogger(SwordAcceptPackaging.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SwordAcceptPackaging.class); /** */ public static final String ELEMENT_NAME = "acceptPackaging"; diff --git a/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java b/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java index 814c91bb39..727372408c 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java @@ -11,14 +11,14 @@ import java.io.InputStream; import java.util.Enumeration; import java.util.Properties; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * @author Neil Taylor (nst@aber.ac.uk) */ public class SwordContentPackageTypes { - private static Logger log = Logger.getLogger(SwordContentPackageTypes.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SwordContentPackageTypes.class); private static Properties types; diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java b/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java index 81964152ba..1f18167c95 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java @@ -14,7 +14,7 @@ import java.util.Properties; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.ContentType; import org.purl.sword.atom.Title; @@ -37,7 +37,7 @@ public class Workspace extends XmlElement implements SwordElementInterface { /** * The logger. */ - private static Logger log = Logger.getLogger(Workspace.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Workspace.class); /** * Local name part of this element. diff --git a/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java b/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java index 6249c4290a..80217738d2 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; import nu.xom.Node; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Parent class for all classes that represent an XML element. This provides @@ -27,7 +27,7 @@ public abstract class XmlElement { /** * Logger */ - private static Logger log = Logger.getLogger(XmlElement.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlElement.class); /** diff --git a/dspace-sword/src/main/java/org/purl/sword/client/Client.java b/dspace-sword/src/main/java/org/purl/sword/client/Client.java index 4b4899e4f9..c6d335d8dd 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/Client.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/Client.java @@ -31,7 +31,7 @@ import org.apache.http.entity.ContentType; import org.apache.http.entity.FileEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpParams; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.ChecksumUtils; import org.purl.sword.base.DepositResponse; import org.purl.sword.base.HttpHeaders; @@ -96,7 +96,7 @@ public class Client implements SWORDClient { /** * Logger. */ - private static final Logger log = Logger.getLogger(Client.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Client.class); /** * Create a new Client. The client will not use authentication by default. diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java index 0ae5cb3f26..2612bbf25a 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java @@ -7,7 +7,7 @@ */ package org.purl.sword.client; -import org.apache.log4j.PropertyConfigurator; +import org.apache.logging.log4j.PropertyConfigurator; /** * Entry point for the SWORD Demonstration Client. This will parse the list of diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java index 2f3c73d1e5..e085baeb78 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * List of options that are parsed from the command line. @@ -117,7 +117,7 @@ public class ClientOptions { /** * Logger. */ - private static Logger log = Logger.getLogger(ClientOptions.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ClientOptions.class); /** * List of multiple destination items. Used if the mode is set to multipost. diff --git a/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java b/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java index f1f224fe8b..f747de5ffa 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java @@ -15,7 +15,7 @@ import java.net.URL; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Author; import org.purl.sword.atom.Content; import org.purl.sword.atom.Contributor; @@ -54,7 +54,7 @@ public class CmdClient implements ClientType { /** * The logger. */ - private static Logger log = Logger.getLogger(CmdClient.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CmdClient.class); /** * Create a new instance of the class and create an instance of the diff --git a/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java b/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java index 51b7bd2bcb..c272fc95f5 100644 --- a/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java +++ b/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java @@ -25,7 +25,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Summary; import org.purl.sword.atom.Title; import org.purl.sword.base.ChecksumUtils; @@ -73,7 +73,7 @@ public class DepositServlet extends HttpServlet { /** * Logger */ - private static final Logger log = Logger.getLogger(DepositServlet.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositServlet.class); /** * Initialise the servlet. diff --git a/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java b/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java index c7c2f49dcc..2dc9b3b7e2 100644 --- a/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java +++ b/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java @@ -17,7 +17,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Author; import org.purl.sword.atom.Content; import org.purl.sword.atom.Contributor; @@ -62,7 +62,7 @@ public class DummyServer implements SWORDServer { /** * Logger */ - private static Logger log = Logger.getLogger(ServiceDocumentServlet.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ServiceDocumentServlet.class); /** * Provides a dumb but plausible service document - it contains diff --git a/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java b/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java index bb43850ef6..28c309b2ca 100644 --- a/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java +++ b/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java @@ -16,7 +16,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.HttpHeaders; import org.purl.sword.base.SWORDAuthenticationException; import org.purl.sword.base.SWORDErrorException; @@ -49,7 +49,7 @@ public class ServiceDocumentServlet extends HttpServlet { /** * Logger */ - private static final Logger log = Logger.getLogger(ServiceDocumentServlet.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ServiceDocumentServlet.class); /** * Initialise the servlet. diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/AbstractSwordContentIngester.java b/dspace-swordv2/src/main/java/org/dspace/sword2/AbstractSwordContentIngester.java index 9184c5293e..0a26ec7957 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/AbstractSwordContentIngester.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/AbstractSwordContentIngester.java @@ -12,7 +12,7 @@ import java.util.Date; import java.util.List; import java.util.StringTokenizer; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.BitstreamFormat; import org.dspace.content.Collection; import org.dspace.content.DCDate; @@ -30,7 +30,7 @@ import org.swordapp.server.SwordServerException; public abstract class AbstractSwordContentIngester implements SwordContentIngester { - public static final Logger log = Logger.getLogger( + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger( AbstractSwordContentIngester.class); protected BitstreamFormatService bitstreamFormatService = diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/CollectionCollectionGenerator.java b/dspace-swordv2/src/main/java/org/dspace/sword2/CollectionCollectionGenerator.java index f22ebbd60e..34cf27d631 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/CollectionCollectionGenerator.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/CollectionCollectionGenerator.java @@ -11,7 +11,7 @@ import java.util.List; import org.apache.abdera.i18n.iri.IRI; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; import org.dspace.content.MetadataValue; @@ -26,7 +26,7 @@ import org.swordapp.server.SwordCollection; * DSpace Collections */ public class CollectionCollectionGenerator implements AtomCollectionGenerator { - private static Logger log = Logger.getLogger( + private static Logger log = org.apache.logging.log4j.LogManager.getLogger( CommunityCollectionGenerator.class); protected CollectionService collectionService = diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/CollectionDepositManagerDSpace.java b/dspace-swordv2/src/main/java/org/dspace/sword2/CollectionDepositManagerDSpace.java index a088ce5300..9db2dc7810 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/CollectionDepositManagerDSpace.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/CollectionDepositManagerDSpace.java @@ -10,7 +10,7 @@ package org.dspace.sword2; import java.io.IOException; import java.util.Date; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/CommunityCollectionGenerator.java b/dspace-swordv2/src/main/java/org/dspace/sword2/CommunityCollectionGenerator.java index 726e8d3e36..91c98acdaf 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/CommunityCollectionGenerator.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/CommunityCollectionGenerator.java @@ -11,7 +11,7 @@ import java.util.List; import org.apache.abdera.i18n.iri.IRI; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; import org.dspace.content.MetadataValue; diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/ContainerManagerDSpace.java b/dspace-swordv2/src/main/java/org/dspace/sword2/ContainerManagerDSpace.java index 92b2b57787..9bb6eb8790 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/ContainerManagerDSpace.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/ContainerManagerDSpace.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -39,7 +39,7 @@ import org.swordapp.server.SwordServerException; public class ContainerManagerDSpace extends DSpaceSwordAPI implements ContainerManager { - private static Logger log = Logger.getLogger(ContainerManagerDSpace.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ContainerManagerDSpace.class); protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/DSpaceSwordAPI.java b/dspace-swordv2/src/main/java/org/dspace/sword2/DSpaceSwordAPI.java index 845d13341b..2e0f4412f7 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/DSpaceSwordAPI.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/DSpaceSwordAPI.java @@ -27,7 +27,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -52,7 +52,7 @@ import org.swordapp.server.SwordServerException; import org.swordapp.server.UriRegistry; public class DSpaceSwordAPI { - private static Logger log = Logger.getLogger(DSpaceSwordAPI.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceSwordAPI.class); protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/MediaResourceManagerDSpace.java b/dspace-swordv2/src/main/java/org/dspace/sword2/MediaResourceManagerDSpace.java index 59d5c4bbbf..412ef842eb 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/MediaResourceManagerDSpace.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/MediaResourceManagerDSpace.java @@ -18,7 +18,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/ReceiptGenerator.java b/dspace-swordv2/src/main/java/org/dspace/sword2/ReceiptGenerator.java index caadc1db83..ad806daf04 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/ReceiptGenerator.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/ReceiptGenerator.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import org.apache.abdera.i18n.iri.IRI; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Item; @@ -40,7 +40,7 @@ public class ReceiptGenerator { /** * logger */ - private static Logger log = Logger.getLogger(ReceiptGenerator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ReceiptGenerator.class); protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/ServiceDocumentManagerDSpace.java b/dspace-swordv2/src/main/java/org/dspace/sword2/ServiceDocumentManagerDSpace.java index ac8f73a1bb..6f582a23a7 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/ServiceDocumentManagerDSpace.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/ServiceDocumentManagerDSpace.java @@ -9,7 +9,7 @@ package org.dspace.sword2; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/SimpleDCEntryIngester.java b/dspace-swordv2/src/main/java/org/dspace/sword2/SimpleDCEntryIngester.java index 9b80fdc487..60ddce0189 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/SimpleDCEntryIngester.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/SimpleDCEntryIngester.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.DCDate; @@ -36,7 +36,7 @@ import org.swordapp.server.SwordServerException; public class SimpleDCEntryIngester extends AbstractSimpleDC implements SwordEntryIngester { private static final Logger log = - Logger.getLogger(SimpleDCEntryIngester.class); + org.apache.logging.log4j.LogManager.getLogger(SimpleDCEntryIngester.class); protected WorkspaceItemService workspaceItemService = ContentServiceFactory.getInstance().getWorkspaceItemService(); diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/StatementManagerDSpace.java b/dspace-swordv2/src/main/java/org/dspace/sword2/StatementManagerDSpace.java index 1e8edd2a34..a12f373b35 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/StatementManagerDSpace.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/StatementManagerDSpace.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -32,7 +32,7 @@ import org.swordapp.server.SwordServerException; public class StatementManagerDSpace extends DSpaceSwordAPI implements StatementManager { - private static Logger log = Logger.getLogger(StatementManagerDSpace.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(StatementManagerDSpace.class); protected AuthorizeService authorizeService = AuthorizeServiceFactory .getInstance().getAuthorizeService(); diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/SwordAuthenticator.java b/dspace-swordv2/src/main/java/org/dspace/sword2/SwordAuthenticator.java index 5d6e73ddee..b054a41e3d 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/SwordAuthenticator.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/SwordAuthenticator.java @@ -13,7 +13,7 @@ import java.util.Iterator; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authenticate.AuthenticationMethod; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; @@ -52,7 +52,7 @@ public class SwordAuthenticator { /** * logger */ - private static Logger log = Logger.getLogger(SwordAuthenticator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SwordAuthenticator.class); protected AuthenticationService authenticationService = AuthenticateServiceFactory.getInstance().getAuthenticationService(); diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/SwordConfigurationDSpace.java b/dspace-swordv2/src/main/java/org/dspace/sword2/SwordConfigurationDSpace.java index ee27e7fae6..d004311121 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/SwordConfigurationDSpace.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/SwordConfigurationDSpace.java @@ -13,7 +13,7 @@ import java.util.List; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.BitstreamFormat; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; diff --git a/dspace-swordv2/src/main/java/org/dspace/sword2/SwordMETSContentIngester.java b/dspace-swordv2/src/main/java/org/dspace/sword2/SwordMETSContentIngester.java index fc9fb8e232..3c42b82720 100644 --- a/dspace-swordv2/src/main/java/org/dspace/sword2/SwordMETSContentIngester.java +++ b/dspace-swordv2/src/main/java/org/dspace/sword2/SwordMETSContentIngester.java @@ -9,7 +9,7 @@ package org.dspace.sword2; import java.io.File; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -34,7 +34,7 @@ public class SwordMETSContentIngester extends AbstractSwordContentIngester { /** * Log4j logger */ - public static final Logger log = Logger.getLogger( + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger( SwordMETSContentIngester.class); protected WorkspaceItemService workspaceItemService = diff --git a/dspace/config/log4j-console.properties b/dspace/config/log4j-console.properties index 5a52df7c5b..2ec6892f62 100644 --- a/dspace/config/log4j-console.properties +++ b/dspace/config/log4j-console.properties @@ -12,10 +12,10 @@ log4j.rootCategory=WARN, A1 # A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1=org.apache.logging.log4j.ConsoleAppender # A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n # block passwords from being exposed in Axis logs. diff --git a/dspace/config/log4j-handle-plugin.properties b/dspace/config/log4j-handle-plugin.properties index 44d39fb1bd..72381a698c 100644 --- a/dspace/config/log4j-handle-plugin.properties +++ b/dspace/config/log4j-handle-plugin.properties @@ -20,12 +20,12 @@ log.dir=${dspace.dir}/log log4j.rootCategory=INFO, A1 # A1 is set to be a DailyRollingFileAppender. -log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender +log4j.appender.A1=org.apache.logging.log4j.DailyRollingFileAppender log4j.appender.A1.File=${log.dir}/handle-plugin.log log4j.appender.A1.DatePattern='.'yyyy-MM-dd # A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n diff --git a/dspace/config/log4j-solr.properties b/dspace/config/log4j-solr.properties index c94e384d81..a9750333b4 100644 --- a/dspace/config/log4j-solr.properties +++ b/dspace/config/log4j-solr.properties @@ -23,18 +23,18 @@ log.dir=${dspace.dir}/log log4j.rootLogger=INFO, file # Console logging options. Switch the above from "file" to "CONSOLE" to enable -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE=org.apache.logging.log4j.ConsoleAppender +log4j.appender.CONSOLE.layout=org.apache.logging.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n #- size rotation with log cleanup. -log4j.appender.file=org.apache.log4j.DailyRollingFileAppender +log4j.appender.file=org.apache.logging.log4j.DailyRollingFileAppender # Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files log4j.appender.file.DatePattern='.'yyyy-MM-dd #- File to log to and log format log4j.appender.file.File=${log.dir}/solr.log -log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout=org.apache.logging.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %-5p %c @ %m%n log4j.logger.org.apache.zookeeper=WARN diff --git a/dspace/config/log4j.properties b/dspace/config/log4j.properties index 5acdacd310..5378533250 100644 --- a/dspace/config/log4j.properties +++ b/dspace/config/log4j.properties @@ -54,7 +54,7 @@ log4j.appender.A1.DatePattern=yyyy-MM-dd # The number of log files to keep, or 0 to keep them all log4j.appender.A1.MaxLogs=0 # A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n @@ -75,7 +75,7 @@ log4j.appender.A2.DatePattern=yyyy-MM-dd # The number of log files to keep, or 0 to keep them all log4j.appender.A2.MaxLogs=0 # A2 uses PatternLayout. -log4j.appender.A2.layout=org.apache.log4j.PatternLayout +log4j.appender.A2.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%m%n From 1e3231967ff420ef5c0fe49f06d832da333d3b15 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Tue, 13 Mar 2018 17:24:49 -0400 Subject: [PATCH 141/193] Add Log4J LogManager to EventListenerExample --- .../servicemanager/example/EventListenerExample.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java index aa603fc295..8567c9fba7 100644 --- a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java +++ b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java @@ -7,7 +7,8 @@ */ package org.dspace.servicemanager.example; -import org.apache.logging.log4j.Logger; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; import org.dspace.services.model.Event; import org.dspace.services.model.EventListener; @@ -23,8 +24,8 @@ public final class EventListenerExample implements EventListener { /** * log4j category */ - private static Logger log = Logger - .getLogger(EventListenerExample.class); + private static Logger log = LogManager.getLogger(EventListenerExample.class); + /** * @return null From b72fff4a25aafb54ae4200d96baed8585121b783 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Tue, 13 Mar 2018 17:27:52 -0400 Subject: [PATCH 142/193] Remove code related to log4j1 --- .../dspace/app/util/DailyFileAppender.java | 299 ------------------ .../org/dspace/core/LoggerServiceImpl.java | 182 ----------- .../solr/filters/ConfigureLog4jListener.java | 80 ----- 3 files changed, 561 deletions(-) delete mode 100644 dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java delete mode 100644 dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java delete mode 100644 dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java diff --git a/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java b/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java deleted file mode 100644 index ff45346715..0000000000 --- a/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java +++ /dev/null @@ -1,299 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.app.util; - -import java.io.File; -import java.io.IOException; -import java.net.UnknownHostException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -import org.apache.commons.lang3.time.DateUtils; -import org.apache.logging.log4j.FileAppender; -import org.apache.logging.log4j.helpers.LogLog; -import org.apache.logging.log4j.spi.LoggingEvent; - -/** - * Special log appender for log4j. Adds the current date (ie. year-mon) to - * the end of the file name, so that rolling on to the next log is simply - * a case of starting a new one - no renaming of old logs. - * - * This is advisable if you are using Windows, and have multiple applications - * (ie. dspace, dspace-oai, dspace-sword) that all want to write to the same log file, - * as each would otherwise try to rename the old files during rollover. - * - * An example log4j.properties (one log per month, retains three months of logs) - * - * log4j.rootCategory=INFO, A1 - * log4j.appender.A1=org.dspace.app.util.DailyFileAppender - * log4j.appender.A1.File=@@log.dir@@/dspace.log - * log4j.appender.A1.DatePattern=yyyy-MM - * log4j.appender.A1.MaxLogs=3 - * log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout - * log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n - */ -public class DailyFileAppender extends FileAppender { - /** - * The fixed date pattern to be used if one is not specified. - */ - private static final String DATE_PATTERN = "yyyy-MM-dd"; - - /** - * The folder under which daily folders are created. This can be a absolute path - * or relative path also. - * e.g. JavaLogs/CPRILog or F:/LogFiles/CPRILog - */ - private String mstrFileName; - - /** - * Used internally and contains the name of the date derived from current system date. - */ - private Date mstrDate = new Date(System.currentTimeMillis()); - - /** - * Holds the user specified DatePattern, - */ - private String mstrDatePattern = DATE_PATTERN; - - private boolean mMonthOnly = false; - - /** - * The date formatter object used for parsing the user specified DatePattern. - */ - private SimpleDateFormat mobjSDF; - - private boolean mWithHostName = false; - - private int mMaxLogs = 0; - - /** - * Default constructor. This is required as the appender class is dynamically - * loaded. - */ - public DailyFileAppender() { - super(); - } - - /* (non-Javadoc) - * @see org.apache.logging.log4j.FileAppender#activateOptions() - */ - @Override - public void activateOptions() { - setFileName(); - cleanupOldFiles(); - super.activateOptions(); - } - - /*------------------------------------------------------------------------------ - * Getters - *----------------------------------------------------------------------------*/ - public String getDatePattern() { - return this.mstrDatePattern; - } - - @Override - public String getFile() { - return this.mstrFileName; - } - - public boolean getWithHost() { - return mWithHostName; - } - - public int getMaxLogs() { - return mMaxLogs; - } - - /*------------------------------------------------------------------------------ - * Setters - *----------------------------------------------------------------------------*/ - public void setDatePattern(String pstrPattern) { - this.mstrDatePattern = checkPattern(pstrPattern); - if (mstrDatePattern.contains("dd") || mstrDatePattern.contains("DD")) { - mMonthOnly = false; - } else { - mMonthOnly = true; - } - } - - @Override - public void setFile(String file) { - // Trim spaces from both ends. The users probably does not want - // trailing spaces in file names. - String val = file.trim(); - mstrFileName = val; - } - - public void setWithHost(boolean wh) { - mWithHostName = wh; - } - - public void setMaxLogs(int ml) { - mMaxLogs = ml; - } - - /*------------------------------------------------------------------------------ - * Methods - *----------------------------------------------------------------------------*/ - /* (non-Javadoc) - * @see org.apache.logging.log4j.WriterAppender#subAppend(org.apache.logging.log4j.spi.LoggingEvent) - */ - @Override - protected void subAppend(LoggingEvent pobjEvent) { - Date dtNow = new Date(System.currentTimeMillis()); - - boolean rollover = false; - - if (mMonthOnly) { - Calendar now = Calendar.getInstance(); - Calendar cur = Calendar.getInstance(); - now.setTime(dtNow); - cur.setTime(mstrDate); - rollover = !(now.get(Calendar.YEAR) == cur.get(Calendar.YEAR) && now.get(Calendar.MONTH) == cur - .get(Calendar.MONTH)); - } else { - rollover = !(DateUtils.isSameDay(dtNow, mstrDate)); - } - - if (rollover) { - try { - rollOver(dtNow); - } catch (IOException IOEx) { - LogLog.error("rollOver() failed!", IOEx); - } - } - - super.subAppend(pobjEvent); - } - - /*------------------------------------------------------------------------------ - * Helpers - *----------------------------------------------------------------------------*/ - - /** - * The helper function to validate the DatePattern. - * - * @param pstrPattern The DatePattern to be validated. - * @return The validated date pattern or defautlt DATE_PATTERN - */ - private String checkPattern(String pstrPattern) { - String strRet = null; - SimpleDateFormat objFmt = new SimpleDateFormat(DATE_PATTERN); - - try { - this.mobjSDF = new SimpleDateFormat(pstrPattern); - strRet = pstrPattern; - } catch (NullPointerException NPExIgnore) { - LogLog.error("Invalid DatePattern " + pstrPattern, NPExIgnore); - this.mobjSDF = objFmt; - strRet = DATE_PATTERN; - } catch (IllegalArgumentException IlArgExIgnore) { - LogLog.error("Invalid DatePattern " + pstrPattern, IlArgExIgnore); - this.mobjSDF = objFmt; - strRet = DATE_PATTERN; - } finally { - objFmt = null; - } - return strRet; - } - - /** - * This function is responsible for performing the actual file rollover. - * - * @param pstrName The name of the new folder based on current system date. - * @throws IOException if IO error - */ - private static boolean deletingFiles = false; - - private void cleanupOldFiles() { - // If we need to delete log files - if (mMaxLogs > 0 && !deletingFiles) { - deletingFiles = true; - - // Determine the final file extension with the hostname - String hostFileExt = null; - try { - hostFileExt = "." + java.net.InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - LogLog.error("Unable to retrieve host name"); - } - - try { - // Array to hold the logs we are going to keep - File[] logsToKeep = new File[mMaxLogs]; - - // Get a 'master' file handle, and the parent directory from it - File logMaster = new File(mstrFileName); - File logDir = logMaster.getParentFile(); - if (logDir.isDirectory()) { - // Iterate all the files in that directory - File[] logArr = logDir.listFiles(); - for (File curLog : logArr) { - LogLog.debug("Comparing '" + curLog.getAbsolutePath() + "' to '" + mstrFileName + "'"); - String name = curLog.getAbsolutePath(); - - // First, see if we are not using hostname, or the log file ends with this host - if (!mWithHostName || (hostFileExt != null && name.endsWith(hostFileExt))) { - // Check that the file is indeed one we want (contains the master file name) - if (name.contains(mstrFileName)) { - // Iterate through the array of logs we are keeping - for (int i = 0; curLog != null && i < logsToKeep.length; i++) { - // Have we exhausted the 'to keep' array? - if (logsToKeep[i] == null) { - // Empty space, retain this log file - logsToKeep[i] = curLog; - curLog = null; - } else if (logsToKeep[i].getName().compareTo(curLog.getName()) < 0) { - // If the 'kept' file is older than the current one - // Replace tested entry with current file - File temp = logsToKeep[i]; - logsToKeep[i] = curLog; - curLog = temp; - } - } - - // If we have a 'current' entry at this point, it's a log we don't want - if (curLog != null) { - LogLog.debug("Deleting log " + curLog.getName()); - if (!curLog.delete()) { - LogLog.error("Unable to delete log file"); - } - } - } - } - } - } - } catch (Exception e) { - // Don't worry about exceptions - } finally { - deletingFiles = false; - } - } - } - - private void rollOver(Date dtNow) throws IOException { - mstrDate = dtNow; - setFileName(); - this.setFile(fileName, true, bufferedIO, bufferSize); - - cleanupOldFiles(); - } - - private void setFileName() { - fileName = mstrFileName + "." + mobjSDF.format(mstrDate); - - if (mWithHostName) { - try { - fileName += "." + java.net.InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - LogLog.error("Unable to retrieve host name"); - } - } - } -} diff --git a/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java deleted file mode 100644 index 1af1a702fb..0000000000 --- a/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java +++ /dev/null @@ -1,182 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.core; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.util.Enumeration; -import java.util.Properties; - -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.PropertyConfigurator; -import org.apache.logging.log4j.xml.DOMConfigurator; -import org.dspace.services.ConfigurationService; -import org.dspace.services.KernelStartupCallbackService; -import org.dspace.services.factory.DSpaceServicesFactory; - -/** - * Service which simply initializes DSpace logging *after* the kernel starts - * - * @author Tim Donohue - */ -public class LoggerServiceImpl implements KernelStartupCallbackService { - /** - * log4j category - */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerServiceImpl.class); - - // System property which will disable DSpace's log4j setup - private final String LOG_DISABLE_PROPERTY = "dspace.log.init.disable"; - - // Logging settings which are specified in DSpace's configuration - private final String LOG_CONFIG_PROPERTY = "log.init.config"; - - /** - * After kernel starts up, initialize Log4j based on the logging settings - * in our ConfigurationService. - */ - @Override - public void executeCallback() { - try { - /* - * Initialize Logging once ConfigurationManager is initialized. - * - * This is controlled by a property in dspace.cfg. If the property - * is absent then nothing will be configured and the application - * will use the defaults provided by log4j. - * - * Property format is: - * - * log.init.config = ${dspace.dir}/config/log4j.properties - * or - * log.init.config = ${dspace.dir}/config/log4j.xml - * - * See default log4j initialization documentation here: - * http://logging.apache.org/log4j/docs/manual.html - * - * If there is a problem with the file referred to in - * "log.configuration", it needs to be sent to System.err - * so do not instantiate another Logging configuration. - * - */ - ConfigurationService config = DSpaceServicesFactory.getInstance().getConfigurationService(); - String dsLogConfiguration = config.getProperty(LOG_CONFIG_PROPERTY); - - if (dsLogConfiguration == null || System.getProperty(LOG_DISABLE_PROPERTY) != null) { - /* - * Do nothing if log config not set in dspace.cfg or "dspace.log.init.disable" - * system property set. Leave it upto log4j to properly init its logging - * via classpath or system properties. - */ - info("Using default log4j provided log configuration." + - " If unintended, check your dspace.cfg for (" + LOG_CONFIG_PROPERTY + ")"); - } else { - info("Using dspace provided log configuration (" + LOG_CONFIG_PROPERTY + ")"); - - File logConfigFile = new File(dsLogConfiguration); - - if (logConfigFile.exists()) { - info("Loading: " + dsLogConfiguration); - - // Check if we have an XML config - if (logConfigFile.getName().endsWith(".xml")) { - // Configure log4j via the DOMConfigurator - DOMConfigurator.configure(logConfigFile.toURI().toURL()); - } else { - // Otherwise, assume a Properties file - - // Parse our log4j properties file - Properties log4jProps = new Properties(); - try (InputStream fis = new FileInputStream(logConfigFile)) { - log4jProps.load(fis); - } catch (IOException e) { - fatal("Can't load dspace provided log4j configuration from " + logConfigFile - .getAbsolutePath(), e); - } - - // Configure log4j based on all its properties - PropertyConfigurator.configure(log4jProps); - } - } else { - info("File does not exist: " + dsLogConfiguration); - } - } - - } catch (MalformedURLException e) { - fatal("Can't load dspace provided log4j configuration", e); - throw new IllegalStateException("Cannot load dspace provided log4j configuration", e); - } - } - - /** - * Attempt to log an INFO statement. If Log4j is not yet setup, send to System OUT - * - * @param string - */ - private void info(String string) { - if (!isLog4jConfigured()) { - System.out.println("INFO: " + string); - } else { - log.info(string); - } - } - - /** - * Attempt to log a WARN statement. If Log4j is not yet setup, send to System OUT - * - * @param string - */ - private void warn(String string) { - if (!isLog4jConfigured()) { - System.out.println("WARN: " + string); - } else { - log.warn(string); - } - } - - /** - * Attempt to log a FATAL statement. If Log4j is not yet setup, send to System ERR - * - * @param string - * @param e - */ - private void fatal(String string, Exception e) { - if (!isLog4jConfigured()) { - System.err.println("FATAL: " + string); - e.printStackTrace(System.err); - } else { - log.fatal(string, e); - } - } - - /** - * Only current solution available to detect if log4j is truly configured. - *

- * Based on samples here: http://wiki.apache.org/logging-log4j/UsefulCode - */ - private boolean isLog4jConfigured() { - Enumeration appenders = org.apache.logging.log4j.LogManager.getRootLogger() - .getAllAppenders(); - - if (!(appenders instanceof org.apache.logging.log4j.helpers.NullEnumeration)) { - return true; - } else { - Enumeration loggers = org.apache.logging.log4j.LogManager.getCurrentLoggers(); - while (loggers.hasMoreElements()) { - Logger c = (Logger) loggers.nextElement(); - if (!(c.getAllAppenders() instanceof org.apache.logging.log4j.helpers.NullEnumeration)) { - return true; - } - } - } - return false; - } -} diff --git a/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java b/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java deleted file mode 100644 index 6281c471ad..0000000000 --- a/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ - -package org.dspace.solr.filters; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - -import org.apache.logging.log4j.Hierarchy; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.PropertyConfigurator; -import org.apache.logging.log4j.helpers.Loader; -import org.apache.logging.log4j.spi.Configurator; -import org.apache.logging.log4j.spi.RootLogger; -import org.apache.logging.log4j.xml.DOMConfigurator; - -/** - * Initialize Log4J at application startup. - * This class mimics the default Log4J initialization procedure, except - * that it is controlled by context parameters rather than system properties. - * - * @author Mark H. Wood - */ -public class ConfigureLog4jListener - implements ServletContextListener { - public void contextInitialized(ServletContextEvent sce) { - ServletContext ctx = sce.getServletContext(); - - String logConfig = ctx.getInitParameter("log4j.configuration"); - if (null == logConfig) { - logConfig = "log4j.properties"; - } - - URL configURL; - try { - configURL = new File(logConfig).toURI().toURL(); - } catch (MalformedURLException e) { - configURL = Loader.getResource(logConfig); - } - - if (null == configURL) { - ctx.log("Log4J configuration not found. Left unconfigured."); - return; - } else { - ctx.log(" In context " + ctx.getContextPath() + - ", configuring Log4J from " + configURL.toExternalForm()); - - String configuratorName = ctx.getInitParameter("log4j.configuratorClass"); - if (null != configuratorName) { - Configurator configurator; - try { - configurator = (Configurator) Class.forName(configuratorName).newInstance(); - } catch (Exception ex) { - ctx.log("Unable to load custom Log4J configuration class '" - + configuratorName + "': " + ex.getMessage()); - return; - } - - configurator.doConfigure(configURL, new Hierarchy(new RootLogger(Level.OFF))); - } else if (configURL.getFile().endsWith(".xml")) { - DOMConfigurator.configure(configURL); - } else { - PropertyConfigurator.configure(configURL); - } - } - } - - public void contextDestroyed(ServletContextEvent sce) { - // Nothing to be done - } -} From 1eed2698ae1685731a94666e67d6a347a956f145 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Tue, 13 Mar 2018 17:33:57 -0400 Subject: [PATCH 143/193] Remove trailing whitespace in EventListenerExample --- .../org/dspace/servicemanager/example/EventListenerExample.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java index 8567c9fba7..847d3fb625 100644 --- a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java +++ b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java @@ -25,7 +25,6 @@ public final class EventListenerExample implements EventListener { * log4j category */ private static Logger log = LogManager.getLogger(EventListenerExample.class); - /** * @return null From 7f589a5ad69ce8007a3c39db63adc8dc98b94678 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Tue, 13 Mar 2018 17:54:00 -0400 Subject: [PATCH 144/193] Refactor import statements --- .../discovery/SolrServiceMetadataBrowseIndexingPlugin.java | 4 ++-- .../dspace/servicemanager/example/EventListenerExample.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java index 83b9c14c5f..5e78173d93 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.solr.common.SolrInputDocument; import org.dspace.browse.BrowseException; @@ -44,8 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SolrServiceMetadataBrowseIndexingPlugin implements SolrServiceIndexPlugin { - private static final Logger log = Logger - .getLogger(SolrServiceMetadataBrowseIndexingPlugin.class); + private static final Logger log = LogManager.getLogger(SolrServiceMetadataBrowseIndexingPlugin.class); @Autowired(required = true) protected ItemService itemService; diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java index 847d3fb625..ab2afb5ed6 100644 --- a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java +++ b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java @@ -7,8 +7,8 @@ */ package org.dspace.servicemanager.example; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.services.model.Event; import org.dspace.services.model.EventListener; From 35b5c6c32170e2fe9d77640a1a43444148fccbb5 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Thu, 15 Mar 2018 10:54:27 -0400 Subject: [PATCH 145/193] Remove bean declaration for log4v1 service --- .../src/main/resources/spring/spring-dspace-core-services.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml index dfdd1a2c8c..402d5d8287 100644 --- a/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml +++ b/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml @@ -45,6 +45,4 @@ - - From bda4fa0ba7a5fbe1cf9e229a8d685a7d1ee1c079 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Thu, 22 Mar 2018 19:52:52 -0400 Subject: [PATCH 146/193] Refactor additional loggers for log4jv2 --- .../org/dspace/checker/MostRecentChecksumServiceImpl.java | 3 ++- .../authority/InputFormSelfRegisterWrapperAuthority.java | 3 ++- .../CreativeCommonsRDFStreamDisseminationCrosswalk.java | 3 ++- .../CreativeCommonsRDFStreamIngestionCrosswalk.java | 3 ++- .../CreativeCommonsTextStreamDisseminationCrosswalk.java | 3 ++- .../crosswalk/LicenseStreamDisseminationCrosswalk.java | 3 ++- .../content/crosswalk/XHTMLHeadDisseminationCrosswalk.java | 4 ++-- .../discovery/SolrServiceResourceRestrictionPlugin.java | 3 ++- .../src/main/java/org/dspace/eperson/SubscribeCLITool.java | 4 ++-- ...rsionedHandleIdentifierProviderWithCanonicalHandles.java | 3 ++- .../rdf/conversion/SimpleDSORelationsConverterPlugin.java | 3 ++- .../V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java | 3 ++- .../submit/lookup/DSpaceWorkspaceItemOutputGenerator.java | 4 ++-- .../submit/lookup/MultipleSubmissionLookupDataLoader.java | 4 ++-- .../org/dspace/submit/lookup/SubmissionItemDataLoader.java | 4 ++-- .../org/dspace/submit/step/StartSubmissionLookupStep.java | 4 ++-- .../java/org/dspace/usage/LoggerUsageEventListener.java | 3 +-- .../java/org/dspace/sword/CommunityCollectionGenerator.java | 4 ++-- .../src/main/java/org/purl/sword/client/ClientFactory.java | 6 +++--- 19 files changed, 38 insertions(+), 29 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java index 5e875a152d..d267171aa0 100644 --- a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java @@ -28,7 +28,8 @@ import org.springframework.beans.factory.annotation.Autowired; * @author kevinvandevelde at atmire.com */ public class MostRecentChecksumServiceImpl implements MostRecentChecksumService { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MostRecentChecksumServiceImpl.class); + private static final Logger log = + org.apache.logging.log4j.LogManager.getLogger(MostRecentChecksumServiceImpl.class); @Autowired(required = true) protected MostRecentChecksumDAO mostRecentChecksumDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java index 08cd5d892e..60c3403728 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java @@ -32,7 +32,8 @@ import org.dspace.content.Collection; */ public class InputFormSelfRegisterWrapperAuthority implements ChoiceAuthority { - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(InputFormSelfRegisterWrapperAuthority.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(InputFormSelfRegisterWrapperAuthority.class); private Map delegates = new HashMap(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java index fac15d99e7..9042a3a7f5 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java @@ -35,7 +35,8 @@ public class CreativeCommonsRDFStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsRDFStreamDisseminationCrosswalk.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsRDFStreamDisseminationCrosswalk.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); protected CreativeCommonsService creativeCommonsService = LicenseServiceFactory.getInstance() .getCreativeCommonsService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java index 55634df647..a5d503b6c2 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java @@ -38,7 +38,8 @@ public class CreativeCommonsRDFStreamIngestionCrosswalk /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsRDFStreamIngestionCrosswalk.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsRDFStreamIngestionCrosswalk.class); protected CreativeCommonsService creativeCommonsService = LicenseServiceFactory.getInstance() .getCreativeCommonsService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java index 2da3876b06..6d7becba42 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java @@ -42,7 +42,8 @@ public class CreativeCommonsTextStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsTextStreamDisseminationCrosswalk.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsTextStreamDisseminationCrosswalk.class); @Override public boolean canDisseminate(Context context, DSpaceObject dso) { diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java index 911f2b91bb..75b884613d 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java @@ -34,7 +34,8 @@ public class LicenseStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseStreamDisseminationCrosswalk.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(LicenseStreamDisseminationCrosswalk.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); @Override diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java index 8826fb1ce3..bc153e9426 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; @@ -65,8 +66,7 @@ public class XHTMLHeadDisseminationCrosswalk extends SelfNamedPlugin implements /** * log4j logger */ - private static Logger log = Logger - .getLogger(XHTMLHeadDisseminationCrosswalk.class); + private static Logger log = LogManager.getLogger(XHTMLHeadDisseminationCrosswalk.class); /** * Location of config file diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java index 8ba43ef417..4fcc8c38ca 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java @@ -39,7 +39,8 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SolrServiceResourceRestrictionPlugin implements SolrServiceIndexPlugin, SolrServiceSearchPlugin { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrServiceResourceRestrictionPlugin.class); + private static final Logger log = + org.apache.logging.log4j.LogManager.getLogger(SolrServiceResourceRestrictionPlugin.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java index c02e655387..2b3a8a9661 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java +++ b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java @@ -26,8 +26,8 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; +// Replace with new log4j 2: import org.apache.logging.log4j.Level; import org.dspace.content.Collection; import org.dspace.content.DCDate; import org.dspace.content.Item; @@ -316,7 +316,7 @@ public class SubscribeCLITool { boolean test = line.hasOption("t"); if (test) { - log.setLevel(Level.DEBUG); + //TODO Replace with log4j2: org.apache.logging.log4j.core.config.Configurator.setLevel(); } Context context = null; diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java index 9396526d47..797358262e 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java @@ -43,7 +43,8 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident /** * log4j category */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionedHandleIdentifierProviderWithCanonicalHandles.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(VersionedHandleIdentifierProviderWithCanonicalHandles.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java index 3337738b17..e5475e5eb4 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java @@ -57,7 +57,8 @@ public class SimpleDSORelationsConverterPlugin public static final String SIMPLE_RELATIONS_ITEM2BITSTREAM_KEY = "rdf.simplerelations.item2bitstream"; - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SimpleDSORelationsConverterPlugin.class); + private static final Logger log = + org.apache.logging.log4j.LogManager.getLogger(SimpleDSORelationsConverterPlugin.class); @Autowired(required = true) protected BitstreamService bitstreamService; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java index 0ed07785d9..2b614b5356 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java @@ -27,7 +27,8 @@ public class V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables implements JdbcM /** * log4j category */ - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.class); + private static final Logger log = + org.apache.logging.log4j.LogManager.getLogger(V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.class); /* The checksum to report for this migration (when successful) */ private int checksum = -1; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java index a8ff5ef7fb..f93eb29bbc 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java @@ -22,6 +22,7 @@ import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; @@ -49,8 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class DSpaceWorkspaceItemOutputGenerator implements OutputGenerator { - private static Logger log = Logger - .getLogger(DSpaceWorkspaceItemOutputGenerator.class); + private static Logger log = LogManager.getLogger(DSpaceWorkspaceItemOutputGenerator.class); protected Context context; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java index f90c8e2bb8..712bfbc3a4 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java @@ -21,6 +21,7 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.core.Context; @@ -32,8 +33,7 @@ import org.dspace.core.Context; */ public class MultipleSubmissionLookupDataLoader implements DataLoader { - private static Logger log = Logger - .getLogger(MultipleSubmissionLookupDataLoader.class); + private static Logger log = LogManager.getLogger(MultipleSubmissionLookupDataLoader.class); protected final String NOT_FOUND_DOI = "NOT-FOUND-DOI"; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java index a3c8bbfc8b..286c6ba23b 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java @@ -15,6 +15,7 @@ import gr.ekt.bte.core.DataLoadingSpec; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.exceptions.MalformedSourceException; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.submit.util.ItemSubmissionLookupDTO; @@ -29,8 +30,7 @@ public class SubmissionItemDataLoader implements DataLoader { List providers; - private static Logger log = Logger - .getLogger(SubmissionItemDataLoader.class); + private static Logger log = LogManager.getLogger(SubmissionItemDataLoader.class); public SubmissionItemDataLoader() { dtoList = null; diff --git a/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java b/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java index b8513aefe0..b10b1895bb 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java @@ -7,6 +7,7 @@ */ package org.dspace.submit.step; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; @@ -16,8 +17,7 @@ public class StartSubmissionLookupStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger - .getLogger(StartSubmissionLookupStep.class); + private static Logger log = LogManager.getLogger(StartSubmissionLookupStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java b/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java index 9421f7d54b..aa24db0775 100644 --- a/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java +++ b/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java @@ -23,8 +23,7 @@ public class LoggerUsageEventListener extends AbstractUsageEventListener { /** * log4j category */ - private static Logger log = Logger - .getLogger(LoggerUsageEventListener.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerUsageEventListener.class); @Override public void receiveEvent(Event event) { diff --git a/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java index 3318a42b33..1d8caa5d16 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java @@ -10,6 +10,7 @@ package org.dspace.sword; import java.util.List; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -19,8 +20,7 @@ import org.dspace.content.service.CommunityService; import org.purl.sword.base.Collection; public class CommunityCollectionGenerator extends ATOMCollectionGenerator { - private static Logger log = Logger - .getLogger(CommunityCollectionGenerator.class); + private static Logger log = LogManager.getLogger(CommunityCollectionGenerator.class); protected CommunityService communityService = ContentServiceFactory .getInstance().getCommunityService(); diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java index 2612bbf25a..83d7ed0c11 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java @@ -7,7 +7,7 @@ */ package org.purl.sword.client; -import org.apache.logging.log4j.PropertyConfigurator; +// Replace with log4j 2: import org.apache.logging.log4j.PropertyConfigurator; /** * Entry point for the SWORD Demonstration Client. This will parse the list of @@ -24,8 +24,8 @@ public class ClientFactory { // configure the logger from the property file. The GUI client will // reload these properties if it is set to capture the output and // display it in a panel. - PropertyConfigurator.configure(this.getClass().getClassLoader() - .getResource(ClientConstants.LOGGING_PROPERTY_FILE)); + // Replace with log4j 2: PropertyConfigurator.configure(this.getClass() + // .getClassLoader().getResource(ClientConstants.LOGGING_PROPERTY_FILE)); } /** From 3b10caef0d8edf193717338f1e9d28df9237d72e Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Fri, 23 Mar 2018 13:46:32 -0400 Subject: [PATCH 147/193] Fix reference to log4jv2 --- .../java/org/dspace/identifier/EZIDIdentifierProviderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java b/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java index e2128669e9..038611fe80 100644 --- a/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java +++ b/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java @@ -466,7 +466,7 @@ public class EZIDIdentifierProviderTest PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); System.out.println(sw.toString()); - org.apache.logging.log4j.org.apache.logging.log4j.LogManager.getLogger(EZIDIdentifierProviderTest.class).fatal("Caught NPE", ex); + org.apache.logging.log4j.LogManager.getLogger(EZIDIdentifierProviderTest.class).fatal("Caught NPE", ex); throw ex; } } From 00088c973906c04bd50b26e67fcd011fd71b568b Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Sat, 7 Apr 2018 08:53:59 -0400 Subject: [PATCH 148/193] Fix dependency convergence and use POM property for log4j version --- dspace-api/pom.xml | 30 ++++++++++++++++++++++++++++-- dspace-oai/pom.xml | 22 +++++++++++++++++++--- dspace-rdf/pom.xml | 4 ++-- dspace-rest/pom.xml | 4 ++-- dspace-services/pom.xml | 4 ++-- dspace-solr/pom.xml | 21 +++++++++++++++++++-- dspace-sword/pom.xml | 4 ++-- dspace-swordv2/pom.xml | 12 ++++++++++-- pom.xml | 11 ++++++----- 9 files changed, 90 insertions(+), 22 deletions(-) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 9dae1498f4..345acce24f 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -351,6 +351,24 @@ org.apache.jena apache-jena-libs pom + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + commons-cli @@ -415,12 +433,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.10.0 + ${log4j.version} oro @@ -532,6 +550,10 @@ org.mockito mockito-core + + + log4j + log4j @@ -549,6 +571,10 @@ org.mockito mockito-core + + + log4j + log4j diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index 5d5e4c8627..d58d12f281 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -106,7 +106,15 @@ org.apache.commons commons-lang3 - + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + @@ -159,6 +167,14 @@ javax.servlet servlet-api + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + @@ -192,12 +208,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.10.0 + ${log4j.version} org.slf4j diff --git a/dspace-rdf/pom.xml b/dspace-rdf/pom.xml index 205eb2ef6c..0bea543874 100644 --- a/dspace-rdf/pom.xml +++ b/dspace-rdf/pom.xml @@ -70,12 +70,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.10.0 + ${log4j.version} org.apache.commons diff --git a/dspace-rest/pom.xml b/dspace-rest/pom.xml index 81e6fc14e1..0943fa6e16 100644 --- a/dspace-rest/pom.xml +++ b/dspace-rest/pom.xml @@ -230,12 +230,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.10.0 + ${log4j.version} org.dspace diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml index dafff484bb..b12da0859c 100644 --- a/dspace-services/pom.xml +++ b/dspace-services/pom.xml @@ -146,12 +146,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.10.0 + ${log4j.version} diff --git a/dspace-solr/pom.xml b/dspace-solr/pom.xml index ea569d8265..181e884946 100644 --- a/dspace-solr/pom.xml +++ b/dspace-solr/pom.xml @@ -231,6 +231,23 @@ + + + org.apache.zookeeper + zookeeper + 3.4.6 + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + + org.slf4j @@ -245,12 +262,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.10.0 + ${log4j.version} javax.servlet diff --git a/dspace-sword/pom.xml b/dspace-sword/pom.xml index d5c6344306..e931469c9d 100644 --- a/dspace-sword/pom.xml +++ b/dspace-sword/pom.xml @@ -123,12 +123,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.10.0 + ${log4j.version} xom diff --git a/dspace-swordv2/pom.xml b/dspace-swordv2/pom.xml index b201945817..f5eea1366b 100644 --- a/dspace-swordv2/pom.xml +++ b/dspace-swordv2/pom.xml @@ -99,6 +99,14 @@ javax.servlet servlet-api + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + @@ -114,12 +122,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j log4j-core - 2.10.0 + ${log4j.version} org.apache.abdera diff --git a/pom.xml b/pom.xml index 74b6fe894f..a90b9bc4b2 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,8 @@ 3.17 42.2.1 4.10.4 - 2.13.0 + 2.13.0 + 2.11.0 1.7.22 2.8.11 2.26 @@ -1103,7 +1104,7 @@ - spring-jdbc + spring-jdbc org.springframework ${spring.version} @@ -1260,12 +1261,12 @@ org.apache.logging.log4j log4j-api - 2.10.0 + ${log4j.version} org.apache.logging.log4j - log4j-core - 2.10.0 + log4j-core + ${log4j.version} oro From a5a00816cc4ff53f8aaa9efca34fc59889edbc07 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Sat, 7 Apr 2018 08:55:15 -0400 Subject: [PATCH 149/193] Additional refactoring for log4jv2 --- .../org/dspace/xoai/controller/DSpaceOAIDataProvider.java | 2 +- .../org/dspace/app/rest/BitstreamContentRestController.java | 3 ++- .../app/rest/converter/SubmissionDefinitionConverter.java | 3 ++- .../app/rest/repository/SubmissionUploadRestRepository.java | 5 +++-- .../org/dspace/sword2/CollectionDepositManagerDSpace.java | 2 +- .../java/org/dspace/sword2/CommunityCollectionGenerator.java | 3 ++- .../java/org/dspace/sword2/MediaResourceManagerDSpace.java | 2 +- .../java/org/dspace/sword2/ServiceDocumentManagerDSpace.java | 2 +- .../java/org/dspace/sword2/SwordConfigurationDSpace.java | 3 ++- 9 files changed, 15 insertions(+), 10 deletions(-) diff --git a/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java b/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java index 43c79681ea..96e82d8eae 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java @@ -9,7 +9,7 @@ package org.dspace.xoai.controller; import static java.util.Arrays.asList; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; -import static org.apache.logging.log4j.org.apache.logging.log4j.LogManager.getLogger; +import static org.apache.logging.log4j.LogManager.getLogger; import java.io.IOException; import java.io.OutputStream; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java index afb6a20f51..b387951f09 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java @@ -57,7 +57,8 @@ import org.springframework.web.bind.annotation.RestController; + "/{uuid:[0-9a-fxA-FX]{8}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{12}}/content") public class BitstreamContentRestController { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamContentRestController.class); + private static final Logger log = org.apache.logging.log4j.LogManager + .getLogger(BitstreamContentRestController.class); //Most file systems are configured to use block sizes of 4096 or 8192 and our buffer should be a multiple of that. private static final int BUFFER_SIZE = 4096 * 10; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionDefinitionConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionDefinitionConverter.java index c7c1f3757d..e9abeb8633 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionDefinitionConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/SubmissionDefinitionConverter.java @@ -37,7 +37,8 @@ import org.springframework.stereotype.Component; @Component public class SubmissionDefinitionConverter extends DSpaceConverter { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionDefinitionConverter.class); + private static final Logger log = org.apache.logging.log4j.LogManager + .getLogger(SubmissionDefinitionConverter.class); @Autowired private SubmissionSectionConverter panelConverter; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java index 39ee598564..69fb7a64fc 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java @@ -43,7 +43,8 @@ import org.springframework.stereotype.Component; public class SubmissionUploadRestRepository extends DSpaceRestRepository implements LinkRestRepository { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionUploadRestRepository.class); + private static final Logger log = org.apache.logging.log4j.LogManager + .getLogger(SubmissionUploadRestRepository.class); private SubmissionConfigReader submissionConfigReader; @@ -141,4 +142,4 @@ public class SubmissionUploadRestRepository extends DSpaceRestRepository Date: Tue, 6 Mar 2018 13:29:24 -0500 Subject: [PATCH 150/193] Update POMs to version 2.10.0 --- dspace-services/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml index b12da0859c..545192cd99 100644 --- a/dspace-services/pom.xml +++ b/dspace-services/pom.xml @@ -150,7 +150,7 @@ org.apache.logging.log4j - log4j-core + log4j-core ${log4j.version} From bb2dde22b19c1b1f8313e18832a86fe8e4e6c73a Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Fri, 9 Mar 2018 17:54:01 -0500 Subject: [PATCH 151/193] Convert getLogger() and Log4J imports for Log4J 2 --- .../main/java/org/dspace/authenticate/IPAuthentication.java | 1 + .../org/dspace/content/packager/AbstractMETSDisseminator.java | 1 - .../src/main/java/org/dspace/eperson/SubscribeCLITool.java | 1 - .../org/dspace/app/rest/BitstreamContentRestController.java | 3 +-- .../app/rest/repository/SubmissionUploadRestRepository.java | 3 +-- .../src/main/java/org/purl/sword/client/ClientFactory.java | 2 +- 6 files changed, 4 insertions(+), 7 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java index f78cc449be..8daa5ca42e 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java @@ -17,6 +17,7 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.collections.ListUtils; import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; diff --git a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java index e8e4e974b4..9f528d96b7 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java @@ -126,7 +126,6 @@ public abstract class AbstractMETSDisseminator /** * log4j category */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractMETSDisseminator.class); // JDOM xml output writer - indented format for readability. diff --git a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java index 2b3a8a9661..ccfe8fee93 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java +++ b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java @@ -27,7 +27,6 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.Logger; -// Replace with new log4j 2: import org.apache.logging.log4j.Level; import org.dspace.content.Collection; import org.dspace.content.DCDate; import org.dspace.content.Item; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java index b387951f09..afb6a20f51 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java @@ -57,8 +57,7 @@ import org.springframework.web.bind.annotation.RestController; + "/{uuid:[0-9a-fxA-FX]{8}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{12}}/content") public class BitstreamContentRestController { - private static final Logger log = org.apache.logging.log4j.LogManager - .getLogger(BitstreamContentRestController.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamContentRestController.class); //Most file systems are configured to use block sizes of 4096 or 8192 and our buffer should be a multiple of that. private static final int BUFFER_SIZE = 4096 * 10; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java index 69fb7a64fc..6cad29cc36 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java @@ -43,8 +43,7 @@ import org.springframework.stereotype.Component; public class SubmissionUploadRestRepository extends DSpaceRestRepository implements LinkRestRepository { - private static final Logger log = org.apache.logging.log4j.LogManager - .getLogger(SubmissionUploadRestRepository.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionUploadRestRepository.class); private SubmissionConfigReader submissionConfigReader; diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java index 83d7ed0c11..57a2473bf8 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java @@ -7,7 +7,7 @@ */ package org.purl.sword.client; -// Replace with log4j 2: import org.apache.logging.log4j.PropertyConfigurator; +import org.apache.logging.log4j.PropertyConfigurator; /** * Entry point for the SWORD Demonstration Client. This will parse the list of From 7bd47362b6cc4bc78d7bf7f8d84ecc369832b5fb Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Thu, 22 Mar 2018 19:52:52 -0400 Subject: [PATCH 152/193] Refactor additional loggers for log4jv2 --- .../src/main/java/org/purl/sword/client/ClientFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java index 57a2473bf8..83d7ed0c11 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java @@ -7,7 +7,7 @@ */ package org.purl.sword.client; -import org.apache.logging.log4j.PropertyConfigurator; +// Replace with log4j 2: import org.apache.logging.log4j.PropertyConfigurator; /** * Entry point for the SWORD Demonstration Client. This will parse the list of From 56dd50d283c582f18b86fe3b826ce613718f71ba Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Sat, 7 Apr 2018 08:55:15 -0400 Subject: [PATCH 153/193] Additional refactoring for log4jv2 --- .../org/dspace/app/rest/BitstreamContentRestController.java | 3 ++- .../app/rest/repository/SubmissionUploadRestRepository.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java index afb6a20f51..b387951f09 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java @@ -57,7 +57,8 @@ import org.springframework.web.bind.annotation.RestController; + "/{uuid:[0-9a-fxA-FX]{8}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{12}}/content") public class BitstreamContentRestController { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamContentRestController.class); + private static final Logger log = org.apache.logging.log4j.LogManager + .getLogger(BitstreamContentRestController.class); //Most file systems are configured to use block sizes of 4096 or 8192 and our buffer should be a multiple of that. private static final int BUFFER_SIZE = 4096 * 10; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java index 6cad29cc36..69fb7a64fc 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java @@ -43,7 +43,8 @@ import org.springframework.stereotype.Component; public class SubmissionUploadRestRepository extends DSpaceRestRepository implements LinkRestRepository { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionUploadRestRepository.class); + private static final Logger log = org.apache.logging.log4j.LogManager + .getLogger(SubmissionUploadRestRepository.class); private SubmissionConfigReader submissionConfigReader; From 7996283d3cef49a0db0b07b1c3227ae37c7712b2 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Sat, 7 Apr 2018 19:11:45 -0400 Subject: [PATCH 154/193] Fix files not conforming to code style --- .../org/dspace/content/NonUniqueMetadataExceptionTest.java | 4 +++- .../dspace/app/rest/test/AbstractDSpaceIntegrationTest.java | 4 +++- .../app/rest/test/AbstractIntegrationTestWithDatabase.java | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java b/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java index 2ba4aa44e2..b99e44c7f2 100644 --- a/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java +++ b/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java @@ -9,6 +9,7 @@ package org.dspace.content; import static org.junit.Assert.assertTrue; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.Test; @@ -23,7 +24,8 @@ public class NonUniqueMetadataExceptionTest { /** * log4j category */ - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(NonUniqueMetadataExceptionTest.class); + private static final Logger log = LogManager + .getLogger(NonUniqueMetadataExceptionTest.class); /** * Dummy test to avoid initialization errors diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java index b2b550d69e..6854f0a225 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java @@ -15,6 +15,7 @@ import java.sql.SQLException; import java.util.Properties; 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.servicemanager.DSpaceKernelImpl; @@ -30,7 +31,8 @@ public class AbstractDSpaceIntegrationTest { /** * log4j category */ - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceIntegrationTest.class); + private static final Logger log = LogManager + .getLogger(AbstractDSpaceIntegrationTest.class); /** * Test properties. These configure our general test environment diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java index 8af9da111a..2c89f63183 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java @@ -12,6 +12,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; import java.util.Arrays; +import org.apache.logging.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.app.launcher.ScriptLauncher; import org.dspace.app.rest.builder.AbstractBuilder; @@ -37,7 +38,8 @@ public class AbstractIntegrationTestWithDatabase extends AbstractDSpaceIntegrati /** * log4j category */ - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractIntegrationTestWithDatabase.class); + private static final Logger log = LogManager + .getLogger(AbstractIntegrationTestWithDatabase.class); /** * Context mock object to use in the tests. From a3db6f727c36813a387eca231a04e78e697bce3b Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Sat, 7 Apr 2018 19:46:25 -0400 Subject: [PATCH 155/193] Fix import statement --- .../app/rest/test/AbstractIntegrationTestWithDatabase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java index 2c89f63183..6f6ee8519a 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java @@ -12,7 +12,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; import java.util.Arrays; -import org.apache.logging.LogManager; +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; From 8eb074b11f75d18587b5e7d9473cc18b181b3213 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Tue, 4 Sep 2018 19:35:40 -0400 Subject: [PATCH 156/193] Fix dependency convergence --- .../dspace/authenticate/IPAuthentication.java | 1 - .../dspace/authority/orcid/xml/Converter.java | 3 +- .../dspace/authority/orcid/xml/XMLtoBio.java | 2 +- .../packager/AbstractMETSDisseminator.java | 6 ++-- .../statistics/SolrLoggerServiceImpl.java | 10 +++---- dspace-solr/pom.xml | 28 +++++++++++++------ .../app/rest/utils/DiscoverQueryBuilder.java | 2 +- 7 files changed, 28 insertions(+), 24 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java index 8daa5ca42e..f78cc449be 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java @@ -17,7 +17,6 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.collections.ListUtils; import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java index f64b498235..d55f9d4eee 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java @@ -14,9 +14,8 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; -import org.xml.sax.SAXException; - import org.apache.logging.log4j.Logger; +import org.xml.sax.SAXException; /** * @param type diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java index 7f2de9f870..d7fdb4dc81 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java @@ -12,6 +12,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; +import org.apache.logging.log4j.Logger; import org.dspace.authority.orcid.Orcidv2; import org.dspace.utils.DSpace; import org.orcid.jaxb.model.common_v2.OrcidId; @@ -19,7 +20,6 @@ import org.orcid.jaxb.model.record_v2.Person; import org.orcid.jaxb.model.search_v2.Result; import org.orcid.jaxb.model.search_v2.Search; import org.xml.sax.SAXException; -import org.apache.logging.log4j.Logger; /** * @author Antoine Snyers (antoine at atmire.com) diff --git a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java index 9f528d96b7..f32990ea5b 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java @@ -53,7 +53,6 @@ import edu.harvard.hul.ois.mets.helper.MetsException; import edu.harvard.hul.ois.mets.helper.MetsValidator; import edu.harvard.hul.ois.mets.helper.MetsWriter; import edu.harvard.hul.ois.mets.helper.PreformedXML; -import org.apache.logging.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; @@ -86,8 +85,6 @@ import org.jdom.Element; import org.jdom.Namespace; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Base class for disseminator of @@ -126,7 +123,8 @@ public abstract class AbstractMETSDisseminator /** * log4j category */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractMETSDisseminator.class); + private static org.apache.logging.log4j.Logger log = + org.apache.logging.log4j.LogManager.getLogger(AbstractMETSDisseminator.class); // JDOM xml output writer - indented format for readability. protected static XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java index bf3cd0d3dc..fd26725a71 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java @@ -45,7 +45,6 @@ import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; @@ -90,8 +89,6 @@ import org.dspace.statistics.util.DnsLookup; import org.dspace.statistics.util.LocationUtils; import org.dspace.statistics.util.SpiderDetector; import org.dspace.usage.UsageWorkflowEvent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; @@ -105,9 +102,10 @@ import org.springframework.beans.factory.annotation.Autowired; * @author mdiggory at atmire.com */ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBean { - - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrLoggerServiceImpl.class); - + + private static final org.apache.logging.log4j.Logger log = + org.apache.logging.log4j.LogManager.getLogger(SolrLoggerServiceImpl.class); + private static final String MULTIPLE_VALUES_SPLITTER = "|"; protected SolrServer solr; diff --git a/dspace-solr/pom.xml b/dspace-solr/pom.xml index 181e884946..c49354c610 100644 --- a/dspace-solr/pom.xml +++ b/dspace-solr/pom.xml @@ -169,6 +169,10 @@ jetty-xml org.eclipse.jetty + + org.apache.zookeeper + zookeeper + @@ -224,6 +228,10 @@ jetty-xml org.eclipse.jetty + + log4j + log4j + org.apache.zookeeper zookeeper @@ -237,15 +245,11 @@ zookeeper 3.4.6 - - log4j - log4j - - org.slf4j - slf4j-log4j12 - - + log4j + log4j + + @@ -257,7 +261,13 @@ org.slf4j slf4j-log4j12 - runtime + runtime + + + log4j + log4j + + org.apache.logging.log4j diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java index 04b8302f77..70d97906ae 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java @@ -14,8 +14,8 @@ import java.util.List; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.dspace.app.rest.converter.query.SearchQueryConverter; import org.apache.logging.log4j.Logger; +import org.dspace.app.rest.converter.query.SearchQueryConverter; import org.dspace.app.rest.exception.InvalidDSpaceObjectTypeException; import org.dspace.app.rest.exception.InvalidRequestException; import org.dspace.app.rest.exception.InvalidSearchFacetException; From 538b0046e5dbe7bb015cd417a4e565463a1cb1b5 Mon Sep 17 00:00:00 2001 From: Patrick Trottier Date: Thu, 6 Sep 2018 16:51:36 -0400 Subject: [PATCH 157/193] Change to version 2.6.2 of log4j To ensure compatibility with Spring Boot v1.4.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a90b9bc4b2..f8f63329a7 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 42.2.1 4.10.4 2.13.0 - 2.11.0 + 2.6.2 1.7.22 2.8.11 2.26 From f48d005e2c74ed5a54f5b9e8e887bbb33a4ef9a4 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 31 Mar 2017 15:49:41 -0400 Subject: [PATCH 158/193] [DS-3135] log4j 2 needs new configuration -- start with the command line tools --- dspace/config/log4j.xml | 78 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 dspace/config/log4j.xml diff --git a/dspace/config/log4j.xml b/dspace/config/log4j.xml new file mode 100644 index 0000000000..13f84deff3 --- /dev/null +++ b/dspace/config/log4j.xml @@ -0,0 +1,78 @@ + + + + + + ${dspace.dir}/log + + + INFO + + + INFO + + + + + + + + yyyy-MM-dd + + + + + + + + + yyyy-MM-dd + + + + + + + + + + + + + + + + + + + + + # Block services logging except on exceptions + + + + + + + # Block passwords from being exposed in Axis logs. + # (DEBUG exposes passwords in Basic Auth) + + + From f5d325b36bf1acbc3f1082ebdd51d49e89f6e14b Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sat, 13 Oct 2018 18:55:55 -0400 Subject: [PATCH 159/193] [DS-3135] Fix new class that uses old log4j. --- .../org/dspace/authority/orcid/Orcidv2.java | 9 +- dspace/config/log4j.properties | 95 ------------------- 2 files changed, 6 insertions(+), 98 deletions(-) delete mode 100644 dspace/config/log4j.properties diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java index 14f0f9888d..a545c6cf9e 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java @@ -20,7 +20,8 @@ import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.authority.AuthorityValue; import org.dspace.authority.SolrAuthorityInterface; import org.dspace.authority.orcid.xml.XMLtoBio; @@ -35,7 +36,7 @@ import org.orcid.jaxb.model.record_v2.Person; */ public class Orcidv2 implements SolrAuthorityInterface { - private static Logger log = Logger.getLogger(Orcidv2.class); + private static Logger log = LogManager.getLogger(Orcidv2.class); public RESTConnector restConnector; private String OAUTHUrl; @@ -46,7 +47,9 @@ public class Orcidv2 implements SolrAuthorityInterface { private String accessToken; /** - * Initialize the accessToken that is required for all subsequent calls to ORCID + * Initialize the accessToken that is required for all subsequent calls to ORCID. + * + * @throws java.io.IOException passed through from HTTPclient. */ public void init() throws IOException { if (StringUtils.isNotBlank(accessToken) && StringUtils.isNotBlank(clientSecret)) { diff --git a/dspace/config/log4j.properties b/dspace/config/log4j.properties deleted file mode 100644 index 5378533250..0000000000 --- a/dspace/config/log4j.properties +++ /dev/null @@ -1,95 +0,0 @@ -########################################################################### -# log4j.properties -# -# This is the primary log4j (logging) configuration file for DSpace. By default, -# Log4j is configured to write log files that rotate daily. However, you may -# tweak these settings based on your local needs / best practices. -# For more information on log4j configuration, see: -# https://logging.apache.org/log4j/1.2/manual.html -########################################################################### - -# VARIABLES: -# The following variables can be used to easily tweak the default log4j settings. -# These variables are used by the log4j config / appenders later in this file. - -# log.dir -# Default log file directory for DSpace. Defaults to the 'log' subdirectory -# under [dspace.dir]. NOTE: The value of 'dspace.dir' will be replaced by -# its value in your configuration when DSpace is deployed (via Ant). -log.dir=${dspace.dir}/log - -# loglevel.dspace -# Log level for all DSpace-specific code (org.dspace.*) -# Possible values (from most to least info): DEBUG, INFO, WARN, ERROR, FATAL -# Defaults to INFO -loglevel.dspace=INFO - -# loglevel.other -# Log level for other third-party tools/APIs used by DSpace -# Possible values (from most to least info): DEBUG, INFO, WARN, ERROR, FATAL -# Defaults to INFO -loglevel.other=INFO - - -########################################################################### -# A1 is the name of the appender for most DSpace activity. -########################################################################### -# The root category is the default setting for all non-DSpace code. -# Change this from INFO to DEBUG to see extra logging created by non-DSpace -# code. -log4j.rootCategory=${loglevel.other}, A1 -# This line sets the logging level for DSpace code. Set this to DEBUG to see -# extra detailed logging for DSpace code. -log4j.logger.org.dspace=${loglevel.dspace}, A1 - -# Do not change these "additivity" lines -log4j.additivity.org.dspace=false - -# The name of the file appender -log4j.appender.A1=org.dspace.app.util.DailyFileAppender -# The filename of the log file created. A date stamp is appended to this -log4j.appender.A1.File=${log.dir}/dspace.log -# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files -log4j.appender.A1.DatePattern=yyyy-MM-dd -# The number of log files to keep, or 0 to keep them all -log4j.appender.A1.MaxLogs=0 -# A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n - - -########################################################################### -# A2 is the name of the appender for the Checksum Checker -########################################################################### -# This line sets the logging level for the checksum checker log file. -# Set this to DEBUG to see extra detailed logging. -log4j.logger.org.dspace.checker=INFO, A2 -# Do not change this line -log4j.additivity.org.dspace.checker=false -# The name of the file appender -log4j.appender.A2=org.dspace.app.util.DailyFileAppender -# The filename of the log file created. A date stamp is appended to this -log4j.appender.A2.File=${log.dir}/checker.log -# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files -log4j.appender.A2.DatePattern=yyyy-MM-dd -# The number of log files to keep, or 0 to keep them all -log4j.appender.A2.MaxLogs=0 -# A2 uses PatternLayout. -log4j.appender.A2.layout=org.apache.logging.log4j.PatternLayout -log4j.appender.A2.layout.ConversionPattern=%m%n - - -########################################################################### -# Other settings -########################################################################### - -# Block passwords from being exposed in Axis logs. -# (DEBUG exposes passwords in Basic Auth) -log4j.logger.org.apache.axis.handlers.http.HTTPAuthHandler=INFO - -# Block services logging except on exceptions -log4j.logger.org.dspace.kernel=ERROR -log4j.logger.org.dspace.services=ERROR -log4j.logger.org.dspace.servicemanager=ERROR -log4j.logger.org.dspace.providers=ERROR -log4j.logger.org.dspace.utils=ERROR From 9be54714d3f5c079e8eb255d57bd2262f0ff366b Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sat, 13 Oct 2018 18:57:17 -0400 Subject: [PATCH 160/193] [DS-3135] More dependency fixes. --- dspace-api/pom.xml | 7 ++++--- dspace-services/pom.xml | 9 +++++---- pom.xml | 10 ++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 345acce24f..5c698f7e89 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -433,12 +433,14 @@ org.apache.logging.log4j log4j-api - ${log4j.version} + + + org.apache.logging.log4j + log4j-1.2-api org.apache.logging.log4j log4j-core - ${log4j.version} oro @@ -643,7 +645,6 @@ com.google.guava guava - 19.0 diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml index 545192cd99..e402bed92b 100644 --- a/dspace-services/pom.xml +++ b/dspace-services/pom.xml @@ -139,10 +139,6 @@ 6.1.26 test - - org.slf4j - slf4j-log4j12 - org.apache.logging.log4j log4j-api @@ -153,6 +149,11 @@ log4j-core ${log4j.version} + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + commons-logging diff --git a/pom.xml b/pom.xml index f8f63329a7..8527346406 100644 --- a/pom.xml +++ b/pom.xml @@ -1263,11 +1263,21 @@ log4j-api ${log4j.version} + + org.apache.logging.log4j + log4j-1.2-api + ${log4j.version} + org.apache.logging.log4j log4j-core ${log4j.version} + + org.apache.logging.log4j + log4j-web + ${log4j.version} + oro oro From bb10bfe01a50015c588af9ada8982e8cf3ba64cb Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 14 Oct 2018 15:18:31 -0400 Subject: [PATCH 161/193] [DS-3135] More dependency cleanup --- dspace-oai/pom.xml | 10 ++++++---- dspace-rdf/pom.xml | 8 ++++++-- dspace-rest/pom.xml | 6 ++++-- dspace-solr/pom.xml | 36 ++++++++++++++++-------------------- dspace-spring-rest/pom.xml | 21 +++++++++++++-------- dspace-sword/pom.xml | 8 ++++++-- dspace-swordv2/pom.xml | 6 ++++-- pom.xml | 7 +++++++ 8 files changed, 62 insertions(+), 40 deletions(-) diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index d58d12f281..9a66c4c86a 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -208,16 +208,18 @@ org.apache.logging.log4j log4j-api - ${log4j.version} org.apache.logging.log4j log4j-core - ${log4j.version} + + org.apache.logging.log4j + log4j-web + - org.slf4j - slf4j-log4j12 + org.apache.logging.log4j + log4j-slf4j-impl runtime diff --git a/dspace-rdf/pom.xml b/dspace-rdf/pom.xml index 0bea543874..b4b4000e6f 100644 --- a/dspace-rdf/pom.xml +++ b/dspace-rdf/pom.xml @@ -67,16 +67,20 @@ javax.servlet-api provided + org.apache.logging.log4j log4j-api - ${log4j.version} org.apache.logging.log4j log4j-core - ${log4j.version} + + org.apache.logging.log4j + log4j-web + + org.apache.commons commons-lang3 diff --git a/dspace-rest/pom.xml b/dspace-rest/pom.xml index 0943fa6e16..6d012d246a 100644 --- a/dspace-rest/pom.xml +++ b/dspace-rest/pom.xml @@ -230,13 +230,15 @@ org.apache.logging.log4j log4j-api - ${log4j.version} org.apache.logging.log4j log4j-core - ${log4j.version} + + org.apache.logging.log4j + log4j-web + org.dspace dspace-services diff --git a/dspace-solr/pom.xml b/dspace-solr/pom.xml index c49354c610..b41e8f3eda 100644 --- a/dspace-solr/pom.xml +++ b/dspace-solr/pom.xml @@ -254,40 +254,36 @@ - org.slf4j - jul-to-slf4j - 1.7.14 - - - org.slf4j - slf4j-log4j12 - runtime - - - log4j - log4j - - + org.apache.logging.log4j + log4j-jul + ${log4j.version} org.apache.logging.log4j log4j-api - ${log4j.version} org.apache.logging.log4j log4j-core - ${log4j.version} + + org.apache.logging.log4j + log4j-web + + + org.apache.logging.log4j + log4j-slf4j-impl + + + commons-logging + commons-logging + + javax.servlet javax.servlet-api provided - - commons-logging - commons-logging - diff --git a/dspace-spring-rest/pom.xml b/dspace-spring-rest/pom.xml index 2bcda527d7..beeafa440d 100644 --- a/dspace-spring-rest/pom.xml +++ b/dspace-spring-rest/pom.xml @@ -183,9 +183,10 @@ ${spring-boot.version} org.slf4j @@ -263,11 +264,14 @@ ${spring-boot.version} - - - + + org.springframework.boot spring-boot-starter + ${spring-boot.version} org.springframework.boot @@ -277,8 +281,9 @@ org.springframework.boot - spring-boot-starter-log4j - --> + spring-boot-starter-log4j2 + ${spring-boot.version} + diff --git a/dspace-sword/pom.xml b/dspace-sword/pom.xml index e931469c9d..63f149e01f 100644 --- a/dspace-sword/pom.xml +++ b/dspace-sword/pom.xml @@ -120,16 +120,20 @@ junit test + org.apache.logging.log4j log4j-api - ${log4j.version} org.apache.logging.log4j log4j-core - ${log4j.version} + + org.apache.logging.log4j + log4j-web + + xom xom diff --git a/dspace-swordv2/pom.xml b/dspace-swordv2/pom.xml index f5eea1366b..6ac1a15b5d 100644 --- a/dspace-swordv2/pom.xml +++ b/dspace-swordv2/pom.xml @@ -122,13 +122,15 @@ org.apache.logging.log4j log4j-api - ${log4j.version} org.apache.logging.log4j log4j-core - ${log4j.version} + + org.apache.logging.log4j + log4j-web + org.apache.abdera abdera-client diff --git a/pom.xml b/pom.xml index 8527346406..b2d1681d40 100644 --- a/pom.xml +++ b/pom.xml @@ -1258,6 +1258,7 @@ jdom 1.1.3 + org.apache.logging.log4j log4j-api @@ -1278,6 +1279,12 @@ log4j-web ${log4j.version} + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + oro oro From 5cbe4fefb59d0e277e5d96ec150d56ec20a5dd1d Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 14 Oct 2018 15:19:06 -0400 Subject: [PATCH 162/193] [DS-3135] Correct Log4J configuration file name. --- dspace/config/log4j.xml | 78 ---------------------------------- dspace/config/log4j2.xml | 91 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 78 deletions(-) delete mode 100644 dspace/config/log4j.xml create mode 100644 dspace/config/log4j2.xml diff --git a/dspace/config/log4j.xml b/dspace/config/log4j.xml deleted file mode 100644 index 13f84deff3..0000000000 --- a/dspace/config/log4j.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - ${dspace.dir}/log - - - INFO - - - INFO - - - - - - - - yyyy-MM-dd - - - - - - - - - yyyy-MM-dd - - - - - - - - - - - - - - - - - - - - - # Block services logging except on exceptions - - - - - - - # Block passwords from being exposed in Axis logs. - # (DEBUG exposes passwords in Basic Auth) - - - diff --git a/dspace/config/log4j2.xml b/dspace/config/log4j2.xml new file mode 100644 index 0000000000..98a0300125 --- /dev/null +++ b/dspace/config/log4j2.xml @@ -0,0 +1,91 @@ + + + + + + ${log4j:configParentLocation}/../log + + + INFO + + + INFO + + + + + + + + yyyy-MM-dd + + + + + + + + + yyyy-MM-dd + + + + + + + + + + + + + + + + + + + + + # Block services logging except on exceptions + + + + + + + # Block passwords from being exposed in Axis logs. + # (DEBUG exposes passwords in Basic Auth) + + + From 3f904dc4ec3839a3cf13e89a6c50cdc05d03f119 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 14 Oct 2018 15:21:41 -0400 Subject: [PATCH 163/193] [DS-3135] Tell Log4J where to find its configuration. --- dspace-oai/src/main/webapp/WEB-INF/web.xml | 5 +++++ dspace-rdf/src/main/webapp/WEB-INF/web.xml | 8 ++++++++ dspace-rest/src/main/webapp/WEB-INF/web.xml | 8 ++++++++ dspace-solr/src/main/webapp/WEB-INF/web.xml | 6 ++++-- .../src/main/resources/application.properties | 6 +++++- dspace-sword/src/main/webapp/WEB-INF/web.xml | 8 ++++++++ dspace-swordv2/src/main/webapp/WEB-INF/web.xml | 11 ++++++++++- dspace/bin/dspace | 7 ++++--- dspace/bin/dspace.bat | 4 ++-- 9 files changed, 54 insertions(+), 9 deletions(-) diff --git a/dspace-oai/src/main/webapp/WEB-INF/web.xml b/dspace-oai/src/main/webapp/WEB-INF/web.xml index 54d207c099..d731a0c659 100644 --- a/dspace-oai/src/main/webapp/WEB-INF/web.xml +++ b/dspace-oai/src/main/webapp/WEB-INF/web.xml @@ -20,6 +20,11 @@ ${dspace.dir} + + log4jConfiguration + ${dspace.dir}/config/log4j2.xml + The location of the Log4J configuration + diff --git a/dspace-rdf/src/main/webapp/WEB-INF/web.xml b/dspace-rdf/src/main/webapp/WEB-INF/web.xml index 65f22b637b..c15ec675f3 100644 --- a/dspace-rdf/src/main/webapp/WEB-INF/web.xml +++ b/dspace-rdf/src/main/webapp/WEB-INF/web.xml @@ -22,6 +22,14 @@ ${dspace.dir} + + log4jConfiguration + ${dspace.dir}/config/log4j2.xml + + The location of the Log4J configuration + + + dspace.request org.dspace.utils.servlet.DSpaceWebappServletFilter diff --git a/dspace-rest/src/main/webapp/WEB-INF/web.xml b/dspace-rest/src/main/webapp/WEB-INF/web.xml index df639b9b08..ba96425824 100644 --- a/dspace-rest/src/main/webapp/WEB-INF/web.xml +++ b/dspace-rest/src/main/webapp/WEB-INF/web.xml @@ -76,6 +76,14 @@ ${dspace.dir} + + log4jConfiguration + ${dspace.dir}/config/log4j2.xml + + The location of the Log4J configuration + + + contextConfigLocation diff --git a/dspace-solr/src/main/webapp/WEB-INF/web.xml b/dspace-solr/src/main/webapp/WEB-INF/web.xml index 67350c4dcc..081d436b9f 100644 --- a/dspace-solr/src/main/webapp/WEB-INF/web.xml +++ b/dspace-solr/src/main/webapp/WEB-INF/web.xml @@ -45,9 +45,11 @@ initialized until the DSpace Kernel starts up, and we don't want Solr to depend on the DSpace Kernel/API --> - log4j.configuration + log4jConfiguration ${dspace.dir}/config/log4j-solr.properties - URL locating a Log4J configuration file (properties or XML). + + URL locating a Log4J configuration file (properties or XML). + diff --git a/dspace-spring-rest/src/main/resources/application.properties b/dspace-spring-rest/src/main/resources/application.properties index cc29bc7e3c..422d4913c5 100644 --- a/dspace-spring-rest/src/main/resources/application.properties +++ b/dspace-spring-rest/src/main/resources/application.properties @@ -112,4 +112,8 @@ spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSou # #logging.level.org.springframework.boot=DEBUG #logging.level.org.springframework.web=DEBUG -#logging.level.org.hibernate=ERROR \ No newline at end of file +#logging.level.org.hibernate=ERROR + +######################### +# Log4J configuration +server.context-parameters.log4jConfiguration=${dspace.dir}/config/log4j2.xml diff --git a/dspace-sword/src/main/webapp/WEB-INF/web.xml b/dspace-sword/src/main/webapp/WEB-INF/web.xml index 3d721e9744..14b873ccd9 100644 --- a/dspace-sword/src/main/webapp/WEB-INF/web.xml +++ b/dspace-sword/src/main/webapp/WEB-INF/web.xml @@ -27,6 +27,14 @@ org.dspace.sword.DSpaceSWORDServer + + log4jConfiguration + ${dspace.dir}/config/log4j2.xml + + The location of the Log4J configuration + + + The type of authentication used : [Basic|None] authentication-method diff --git a/dspace-swordv2/src/main/webapp/WEB-INF/web.xml b/dspace-swordv2/src/main/webapp/WEB-INF/web.xml index 52feaf240a..f7794795dd 100644 --- a/dspace-swordv2/src/main/webapp/WEB-INF/web.xml +++ b/dspace-swordv2/src/main/webapp/WEB-INF/web.xml @@ -29,7 +29,16 @@ org.dspace.sword2.ServiceDocumentManagerDSpace - + + log4jConfiguration + ${dspace.dir}/config/log4j2.xml + + The location of the Log4J configuration + + + + The CollectionListManager server implementation class name collection-list-impl diff --git a/dspace/bin/dspace b/dspace/bin/dspace index 92a40d1f11..d7d5ae1a69 100644 --- a/dspace/bin/dspace +++ b/dspace/bin/dspace @@ -35,8 +35,6 @@ if [ "$1" = "classpath" ]; then exit 0 fi - - #Allow user to specify java options through JAVA_OPTS variable if [ "$JAVA_OPTS" = "" ]; then #Default Java to use 256MB of memory @@ -44,4 +42,7 @@ if [ "$JAVA_OPTS" = "" ]; then fi # Now invoke Java -java $JAVA_OPTS -classpath $FULLPATH org.dspace.app.launcher.ScriptLauncher "$@" +java $JAVA_OPTS \ + -classpath $FULLPATH \ + -Dlog4j.configurationFile=$DSPACEDIR/config/log4j2.xml \ + org.dspace.app.launcher.ScriptLauncher "$@" diff --git a/dspace/bin/dspace.bat b/dspace/bin/dspace.bat index 7cef8e2300..8ad421ff32 100644 --- a/dspace/bin/dspace.bat +++ b/dspace/bin/dspace.bat @@ -39,7 +39,7 @@ REM Otherwise, default Java to using 256MB of memory if "%JAVA_OPTS%"=="" set "JAVA_OPTS=-Xmx256m -Dfile.encoding=UTF-8" REM Execute Java -java %JAVA_OPTS% -classpath "%DSPACE_CLASSPATH%" org.dspace.app.launcher.ScriptLauncher %* +java %JAVA_OPTS% -classpath "%DSPACE_CLASSPATH%" -Dlog4j.configurationFile=%DSPACEDIR%/config/log4j2.xml org.dspace.app.launcher.ScriptLauncher %* REM Clean up DSPACE_CLASSPATH variable set DSPACE_CLASSPATH= @@ -47,4 +47,4 @@ set DSPACE_CLASSPATH= :end REM Back to original dir -chdir /D %CURRENT_DIR% \ No newline at end of file +chdir /D %CURRENT_DIR% From f3505ed22b498e705684a057845d3be1619068e7 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sat, 27 Oct 2018 07:37:05 -0400 Subject: [PATCH 164/193] [DS-3135] Still more dependency cleanup. --- dspace-rdf/pom.xml | 12 ++++++++++++ dspace-solr/pom.xml | 8 ++++++++ dspace/modules/oai/pom.xml | 6 ++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/dspace-rdf/pom.xml b/dspace-rdf/pom.xml index b4b4000e6f..9c6c154ddc 100644 --- a/dspace-rdf/pom.xml +++ b/dspace-rdf/pom.xml @@ -33,6 +33,18 @@ jackson-databind com.fasterxml.jackson.core + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + pom diff --git a/dspace-solr/pom.xml b/dspace-solr/pom.xml index b41e8f3eda..0672ce9cbc 100644 --- a/dspace-solr/pom.xml +++ b/dspace-solr/pom.xml @@ -173,6 +173,10 @@ org.apache.zookeeper zookeeper + + log4j + log4j + @@ -249,6 +253,10 @@ log4j log4j + + org.slf4j + slf4j-log4j12 + diff --git a/dspace/modules/oai/pom.xml b/dspace/modules/oai/pom.xml index 441846e8ce..e36adfafcc 100644 --- a/dspace/modules/oai/pom.xml +++ b/dspace/modules/oai/pom.xml @@ -130,10 +130,12 @@ javax.servlet-api provided + com.lyncode From 959b5122b7171752a8a415e6a6d3caed9dfce617 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 28 Oct 2018 07:53:05 -0400 Subject: [PATCH 165/193] [DS-3135] Squash one more log4j1 dependency. --- dspace/modules/solr/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dspace/modules/solr/pom.xml b/dspace/modules/solr/pom.xml index d84c1a4a51..ff0927727a 100644 --- a/dspace/modules/solr/pom.xml +++ b/dspace/modules/solr/pom.xml @@ -130,6 +130,10 @@ org.apache.zookeeper zookeeper + + log4j + log4j + From 9133d289ed07de0f0f25aad6a37ad6ce03ee420f Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 28 Oct 2018 07:54:16 -0400 Subject: [PATCH 166/193] [DS-3135] Satisfy Checkstyle by removing unused includes; tighten up the code a little. --- .../src/main/java/org/dspace/submit/step/DescribeStep.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java b/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java index c429ea103c..ae58efc1c3 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java @@ -7,11 +7,8 @@ */ package org.dspace.submit.step; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.dspace.content.InProgressSubmission; -import org.dspace.core.Context; -import org.dspace.services.model.Request; -import org.dspace.submit.AbstractProcessingStep; /** * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) @@ -20,6 +17,6 @@ public class DescribeStep extends MetadataStep { /** * log4j logger */ - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DescribeStep.class); + private static final Logger log = LogManager.getLogger(); } From b668860a2b2b8c2763eddcb81235111bb7937ead Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 28 Oct 2018 11:39:48 -0400 Subject: [PATCH 167/193] [DS-3135] Don't configure Solr with ConfigureLog4jListener which no longer exists. --- dspace-solr/src/main/webapp/WEB-INF/web.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dspace-solr/src/main/webapp/WEB-INF/web.xml b/dspace-solr/src/main/webapp/WEB-INF/web.xml index 081d436b9f..52e02583d4 100644 --- a/dspace-solr/src/main/webapp/WEB-INF/web.xml +++ b/dspace-solr/src/main/webapp/WEB-INF/web.xml @@ -108,10 +108,6 @@ - - org.dspace.solr.filters.ConfigureLog4jListener - - Zookeeper org.apache.solr.servlet.ZookeeperInfoServlet From 2925a3a3bf31b132860b1b008f54f7ab1be73b24 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Sun, 28 Oct 2018 20:02:34 -0400 Subject: [PATCH 168/193] [DS-3135] Finish converting log4j2 configuration; make it work for Solr; tweak Ant usage. --- dspace-solr/src/main/webapp/WEB-INF/web.xml | 47 +++++++++++++-------- dspace/config/dspace.cfg | 6 +-- dspace/config/log4j-console.properties | 23 ---------- dspace/config/log4j-solr.properties | 44 ------------------- dspace/config/log4j2-console.xml | 32 ++++++++++++++ dspace/config/log4j2-solr.xml | 40 ++++++++++++++++++ dspace/src/main/config/build.xml | 21 ++++++--- 7 files changed, 118 insertions(+), 95 deletions(-) delete mode 100644 dspace/config/log4j-console.properties delete mode 100644 dspace/config/log4j-solr.properties create mode 100644 dspace/config/log4j2-console.xml create mode 100644 dspace/config/log4j2-solr.xml diff --git a/dspace-solr/src/main/webapp/WEB-INF/web.xml b/dspace-solr/src/main/webapp/WEB-INF/web.xml index 52e02583d4..fd5846a4b4 100644 --- a/dspace-solr/src/main/webapp/WEB-INF/web.xml +++ b/dspace-solr/src/main/webapp/WEB-INF/web.xml @@ -1,6 +1,4 @@ - - + - - + Solr home: configuration, cores etc. solr/home ${dspace.dir}/solr java.lang.String - + - log4jConfiguration - ${dspace.dir}/config/log4j-solr.properties URL locating a Log4J configuration file (properties or XML). + log4jConfiguration + ${dspace.dir}/config/log4j-solr.xml + + org.apache.logging.log4j.web.Log4jServletContextListener + + + + Activate logging + log4jServletFilter + org.apache.logging.log4j.web.Log4jServletFilter + + LocalHostRestrictionFilter @@ -85,6 +88,14 @@ --> + + log4jServletFilter + /* + REQUEST + FORWARD + INCLUDE + ERROR + LocalHostRestrictionFilter diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index a36ba73201..d1176f6c37 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -164,10 +164,10 @@ mail.allowed.referrers = ${dspace.hostname} ##### Logging configuration ##### # Override default log4j configuration file # You may provide your own configuration here, existing alternatives are: -# log.init.config = ${dspace.dir}/config/log4j-console.properties -log.init.config = ${dspace.dir}/config/log4j.properties +# log.init.config = ${dspace.dir}/config/log4j2-console.xml +log.init.config = ${dspace.dir}/config/log4j2.xml -# All other log4j settings moved to config/log4j.properties +# All other log4j settings moved to config/log4j2.xml ##### DOI registration agency credentials ###### # To mint DOIs you have to use a DOI registration agency like DataCite. Several diff --git a/dspace/config/log4j-console.properties b/dspace/config/log4j-console.properties deleted file mode 100644 index 2ec6892f62..0000000000 --- a/dspace/config/log4j-console.properties +++ /dev/null @@ -1,23 +0,0 @@ -############################################################# -# log4j-console.properties -# -# Simple log4j configuration file used during Ant build tasks -# -# Its goal is to simply output logs to the commandline / console. -############################################################# - -# Set root category priority to WARN and its only appender to A1. -# For commandline / ant scripts, we are only concerned about significant warnings/errors -# For the full detail, change this to INFO and re-run Ant. -log4j.rootCategory=WARN, A1 - -# A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.logging.log4j.ConsoleAppender - -# A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n - -# block passwords from being exposed in Axis logs. -# (DEBUG exposes passwords in Basic Auth) -log4j.logger.org.apache.axis.handlers.http.HTTPAuthHandler=INFO diff --git a/dspace/config/log4j-solr.properties b/dspace/config/log4j-solr.properties deleted file mode 100644 index a9750333b4..0000000000 --- a/dspace/config/log4j-solr.properties +++ /dev/null @@ -1,44 +0,0 @@ -########################################################################### -# log4j-solr.properties -# -# This is the log4j configuration file for the Solr webapp that comes bundled -# with DSpace. Because Solr is a dependency, its log4j settings are kept -# separate from the default DSpace log4j settings (in log4j.properties). -# -# Therefore, this log4j file is standalone. If you wish to tweak the location of -# your Solr logs, you must do so within this file. -########################################################################### - -# VARIABLES: -# The following variables can be used to easily tweak the default log4j settings. -# These variables are used by the log4j config / appenders later in this file. - -# log.dir -# Default log file directory for DSpace. Defaults to the 'log' subdirectory -# under [dspace.dir]. NOTE: The value of 'dspace.dir' will be replaced by -# its value in your configuration when DSpace is deployed (via Ant). -log.dir=${dspace.dir}/log - -# Logging level for Solr -log4j.rootLogger=INFO, file - -# Console logging options. Switch the above from "file" to "CONSOLE" to enable -log4j.appender.CONSOLE=org.apache.logging.log4j.ConsoleAppender -log4j.appender.CONSOLE.layout=org.apache.logging.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n - -#- size rotation with log cleanup. -log4j.appender.file=org.apache.logging.log4j.DailyRollingFileAppender -# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files -log4j.appender.file.DatePattern='.'yyyy-MM-dd - -#- File to log to and log format -log4j.appender.file.File=${log.dir}/solr.log -log4j.appender.file.layout=org.apache.logging.log4j.PatternLayout -log4j.appender.file.layout.ConversionPattern=%d %-5p %c @ %m%n - -log4j.logger.org.apache.zookeeper=WARN -log4j.logger.org.apache.hadoop=WARN - -# set to INFO to enable infostream log messages -log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF diff --git a/dspace/config/log4j2-console.xml b/dspace/config/log4j2-console.xml new file mode 100644 index 0000000000..db2998f6be --- /dev/null +++ b/dspace/config/log4j2-console.xml @@ -0,0 +1,32 @@ + + + + + + ${log4j:configParentLocation}/../log + + + + + + + + + + + + + + + diff --git a/dspace/config/log4j2-solr.xml b/dspace/config/log4j2-solr.xml new file mode 100644 index 0000000000..1e32365263 --- /dev/null +++ b/dspace/config/log4j2-solr.xml @@ -0,0 +1,40 @@ + + + + + + ${log4j:configParentLocation}/../log + + + + + + + yyyy-MM-dd + + + + + + + + + + + + + + + diff --git a/dspace/src/main/config/build.xml b/dspace/src/main/config/build.xml index ec4782aa5d..81efafd19f 100644 --- a/dspace/src/main/config/build.xml +++ b/dspace/src/main/config/build.xml @@ -781,7 +781,8 @@ Common usage: - + @@ -955,7 +956,8 @@ You may manually install this file by following these steps: - + @@ -1044,7 +1046,8 @@ You may manually install this file by following these steps: Checking if the Solr index at ${indexDir} is >= Solr ${version} - + @@ -1153,8 +1156,10 @@ For more information, please see the Upgrade Instructions. Upgrading the Solr index in ${indexDir}. Depending on the index size, this may take a while (please be patient)... - - + + @@ -1168,8 +1173,10 @@ For more information, please see the Upgrade Instructions. Upgrading the Solr index in ${indexDir}. Depending on the index size, this may take a while (please be patient)... - - + + From 5b66fdf5dbea8a67a611c88390df4c3e765ee0c0 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 5 Nov 2018 10:46:51 -0500 Subject: [PATCH 169/193] [DS-3135] Clean out temporary exclusions; tidy indentation. --- dspace-spring-rest/pom.xml | 41 ++++++++++---------------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/dspace-spring-rest/pom.xml b/dspace-spring-rest/pom.xml index beeafa440d..3ea878747b 100644 --- a/dspace-spring-rest/pom.xml +++ b/dspace-spring-rest/pom.xml @@ -181,26 +181,6 @@ org.springframework.boot spring-boot-starter-web ${spring-boot.version} - - - - org.slf4j - log4j-over-slf4j - - - org.slf4j - jul-to-slf4j - - - ch.qos.logback - logback-classic - - org.springframework.boot @@ -246,16 +226,17 @@ test - - - org.springframework.data - spring-data-rest-hal-browser - 2.5.7.RELEASE - - - + + + org.springframework.data + spring-data-rest-hal-browser + 2.5.7.RELEASE + + + From 38e1d0a8d48292f9c85ce222258a76d49d92dac0 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 5 Nov 2018 11:12:00 -0500 Subject: [PATCH 170/193] [DS-3135] Set the log4jConfiguration context parameter properly. --- dspace-spring-rest/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace-spring-rest/src/main/resources/application.properties b/dspace-spring-rest/src/main/resources/application.properties index 422d4913c5..1be1f5f50a 100644 --- a/dspace-spring-rest/src/main/resources/application.properties +++ b/dspace-spring-rest/src/main/resources/application.properties @@ -116,4 +116,4 @@ spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSou ######################### # Log4J configuration -server.context-parameters.log4jConfiguration=${dspace.dir}/config/log4j2.xml +server.servlet.context-parameters.log4jConfiguration=${dspace.dir}/config/log4j2.xml From eff018aacea2dce36b3be7faf8e1b705729ef6b9 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 5 Nov 2018 13:04:03 -0500 Subject: [PATCH 171/193] [DS-3135] Squash another unused import for Checkstyle. --- .../src/main/java/org/dspace/authenticate/IPAuthentication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java index f78cc449be..e18c4eddd7 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java @@ -18,7 +18,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.logging.log4j.Logger; -import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.core.LogManager; import org.dspace.core.factory.CoreServiceFactory; From e671680ae466f6bd4dc0870aac9b0b58f6c110b1 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 5 Nov 2018 15:01:02 -0500 Subject: [PATCH 172/193] [DS-3135] Let Spring configure Log4J; correct logging config in Ant script. --- .../src/main/resources/application.properties | 2 +- dspace/src/main/config/build.xml | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/dspace-spring-rest/src/main/resources/application.properties b/dspace-spring-rest/src/main/resources/application.properties index 1be1f5f50a..9ab234c642 100644 --- a/dspace-spring-rest/src/main/resources/application.properties +++ b/dspace-spring-rest/src/main/resources/application.properties @@ -116,4 +116,4 @@ spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSou ######################### # Log4J configuration -server.servlet.context-parameters.log4jConfiguration=${dspace.dir}/config/log4j2.xml +logging.config = ${dspace.dir}/config/log4j2.xml diff --git a/dspace/src/main/config/build.xml b/dspace/src/main/config/build.xml index 81efafd19f..ab13191561 100644 --- a/dspace/src/main/config/build.xml +++ b/dspace/src/main/config/build.xml @@ -354,6 +354,7 @@ Common usage: to its log files. In addition, log4j strongly prefers autoconfiguring itself (e.g. see DS-3104). --> + @@ -780,8 +781,11 @@ Common usage: - - + @@ -956,7 +960,7 @@ You may manually install this file by following these steps: - @@ -1046,7 +1050,7 @@ You may manually install this file by following these steps: Checking if the Solr index at ${indexDir} is >= Solr ${version} - @@ -1156,7 +1160,7 @@ For more information, please see the Upgrade Instructions. Upgrading the Solr index in ${indexDir}. Depending on the index size, this may take a while (please be patient)... - @@ -1173,7 +1177,7 @@ For more information, please see the Upgrade Instructions. Upgrading the Solr index in ${indexDir}. Depending on the index size, this may take a while (please be patient)... - From 3929a5d7ac475cb7dd75651992908e2216cd305f Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Mon, 5 Nov 2018 19:05:37 -0500 Subject: [PATCH 173/193] [DS-3135] Remove questionable loglevel fiddling; conform to webapp descriptor schema. --- .../src/main/java/org/dspace/eperson/SubscribeCLITool.java | 4 ---- dspace-rest/src/main/webapp/WEB-INF/web.xml | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java index ccfe8fee93..d7174e7d45 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java +++ b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java @@ -314,10 +314,6 @@ public class SubscribeCLITool { boolean test = line.hasOption("t"); - if (test) { - //TODO Replace with log4j2: org.apache.logging.log4j.core.config.Configurator.setLevel(); - } - Context context = null; try { diff --git a/dspace-rest/src/main/webapp/WEB-INF/web.xml b/dspace-rest/src/main/webapp/WEB-INF/web.xml index ba96425824..1b33aac885 100644 --- a/dspace-rest/src/main/webapp/WEB-INF/web.xml +++ b/dspace-rest/src/main/webapp/WEB-INF/web.xml @@ -77,11 +77,11 @@ - log4jConfiguration - ${dspace.dir}/config/log4j2.xml The location of the Log4J configuration + log4jConfiguration + ${dspace.dir}/config/log4j2.xml From 468725346fe1121f7c0567ae68c9e37bd997c59c Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 6 Nov 2018 14:27:46 -0500 Subject: [PATCH 174/193] Remove system property pointing to logging config. Instead just let framework do its default search, which should find the config. on the classpath. --- dspace/bin/dspace | 1 - dspace/bin/dspace.bat | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/dspace/bin/dspace b/dspace/bin/dspace index d7d5ae1a69..8f2990199e 100644 --- a/dspace/bin/dspace +++ b/dspace/bin/dspace @@ -44,5 +44,4 @@ fi # Now invoke Java java $JAVA_OPTS \ -classpath $FULLPATH \ - -Dlog4j.configurationFile=$DSPACEDIR/config/log4j2.xml \ org.dspace.app.launcher.ScriptLauncher "$@" diff --git a/dspace/bin/dspace.bat b/dspace/bin/dspace.bat index 8ad421ff32..66b6382f12 100644 --- a/dspace/bin/dspace.bat +++ b/dspace/bin/dspace.bat @@ -39,7 +39,7 @@ REM Otherwise, default Java to using 256MB of memory if "%JAVA_OPTS%"=="" set "JAVA_OPTS=-Xmx256m -Dfile.encoding=UTF-8" REM Execute Java -java %JAVA_OPTS% -classpath "%DSPACE_CLASSPATH%" -Dlog4j.configurationFile=%DSPACEDIR%/config/log4j2.xml org.dspace.app.launcher.ScriptLauncher %* +java %JAVA_OPTS% -classpath "%DSPACE_CLASSPATH%" org.dspace.app.launcher.ScriptLauncher %* REM Clean up DSPACE_CLASSPATH variable set DSPACE_CLASSPATH= From 18868370de02a2b31f203d8777f011ba6458fd4a Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 6 Nov 2018 14:30:20 -0500 Subject: [PATCH 175/193] [DS-3135] Remove commented-out attempt by logged code to tell logging framework its configuration path. --- .../src/main/java/org/purl/sword/client/ClientFactory.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java index 83d7ed0c11..9687e66663 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java @@ -7,8 +7,6 @@ */ package org.purl.sword.client; -// Replace with log4j 2: import org.apache.logging.log4j.PropertyConfigurator; - /** * Entry point for the SWORD Demonstration Client. This will parse the list of * command line options and load either a Command Line client or a GUI client. @@ -24,8 +22,6 @@ public class ClientFactory { // configure the logger from the property file. The GUI client will // reload these properties if it is set to capture the output and // display it in a panel. - // Replace with log4j 2: PropertyConfigurator.configure(this.getClass() - // .getClassLoader().getResource(ClientConstants.LOGGING_PROPERTY_FILE)); } /** @@ -35,7 +31,7 @@ public class ClientFactory { * @return A list of the options for this program. */ public static String usage() { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); buffer.append("swordclient: version "); buffer.append(ClientConstants.CLIENT_VERSION); buffer.append("\n"); From 9e1c16990face34507a86ff394133c282b27f82b Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Wed, 7 Nov 2018 14:57:15 -0500 Subject: [PATCH 176/193] [DS-3135] Remove leftover comment (and surrounding empty niladic constructor). --- .../main/java/org/purl/sword/client/ClientFactory.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java index 9687e66663..00bd9c17a5 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java @@ -14,16 +14,6 @@ package org.purl.sword.client; * @author Neil Taylor */ public class ClientFactory { - - /** - * Create a new instance. - */ - public ClientFactory() { - // configure the logger from the property file. The GUI client will - // reload these properties if it is set to capture the output and - // display it in a panel. - } - /** * Generate a string that specifies the command line options for this * program. From e53af97a31a647e800afec8d1e714f4c439bff80 Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Fri, 9 Nov 2018 16:39:17 +0100 Subject: [PATCH 177/193] fixes checkstyle issue --- .../java/org/dspace/app/opensearch/OpenSearchControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java index 12e576f94f..9208fe2122 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -14,7 +14,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. 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; From 7d5e12a7932d43317bc3a3ef727159ea47097a4f Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Tue, 13 Nov 2018 18:40:28 -0600 Subject: [PATCH 178/193] Added QueryString null handling. --- .../org/dspace/app/rest/RestResourceController.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index 0685705efd..6541cc7235 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -679,10 +679,15 @@ public class RestResourceController implements InitializingBean { Page pageResult = (Page) linkMethod .invoke(linkRepository, request, uuid, page, projection); - //TODO we need to strip any existing paging information from the query string - //Even if the paging info is not removed, the params don't get duplicated. - Link link = linkTo(this.getClass(), apiCategory, model).slash(uuid) - .slash(subpath + '?' + request.getQueryString()).withSelfRel(); + Link link = null; + String querystring = request.getQueryString(); + if (querystring != null) { + link = linkTo(this.getClass(), apiCategory, model).slash(uuid) + .slash(subpath + '?' + querystring).withSelfRel(); + } else { + link = linkTo(this.getClass(), apiCategory, model).slash(uuid).withSelfRel(); + } + Page halResources = pageResult.map(linkRepository::wrapResource); halResources.forEach(linkService::addLinks); From f3245e7c88f5515ed08cd39c1893d1264b2bc32f Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Thu, 15 Nov 2018 16:28:14 +0000 Subject: [PATCH 179/193] DS-4078: Bitstreams should keep their formats when being versioned. --- .../src/main/java/org/dspace/content/BitstreamServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java index bef2012202..bc076443ed 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java @@ -103,6 +103,8 @@ public class BitstreamServiceImpl extends DSpaceObjectServiceImpl imp clonedBitstream.setSizeBytes(bitstream.getSizeBytes()); clonedBitstream.setChecksum(bitstream.getChecksum()); clonedBitstream.setChecksumAlgorithm(bitstream.getChecksumAlgorithm()); + clonedBitstream.setFormat(bitstream.getBitstreamFormat()); + try { //Update our bitstream but turn off the authorization system since permissions //haven't been set at this point in time. From 5114f21da8ccd50577a6e0fb62ddb6861cef3c75 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 20 Nov 2018 18:58:41 -0500 Subject: [PATCH 180/193] [DS-4077] Remove old, failing WordFilter; use PoiWordFilter instead. --- .../dspace/app/mediafilter/WordFilter.java | 93 ------------------- dspace/config/dspace.cfg | 4 +- 2 files changed, 1 insertion(+), 96 deletions(-) delete mode 100644 dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java deleted file mode 100644 index d8fa8cc768..0000000000 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.app.mediafilter; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.apache.logging.log4j.Logger; -import org.dspace.content.Item; -import org.textmining.extraction.TextExtractor; -import org.textmining.extraction.word.WordTextExtractorFactory; - -/* - * - * to do: helpful error messages - can't find mediafilter.cfg - can't - * instantiate filter - bitstream format doesn't exist. - * - */ -public class WordFilter extends MediaFilter { - - private static Logger log = org.apache.logging.log4j.LogManager.getLogger(WordFilter.class); - - @Override - public String getFilteredName(String oldFilename) { - return oldFilename + ".txt"; - } - - /** - * @return String bundle name - */ - @Override - public String getBundleName() { - return "TEXT"; - } - - /** - * @return String bitstreamformat - */ - @Override - public String getFormatString() { - return "Text"; - } - - /** - * @return String description - */ - @Override - public String getDescription() { - return "Extracted text"; - } - - /** - * @param currentItem item - * @param source source input stream - * @param verbose verbose mode - * @return InputStream the resulting input stream - * @throws Exception if error - */ - @Override - public InputStream getDestinationStream(Item currentItem, InputStream source, boolean verbose) - throws Exception { - // get input stream from bitstream - // pass to filter, get string back - try { - WordTextExtractorFactory factory = new WordTextExtractorFactory(); - TextExtractor e = factory.textExtractor(source); - String extractedText = e.getText(); - - // if verbose flag is set, print out extracted text - // to STDOUT - if (verbose) { - System.out.println(extractedText); - } - - // generate an input stream with the extracted text - byte[] textBytes = extractedText.getBytes(); - ByteArrayInputStream bais = new ByteArrayInputStream(textBytes); - - return bais; // will this work? or will the byte array be out of scope? - } catch (IOException ioe) { - System.out.println("Invalid Word Format"); - log.error("Error detected - Word File format not recognized: " - + ioe.getMessage(), ioe); - throw ioe; - } - } -} diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index ea764ea95a..4ce7bf00d4 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -369,8 +369,7 @@ filter.plugins = PDFBox JPEG Thumbnail #Assign 'human-understandable' names to each filter plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PDFFilter = PDF Text Extractor plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.HTMLFilter = HTML Text Extractor -plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.WordFilter = Word Text Extractor -#plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PoiWordFilter = Word Text Extractor +plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PoiWordFilter = Word Text Extractor plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.ExcelFilter = Excel Text Extractor plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PowerPointFilter = PowerPoint Text Extractor plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail @@ -382,7 +381,6 @@ plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilte #Configure each filter's input format(s) filter.org.dspace.app.mediafilter.PDFFilter.inputFormats = Adobe PDF filter.org.dspace.app.mediafilter.HTMLFilter.inputFormats = HTML, Text -filter.org.dspace.app.mediafilter.WordFilter.inputFormats = Microsoft Word filter.org.dspace.app.mediafilter.PoiWordFilter.inputFormats = Microsoft Word, Microsoft Word XML filter.org.dspace.app.mediafilter.PowerPointFilter.inputFormats = Microsoft Powerpoint, Microsoft Powerpoint XML filter.org.dspace.app.mediafilter.JPEGFilter.inputFormats = BMP, GIF, JPEG, image/png From aeee5971012fab4ec291033cfc96d7aab334e664 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 20 Nov 2018 19:55:02 -0500 Subject: [PATCH 181/193] [DS-4077] Remove traces of tm-extractors. --- LICENSES_THIRD_PARTY | 1 - dspace-api/pom.xml | 4 ---- pom.xml | 6 +----- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/LICENSES_THIRD_PARTY b/LICENSES_THIRD_PARTY index b23938748d..69aa0f74bd 100644 --- a/LICENSES_THIRD_PARTY +++ b/LICENSES_THIRD_PARTY @@ -366,7 +366,6 @@ https://wiki.duraspace.org/display/DSPACE/Code+Contribution+Guidelines * FindBugs-Annotations (com.google.code.findbugs:annotations:3.0.1u2 - http://findbugs.sourceforge.net/) * MaxMind GeoIP Legacy API (com.maxmind.geoip:geoip-api:1.3.0 - https://github.com/maxmind/geoip-api-java) * JHighlight (com.uwyn:jhighlight:1.0 - https://jhighlight.dev.java.net/) - * DSpace TM-Extractors Dependency (org.dspace.dependencies:dspace-tm-extractors:1.0.1 - http://projects.dspace.org/dspace-pom/dspace-tm-extractors) * A Hibernate O/RM Module (org.hibernate:hibernate-core:4.2.21.Final - http://hibernate.org) * A Hibernate O/RM Module (org.hibernate:hibernate-ehcache:4.2.21.Final - http://hibernate.org) * Hibernate Commons Annotations (org.hibernate.common:hibernate-commons-annotations:4.0.2.Final - http://hibernate.org) diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 5c698f7e89..16c6e4336b 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -343,10 +343,6 @@ org.dspace mets - - org.dspace.dependencies - dspace-tm-extractors - org.apache.jena apache-jena-libs diff --git a/pom.xml b/pom.xml index b2d1681d40..21bcef9015 100644 --- a/pom.xml +++ b/pom.xml @@ -1147,11 +1147,7 @@ mets 1.5.2 - - org.dspace.dependencies - dspace-tm-extractors - 1.0.1 - + commons-beanutils From 7613a204ed992ad867ecaad7e52bff0e904e0bf9 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Wed, 21 Nov 2018 11:10:42 -0500 Subject: [PATCH 182/193] [DS-3990] Trim parameter name, value; remove unused test code. --- .../java/org/dspace/curate/CurationCli.java | 4 +- .../java/org/dspace/curate/CuratorTest.java | 330 ------------------ 2 files changed, 2 insertions(+), 332 deletions(-) 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 036c75af15..d5577cf368 100644 --- a/dspace-api/src/main/java/org/dspace/curate/CurationCli.java +++ b/dspace-api/src/main/java/org/dspace/curate/CurationCli.java @@ -112,10 +112,10 @@ public class CurationCli { if (line.hasOption('p')) { // parameter for (String parameter : line.getOptionValues('p')) { String[] parts = parameter.split("=", 2); - String name = parts[0]; + String name = parts[0].trim(); String value; if (parts.length > 1) { - value = parts[1]; + value = parts[1].trim(); } else { value = "true"; } 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 7652caade0..5761ee7ec7 100644 --- a/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java +++ b/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java @@ -17,10 +17,6 @@ import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; import org.dspace.services.ConfigurationService; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; /** @@ -42,190 +38,6 @@ public class CuratorTest /** Value of a known task property, if any. */ static String taskProperty; - public CuratorTest() { - } - - @BeforeClass - public static void setUpClass() { - } - - @AfterClass - public static void tearDownClass() { - } - - @Before - public void setUp() { - } - - @After - public void tearDown() { - } - - /** - * Test of addParameter method, of class Curator. - */ -/* - @Test - public void testAddParameter() { - System.out.println("addParameter"); - String name = ""; - String value = ""; - Curator instance = new Curator(); - instance.addParameter(name, value); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of addParameters method, of class Curator. - */ -/* - @Test - public void testAddParameters() { - System.out.println("addParameters"); - Map parameters = null; - Curator instance = new Curator(); - instance.addParameters(parameters); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of getRunParameter method, of class Curator. - */ -/* - @Test - public void testGetRunParameter() { - System.out.println("getRunParameter"); - String name = ""; - Curator instance = new Curator(); - String expResult = ""; - String result = instance.getRunParameter(name); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of addTask method, of class Curator. - */ -/* - @Test - public void testAddTask() { - System.out.println("addTask"); - String taskName = ""; - Curator instance = new Curator(); - Curator expResult = null; - Curator result = instance.addTask(taskName); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of hasTask method, of class Curator. - */ -/* - @Test - public void testHasTask() { - System.out.println("hasTask"); - String taskName = ""; - Curator instance = new Curator(); - boolean expResult = false; - boolean result = instance.hasTask(taskName); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of removeTask method, of class Curator. - */ -/* - @Test - public void testRemoveTask() { - System.out.println("removeTask"); - String taskName = ""; - Curator instance = new Curator(); - Curator expResult = null; - Curator result = instance.removeTask(taskName); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of setInvoked method, of class Curator. - */ -/* - @Test - public void testSetInvoked() { - System.out.println("setInvoked"); - Curator.Invoked mode = null; - Curator instance = new Curator(); - Curator expResult = null; - Curator result = instance.setInvoked(mode); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of setReporter method, of class Curator. - */ -/* - @Test - public void testSetReporter() { - System.out.println("setReporter"); - String reporter = ""; - Curator instance = new Curator(); - Curator expResult = null; - Curator result = instance.setReporter(reporter); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of setTransactionScope method, of class Curator. - */ -/* - @Test - public void testSetTransactionScope() { - System.out.println("setTransactionScope"); - Curator.TxScope scope = null; - Curator instance = new Curator(); - Curator expResult = null; - Curator result = instance.setTransactionScope(scope); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of curate method, of class Curator. - */ -/* - @Test - public void testCurate_Context_String() throws Exception { - System.out.println("curate"); - String id = ""; - Curator instance = new Curator(); - instance.curate(context, id); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - /** * Test of curate method, of class Curator. * Currently this just tests task properties and run parameters. @@ -268,146 +80,4 @@ public class CuratorTest assertEquals("Wrong run parameter", RUN_PARAMETER_VALUE, runParameter); assertEquals("Wrong task property", TASK_PROPERTY_VALUE, taskProperty); } - - /** - * Test of curate method, of class Curator. - */ -/* - @Test - public void testCurate_Context_DSpaceObject() throws Exception { - System.out.println("curate"); - DSpaceObject dso = null; - Curator instance = new Curator(); - instance.curate(context, dso); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of queue method, of class Curator. - */ -/* - @Test - public void testQueue() throws Exception { - System.out.println("queue"); - Context c = null; - String id = ""; - String queueId = ""; - Curator instance = new Curator(); - instance.queue(c, id, queueId); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of clear method, of class Curator. - */ -/* - @Test - public void testClear() { - System.out.println("clear"); - Curator instance = new Curator(); - instance.clear(); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of report method, of class Curator. - */ -/* - @Test - public void testReport() { - System.out.println("report"); - String message = ""; - Curator instance = new Curator(); - instance.report(message); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of getStatus method, of class Curator. - */ -/* - @Test - public void testGetStatus() { - System.out.println("getStatus"); - String taskName = ""; - Curator instance = new Curator(); - int expResult = 0; - int result = instance.getStatus(taskName); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of getResult method, of class Curator. - */ -/* - @Test - public void testGetResult() { - System.out.println("getResult"); - String taskName = ""; - Curator instance = new Curator(); - String expResult = ""; - String result = instance.getResult(taskName); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of setResult method, of class Curator. - */ -/* - @Test - public void testSetResult() { - System.out.println("setResult"); - String taskName = ""; - String result_2 = ""; - Curator instance = new Curator(); - instance.setResult(taskName, result_2); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of curationContext method, of class Curator. - */ -/* - @Test - public void testCurationContext() throws Exception { - System.out.println("curationContext"); - Context expResult = null; - Context result = Curator.curationContext(); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ - - /** - * Test of isContainer method, of class Curator. - */ -/* - @Test - public void testIsContainer() { - System.out.println("isContainer"); - DSpaceObject dso = null; - boolean expResult = false; - boolean result = Curator.isContainer(dso); - assertEquals(expResult, result); - // TODO review the generated test code and remove the default call to fail. - fail("The test case is a prototype."); - } -*/ } From 8ebb6a1a41adbe524a6a0e6e53c4a01facd6e63f Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Wed, 21 Nov 2018 18:58:09 -0600 Subject: [PATCH 183/193] Added handling of empty querystring. Added startsWithandPage test. --- .../app/rest/RestResourceController.java | 2 +- .../app/rest/BrowsesResourceControllerIT.java | 259 +++++++++++++++++- 2 files changed, 259 insertions(+), 2 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java index 6541cc7235..808a7fdc30 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -681,7 +681,7 @@ public class RestResourceController implements InitializingBean { Link link = null; String querystring = request.getQueryString(); - if (querystring != null) { + if (querystring != null && querystring.length() > 0) { link = linkTo(this.getClass(), apiCategory, model).slash(uuid) .slash(subpath + '?' + querystring).withSelfRel(); } else { diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java index a64c56b901..90c790eaed 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java @@ -501,7 +501,7 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe } @Test - public void testBrowseByStartsWith() throws Exception { + public void testBrowseByEntriesStartsWith() throws Exception { context.turnOffAuthorisationSystem(); //** GIVEN ** @@ -638,6 +638,72 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe //Verify that the startsWith paramater is included in the links .andExpect(jsonPath("$._links.self.href", containsString("?startsWith=C"))); + }; + + @Test + public void testBrowseByItemsStartsWith() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. 7 public items that are readable by Anonymous + Item item1 = ItemBuilder.createItem(context, col1) + .withTitle("Alan Turing") + .withAuthor("Turing, Alan Mathison") + .withIssueDate("1912-06-23") + .withSubject("Computing") + .build(); + + Item item2 = ItemBuilder.createItem(context, col1) + .withTitle("Blade Runner") + .withAuthor("Scott, Ridley") + .withIssueDate("1982-06-25") + .withSubject("Science Fiction") + .build(); + + Item item3 = ItemBuilder.createItem(context, col1) + .withTitle("Python") + .withAuthor("Van Rossum, Guido") + .withIssueDate("1990") + .withSubject("Computing") + .build(); + + Item item4 = ItemBuilder.createItem(context, col2) + .withTitle("Java") + .withAuthor("Gosling, James") + .withIssueDate("1995-05-23") + .withSubject("Computing") + .build(); + + Item item5 = ItemBuilder.createItem(context, col2) + .withTitle("Zeta Reticuli") + .withAuthor("Universe") + .withIssueDate("2018-01-01") + .withSubject("Astronomy") + .build(); + + Item item6 = ItemBuilder.createItem(context, col2) + .withTitle("Moon") + .withAuthor("Universe") + .withIssueDate("2018-01-02") + .withSubject("Astronomy") + .build(); + + Item item7 = ItemBuilder.createItem(context, col2) + .withTitle("T-800") + .withAuthor("Cameron, James") + .withIssueDate("2029") + .withSubject("Science Fiction") + .build(); // ---- BROWSES BY ITEM ---- //** WHEN ** @@ -721,4 +787,195 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe "Python", "1990") ))); } + + @Test + public void testBrowseByStartsWithAndPage() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. 7 public items that are readable by Anonymous + Item item1 = ItemBuilder.createItem(context, col1) + .withTitle("Alan Turing") + .withAuthor("Turing, Alan Mathison") + .withIssueDate("1912-06-23") + .withSubject("Computing") + .build(); + + Item item2 = ItemBuilder.createItem(context, col1) + .withTitle("Blade Runner") + .withAuthor("Scott, Ridley") + .withIssueDate("1982-06-25") + .withSubject("Science Fiction") + .build(); + + Item item3 = ItemBuilder.createItem(context, col2) + .withTitle("Java") + .withAuthor("Gosling, James") + .withIssueDate("1995-05-23") + .withSubject("Computing") + .build(); + + Item item4 = ItemBuilder.createItem(context, col2) + .withTitle("Moon") + .withAuthor("Universe") + .withIssueDate("2018-01-02") + .withSubject("Astronomy") + .build(); + + Item item5 = ItemBuilder.createItem(context, col1) + .withTitle("Python") + .withAuthor("Van Rossum, Guido") + .withIssueDate("1990") + .withSubject("Computing") + .build(); + + Item item6 = ItemBuilder.createItem(context, col2) + .withTitle("T-800") + .withAuthor("Cameron, James") + .withIssueDate("2029") + .withSubject("Science Fiction") + .build(); + + Item item7 = ItemBuilder.createItem(context, col2) + .withTitle("Zeta Reticuli") + .withAuthor("Universe") + .withIssueDate("2018-01-01") + .withSubject("Astronomy") + .build(); + + // ---- BROWSES BY ITEM ---- + + //** WHEN ** + //An anonymous user browses the items in the Browse by date issued endpoint + //with startsWith set to 1990 and Page to 3 + getClient().perform(get("/api/discover/browses/dateissued/items?startsWith=1990") + .param("size", "2").param("page", "2")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect the totalElements to be the 7 items present in the repository + .andExpect(jsonPath("$.page.totalElements", is(7))) + //We expect to jump to page 1 of the index + .andExpect(jsonPath("$.page.number", is(2))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$._links.first.href", containsString("startsWith=1990"))) + + //Verify that the index jumps to the "Zeta Reticuli" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item7, + "Zeta Reticuli", "2018-01-01"), + ItemMatcher.matchItemWithTitleAndDateIssued(item4, + "Moon", "2018-01-02") + ))); + } + + @Test + public void testBrowseByStartsWithAndPageGreaterThanTotalPages() throws Exception { + // This test an scenario where a nonexisting page is requested (The page number is greater than + // the total number of pages ) + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. 7 public items that are readable by Anonymous + Item item1 = ItemBuilder.createItem(context, col1) + .withTitle("Alan Turing") + .withAuthor("Turing, Alan Mathison") + .withIssueDate("1912-06-23") + .withSubject("Computing") + .build(); + + Item item2 = ItemBuilder.createItem(context, col1) + .withTitle("Blade Runner") + .withAuthor("Scott, Ridley") + .withIssueDate("1982-06-25") + .withSubject("Science Fiction") + .build(); + + Item item3 = ItemBuilder.createItem(context, col1) + .withTitle("Python") + .withAuthor("Van Rossum, Guido") + .withIssueDate("1990") + .withSubject("Computing") + .build(); + + Item item4 = ItemBuilder.createItem(context, col2) + .withTitle("Java") + .withAuthor("Gosling, James") + .withIssueDate("1995-05-23") + .withSubject("Computing") + .build(); + + Item item5 = ItemBuilder.createItem(context, col2) + .withTitle("Zeta Reticuli") + .withAuthor("Universe") + .withIssueDate("2018-01-01") + .withSubject("Astronomy") + .build(); + + Item item6 = ItemBuilder.createItem(context, col2) + .withTitle("Moon") + .withAuthor("Universe") + .withIssueDate("2018-01-02") + .withSubject("Astronomy") + .build(); + + Item item7 = ItemBuilder.createItem(context, col2) + .withTitle("T-800") + .withAuthor("Cameron, James") + .withIssueDate("2029") + .withSubject("Science Fiction") + .build(); + // ---- BROWSES BY ITEM ---- + + //** WHEN ** + //An anonymous user browses the items in the Browse by date issued endpoint + //with startsWith set to 1990 and Page to 300 + getClient().perform(get("/api/discover/browses/dateissued/items?startsWith=1990") + .param("size", "2").param("page", "300")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect the totalElements to be the 7 items present in the repository + .andExpect(jsonPath("$.page.totalElements", is(7))) + //We expect to jump to the LAST page of the index + .andExpect(jsonPath("$.page.number", is(3))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$._links.first.href", containsString("startsWith=1990"))) + + //Verify that the index jumps to the "Python" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item3, + "Python", "1990"), + ItemMatcher.matchItemWithTitleAndDateIssued(item4, + "Java", "1995-05-23") + ))); + } } \ No newline at end of file From 6600839fa42c3a646a6ed71f5f6f3240fb5723a4 Mon Sep 17 00:00:00 2001 From: Pablo Prieto Date: Wed, 21 Nov 2018 21:23:00 -0600 Subject: [PATCH 184/193] Fixed ITs --- .../app/rest/BrowsesResourceControllerIT.java | 105 +----------------- 1 file changed, 5 insertions(+), 100 deletions(-) diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java index 90c790eaed..beacc1b838 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java @@ -639,7 +639,7 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe .andExpect(jsonPath("$._links.self.href", containsString("?startsWith=C"))); }; - + @Test public void testBrowseByItemsStartsWith() throws Exception { context.turnOffAuthorisationSystem(); @@ -787,7 +787,7 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe "Python", "1990") ))); } - + @Test public void testBrowseByStartsWithAndPage() throws Exception { context.turnOffAuthorisationSystem(); @@ -852,7 +852,7 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe .withIssueDate("2018-01-01") .withSubject("Astronomy") .build(); - + // ---- BROWSES BY ITEM ---- //** WHEN ** @@ -877,105 +877,10 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe //Verify that the index jumps to the "Zeta Reticuli" item. .andExpect(jsonPath("$._embedded.items", contains(ItemMatcher.matchItemWithTitleAndDateIssued(item7, - "Zeta Reticuli", "2018-01-01"), + "Zeta Reticuli", "2018-01-01"), ItemMatcher.matchItemWithTitleAndDateIssued(item4, - "Moon", "2018-01-02") + "Moon", "2018-01-02") ))); } - @Test - public void testBrowseByStartsWithAndPageGreaterThanTotalPages() throws Exception { - // This test an scenario where a nonexisting page is requested (The page number is greater than - // the total number of pages ) - context.turnOffAuthorisationSystem(); - - //** GIVEN ** - //1. A community-collection structure with one parent community with sub-community and two collections. - parentCommunity = CommunityBuilder.createCommunity(context) - .withName("Parent Community") - .build(); - Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) - .withName("Sub Community") - .build(); - Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); - Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); - - //2. 7 public items that are readable by Anonymous - Item item1 = ItemBuilder.createItem(context, col1) - .withTitle("Alan Turing") - .withAuthor("Turing, Alan Mathison") - .withIssueDate("1912-06-23") - .withSubject("Computing") - .build(); - - Item item2 = ItemBuilder.createItem(context, col1) - .withTitle("Blade Runner") - .withAuthor("Scott, Ridley") - .withIssueDate("1982-06-25") - .withSubject("Science Fiction") - .build(); - - Item item3 = ItemBuilder.createItem(context, col1) - .withTitle("Python") - .withAuthor("Van Rossum, Guido") - .withIssueDate("1990") - .withSubject("Computing") - .build(); - - Item item4 = ItemBuilder.createItem(context, col2) - .withTitle("Java") - .withAuthor("Gosling, James") - .withIssueDate("1995-05-23") - .withSubject("Computing") - .build(); - - Item item5 = ItemBuilder.createItem(context, col2) - .withTitle("Zeta Reticuli") - .withAuthor("Universe") - .withIssueDate("2018-01-01") - .withSubject("Astronomy") - .build(); - - Item item6 = ItemBuilder.createItem(context, col2) - .withTitle("Moon") - .withAuthor("Universe") - .withIssueDate("2018-01-02") - .withSubject("Astronomy") - .build(); - - Item item7 = ItemBuilder.createItem(context, col2) - .withTitle("T-800") - .withAuthor("Cameron, James") - .withIssueDate("2029") - .withSubject("Science Fiction") - .build(); - // ---- BROWSES BY ITEM ---- - - //** WHEN ** - //An anonymous user browses the items in the Browse by date issued endpoint - //with startsWith set to 1990 and Page to 300 - getClient().perform(get("/api/discover/browses/dateissued/items?startsWith=1990") - .param("size", "2").param("page", "300")) - - //** THEN ** - //The status has to be 200 OK - .andExpect(status().isOk()) - //We expect the content type to be "application/hal+json;charset=UTF-8" - .andExpect(content().contentType(contentType)) - - //We expect the totalElements to be the 7 items present in the repository - .andExpect(jsonPath("$.page.totalElements", is(7))) - //We expect to jump to the LAST page of the index - .andExpect(jsonPath("$.page.number", is(3))) - .andExpect(jsonPath("$.page.size", is(2))) - .andExpect(jsonPath("$._links.first.href", containsString("startsWith=1990"))) - - //Verify that the index jumps to the "Python" item. - .andExpect(jsonPath("$._embedded.items", - contains(ItemMatcher.matchItemWithTitleAndDateIssued(item3, - "Python", "1990"), - ItemMatcher.matchItemWithTitleAndDateIssued(item4, - "Java", "1995-05-23") - ))); - } } \ No newline at end of file From 58c01c500c7efc5d3305eb72734537f509570d18 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Mon, 26 Nov 2018 16:30:46 -0600 Subject: [PATCH 185/193] Delete elasticsearch-statistics-mapping.json --- .../elasticsearch-statistics-mapping.json | 163 ------------------ 1 file changed, 163 deletions(-) delete mode 100644 dspace-api/src/main/resources/org/dspace/statistics/elasticsearch-statistics-mapping.json diff --git a/dspace-api/src/main/resources/org/dspace/statistics/elasticsearch-statistics-mapping.json b/dspace-api/src/main/resources/org/dspace/statistics/elasticsearch-statistics-mapping.json deleted file mode 100644 index e873b976ec..0000000000 --- a/dspace-api/src/main/resources/org/dspace/statistics/elasticsearch-statistics-mapping.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "stats": { - "properties": { - "bundleName": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "city": { - "type": "multi_field", - "fields": { - "city": { - "type": "string" - }, - "untouched": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs", - "include_in_all": false - } - } - }, - "continent": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "country": { - "type": "multi_field", - "fields": { - "country": { - "type": "string" - }, - "untouched": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs", - "include_in_all": false - } - } - }, - "countryCode": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "dns": { - "type": "multi_field", - "fields": { - "dns": { - "type": "string" - }, - "untouched": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs", - "include_in_all": false - } - } - }, - "epersonid": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "geo": { - "type": "geo_point" - }, - "id": { - "type": "integer" - }, - "ip": { - "type": "multi_field", - "fields": { - "ip": { - "type": "string" - }, - "untouched": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs", - "include_in_all": false - } - } - }, - "isBot": { - "type": "boolean" - }, - "latitude": { - "type": "double" - }, - "longitude": { - "type": "double" - }, - "message": { - "type": "string" - }, - "owningColl": { - "type": "integer" - }, - "owningComm": { - "type": "integer" - }, - "owningItem": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "postDate": { - "type": "date", - "format": "dateOptionalTime" - }, - "time": { - "type": "date", - "format": "dateOptionalTime" - }, - "type": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "typeIndex": { - "type": "long" - }, - "user": { - "type": "string" - }, - "userAgent": { - "type": "string" - } - } - } -} \ No newline at end of file From 733ef18184047172baf63f1e3df3a760d1b014c5 Mon Sep 17 00:00:00 2001 From: Santiago Tettamanti Date: Tue, 25 Sep 2018 10:35:41 -0300 Subject: [PATCH 186/193] DS-4019 Added a check for null when the group of a policy is obtained in getMostRecentModificationDate() and willChangeStatus() methods from XOAI.java class --- dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java index 1697b8d6d8..b53a92990a 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java @@ -326,7 +326,7 @@ public class XOAI { List dates = new LinkedList(); List policies = authorizeService.getPoliciesActionFilter(context, item, Constants.READ); for (ResourcePolicy policy : policies) { - if (policy.getGroup().getName().equals("Anonymous")) { + if ((policy.getGroup()!=null) && (policy.getGroup().getName().equals("Anonymous"))) { if (policy.getStartDate() != null) { dates.add(policy.getStartDate()); } @@ -450,8 +450,7 @@ public class XOAI { private boolean willChangeStatus(Item item) throws SQLException { List policies = authorizeService.getPoliciesActionFilter(context, item, Constants.READ); for (ResourcePolicy policy : policies) { - if (policy.getGroup().getName().equals("Anonymous")) { - + if ((policy.getGroup()!=null) && (policy.getGroup().getName().equals("Anonymous"))) { if (policy.getStartDate() != null && policy.getStartDate().after(new Date())) { return true; } From 6bbcc08e5998d57ead4ae53485c8cb5be8f1ce29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20Mas=C3=A1r?= Date: Mon, 3 Dec 2018 22:44:36 +0100 Subject: [PATCH 187/193] fix checkstyle broken by previous commit (sorry) --- dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java index b53a92990a..eae538b50b 100644 --- a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java +++ b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java @@ -326,7 +326,7 @@ public class XOAI { List dates = new LinkedList(); List policies = authorizeService.getPoliciesActionFilter(context, item, Constants.READ); for (ResourcePolicy policy : policies) { - if ((policy.getGroup()!=null) && (policy.getGroup().getName().equals("Anonymous"))) { + if ((policy.getGroup() != null) && (policy.getGroup().getName().equals("Anonymous"))) { if (policy.getStartDate() != null) { dates.add(policy.getStartDate()); } @@ -450,7 +450,7 @@ public class XOAI { private boolean willChangeStatus(Item item) throws SQLException { List policies = authorizeService.getPoliciesActionFilter(context, item, Constants.READ); for (ResourcePolicy policy : policies) { - if ((policy.getGroup()!=null) && (policy.getGroup().getName().equals("Anonymous"))) { + if ((policy.getGroup() != null) && (policy.getGroup().getName().equals("Anonymous"))) { if (policy.getStartDate() != null && policy.getStartDate().after(new Date())) { return true; } From 90a9df75efa25879b84e3b20940c823c985b5e4e Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 4 Dec 2018 16:11:44 -0500 Subject: [PATCH 188/193] [DS-4094] Use correct logging categories; fix incorrect argument in a couple of messages. --- .../org/dspace/app/rest/DiscoveryRestController.java | 10 +++++----- .../app/rest/repository/DiscoveryRestRepository.java | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index 6c29dc5283..4afde3df07 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Objects; import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.app.rest.link.HalLinkService; import org.dspace.app.rest.model.FacetConfigurationRest; @@ -27,7 +28,6 @@ import org.dspace.app.rest.model.hateoas.SearchResultsResource; import org.dspace.app.rest.model.hateoas.SearchSupportResource; import org.dspace.app.rest.parameter.SearchFilter; import org.dspace.app.rest.repository.DiscoveryRestRepository; -import org.dspace.app.rest.utils.ScopeResolver; import org.dspace.app.rest.utils.Utils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; @@ -47,7 +47,7 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/" + SearchResultsRest.CATEGORY) public class DiscoveryRestController implements InitializingBean { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ScopeResolver.class); + private static final Logger log = LogManager.getLogger(); @Autowired protected Utils utils; @@ -109,7 +109,7 @@ public class DiscoveryRestController implements InitializingBean { log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope) + ", configuration name: " + StringUtils.trimToEmpty(configurationName) + ", dsoType: " + StringUtils.trimToEmpty(dsoType) - + ", query: " + StringUtils.trimToEmpty(dsoType) + + ", query: " + StringUtils.trimToEmpty(query) + ", filters: " + Objects.toString(searchFilters)); } @@ -136,7 +136,7 @@ public class DiscoveryRestController implements InitializingBean { log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope) + ", configuration name: " + StringUtils.trimToEmpty(configurationName) + ", dsoType: " + StringUtils.trimToEmpty(dsoType) - + ", query: " + StringUtils.trimToEmpty(dsoType) + + ", query: " + StringUtils.trimToEmpty(query) + ", filters: " + Objects.toString(searchFilters) + ", page: " + Objects.toString(page)); } @@ -182,7 +182,7 @@ public class DiscoveryRestController implements InitializingBean { log.trace("Facetting on facet " + facetName + " with scope: " + StringUtils.trimToEmpty(dsoScope) + ", dsoType: " + StringUtils.trimToEmpty(dsoType) + ", prefix: " + StringUtils.trimToEmpty(prefix) - + ", query: " + StringUtils.trimToEmpty(dsoType) + + ", query: " + StringUtils.trimToEmpty(query) + ", filters: " + Objects.toString(searchFilters) + ", page: " + Objects.toString(page)); } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index ea2f70c469..ec73a24e2c 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -11,6 +11,7 @@ import java.util.List; import javax.ws.rs.BadRequestException; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.app.rest.converter.DiscoverConfigurationConverter; import org.dspace.app.rest.converter.DiscoverFacetConfigurationConverter; @@ -48,7 +49,7 @@ import org.springframework.stereotype.Component; @Component(SearchResultsRest.CATEGORY + "." + SearchResultsRest.NAME) public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ScopeResolver.class); + private static final Logger log = LogManager.getLogger(); @Autowired private DiscoveryConfigurationService searchConfigurationService; From 5ecc473311dfe0ec32e61e0a0c87ea9e2361e9f5 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Tue, 21 Aug 2018 18:02:03 +0200 Subject: [PATCH 189/193] DS-3914: Fix community defiliation This fixes in issue in the defiliate method of the community filiator. The child and parent relations should be managed using the provided methods of the Community. This changes the visibility of Community.removeSubCommunity() to public, but Community.removeParentCommunity() was public before already. --- .../main/java/org/dspace/administer/CommunityFiliator.java | 4 ++-- dspace-api/src/main/java/org/dspace/content/Community.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java b/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java index 261e623130..db657625b2 100644 --- a/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java +++ b/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java @@ -228,8 +228,8 @@ public class CommunityFiliator { // OK remove the mappings - but leave the community, which will become // top-level - child.getParentCommunities().remove(parent); - parent.getSubcommunities().remove(child); + child.removeParentCommunity(parent); + parent.removeSubCommunity(child); communityService.update(c, child); communityService.update(c, parent); diff --git a/dspace-api/src/main/java/org/dspace/content/Community.java b/dspace-api/src/main/java/org/dspace/content/Community.java index abd5f11852..e5092fae06 100644 --- a/dspace-api/src/main/java/org/dspace/content/Community.java +++ b/dspace-api/src/main/java/org/dspace/content/Community.java @@ -107,7 +107,7 @@ public class Community extends DSpaceObject implements DSpaceObjectLegacySupport setModified(); } - void removeSubCommunity(Community subCommunity) { + public void removeSubCommunity(Community subCommunity) { subCommunities.remove(subCommunity); setModified(); } From e02174bad8bd7d5443c3954403e18e732bdbfa3d Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Tue, 21 Aug 2018 18:07:47 +0200 Subject: [PATCH 190/193] CommunityFiliator: Some cleanup This removes the loops for checking if a community is contained in a list of communities. Community.equals() does the same check, so we simply can use contains(). --- .../dspace/administer/CommunityFiliator.java | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java b/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java index db657625b2..d82c8aacac 100644 --- a/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java +++ b/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java @@ -180,13 +180,9 @@ public class CommunityFiliator { // second test - circularity: parent's parents can't include proposed // child List parentDads = parent.getParentCommunities(); - - for (int i = 0; i < parentDads.size(); i++) { - if (parentDads.get(i).getID().equals(child.getID())) { - System.out - .println("Error, circular parentage - child is parent of parent"); - System.exit(1); - } + if (parentDads.contains(child)) { + System.out.println("Error, circular parentage - child is parent of parent"); + System.exit(1); } // everthing's OK @@ -210,19 +206,8 @@ public class CommunityFiliator { throws SQLException, AuthorizeException, IOException { // verify that child is indeed a child of parent List parentKids = parent.getSubcommunities(); - boolean isChild = false; - - for (int i = 0; i < parentKids.size(); i++) { - if (parentKids.get(i).getID().equals(child.getID())) { - isChild = true; - - break; - } - } - - if (!isChild) { - System.out - .println("Error, child community not a child of parent community"); + if (!parentKids.contains(child)) { + System.out.println("Error, child community not a child of parent community"); System.exit(1); } From 67046598c1578c52600f7ef27c58d9dac3be9fae Mon Sep 17 00:00:00 2001 From: Oliver Goldschmidt Date: Thu, 13 Dec 2018 09:34:40 +0100 Subject: [PATCH 191/193] fixes typo --- dspace/config/dspace.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index c86383dea0..6cebe39bdc 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -1368,7 +1368,7 @@ websvc.opensearch.samplequery = photosynthesis # tags used to describe search service websvc.opensearch.tags = IR DSpace # result formats offered - use 1 or more comma-separated from: html,atom,rss -# NB: html is not supported in DSpace7, use normal search m,odule instead +# NB: html is not supported in DSpace7, use normal search module instead websvc.opensearch.formats = atom,rss From c3f2fa7f47f4bc7cfcd57d2085727f61520cf35c Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Tue, 11 Dec 2018 15:32:11 +0000 Subject: [PATCH 192/193] Increase memory available to Unit/Integration Tests --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 21bcef9015..585cccda45 100644 --- a/pom.xml +++ b/pom.xml @@ -424,7 +424,7 @@ @@ -435,7 +435,7 @@ - -Xmx512m + -Xmx1024m From 33268e8980f5543cb08f52d2a785f975dd22ce48 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 14 Dec 2018 16:09:19 +0000 Subject: [PATCH 193/193] Remove obsolete XMLUI spring configs --- .../spring/xmlui/workflow-actions-xmlui.xml | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 dspace/config/spring/xmlui/workflow-actions-xmlui.xml diff --git a/dspace/config/spring/xmlui/workflow-actions-xmlui.xml b/dspace/config/spring/xmlui/workflow-actions-xmlui.xml deleted file mode 100644 index d4e0e1ca6c..0000000000 --- a/dspace/config/spring/xmlui/workflow-actions-xmlui.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - -