From 8c2692ea7dd2383aff32db2dec6827b0eb35e18c Mon Sep 17 00:00:00 2001 From: Graham Triggs Date: Wed, 24 Oct 2007 11:47:31 +0000 Subject: [PATCH] Add the capability to define in which order the index should be listed by default (ascending or descending) Also, removed two uses of 'magic' strings - replaced with static values from SortOption git-svn-id: http://scm.dspace.org/svn/repo/trunk@2259 9c30dcfa-912a-0410-8fc2-9e0234be79fd --- .../java/org/dspace/browse/BrowseIndex.java | 25 ++++++- .../java/org/dspace/browse/BrowserScope.java | 69 ++++++++++++++++--- .../java/org/dspace/browse/SortOption.java | 51 ++++++++++++-- .../components/RecentSubmissionsManager.java | 2 +- .../webui/servlet/AbstractBrowserServlet.java | 6 -- .../webui/servlet/admin/ItemMapServlet.java | 26 +++---- dspace/config/dspace.cfg | 22 +++--- 7 files changed, 152 insertions(+), 49 deletions(-) diff --git a/dspace-api/src/main/java/org/dspace/browse/BrowseIndex.java b/dspace-api/src/main/java/org/dspace/browse/BrowseIndex.java index 316b303191..23e334d3e3 100644 --- a/dspace-api/src/main/java/org/dspace/browse/BrowseIndex.java +++ b/dspace-api/src/main/java/org/dspace/browse/BrowseIndex.java @@ -83,6 +83,9 @@ public class BrowseIndex /** a three part array of the metadata bits (e.g. dc.contributor.author) */ private String[] mdBits; + /** default order (asc / desc) for this index */ + private String defaultOrder; + /** additional 'internal' tables that are always defined */ private static BrowseIndex itemIndex = new BrowseIndex("bi_item"); private static BrowseIndex withdrawnIndex = new BrowseIndex("bi_withdrawn"); @@ -135,9 +138,10 @@ public class BrowseIndex throws BrowseException { boolean valid = true; + this.defaultOrder = SortOption.ASCENDING; this.number = number; - String rx = "(\\w+):(\\w+):([\\w\\.\\*]+):?(\\w*)"; + String rx = "(\\w+):(\\w+):([\\w\\.\\*]+):?(\\w*):?(\\w*)"; Pattern pattern = Pattern.compile(rx); Matcher matcher = pattern.matcher(definition); @@ -156,7 +160,16 @@ public class BrowseIndex if (datatype == null || datatype.equals("")) valid = false; - + + // If an optional ordering configuration is supplied, + // set the defaultOrder appropriately (asc or desc) + if (matcher.groupCount() > 4) + { + String order = matcher.group(5); + if (SortOption.DESCENDING.equalsIgnoreCase(order)) + this.defaultOrder = SortOption.DESCENDING; + } + tableBaseName = makeTableBaseName(number); } else if (isItemIndex()) @@ -191,6 +204,14 @@ public class BrowseIndex } } + /** + * @return Default order for this index, null if not specified + */ + public String getDefaultOrder() + { + return defaultOrder; + } + /** * @return Returns the datatype. */ diff --git a/dspace-api/src/main/java/org/dspace/browse/BrowserScope.java b/dspace-api/src/main/java/org/dspace/browse/BrowserScope.java index 8d2f65bcb5..5414367e6a 100644 --- a/dspace-api/src/main/java/org/dspace/browse/BrowserScope.java +++ b/dspace-api/src/main/java/org/dspace/browse/BrowserScope.java @@ -39,6 +39,7 @@ import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; +import org.apache.log4j.Logger; /** * A class which represents the initial request to the browse system. @@ -50,6 +51,9 @@ import org.dspace.core.Context; */ public class BrowserScope { + /** the logger for this class */ + private static Logger log = Logger.getLogger(BrowserScope.class); + /** the DSpace context */ private Context context; @@ -57,7 +61,7 @@ public class BrowserScope private BrowseIndex browseIndex; /** the order in which to display results */ - private String order = "ASC"; + private String order; /** the field upon which to sort */ private int sortBy; @@ -325,17 +329,43 @@ public class BrowserScope */ public String getOrder() { - return order; - } + if (order != null) + return order; + + try + { + SortOption so = getSortOption(); + + if (so != null) + return so.getDefaultOrder(); + } + catch (BrowseException be) + { + // recoverable problem, just log the error and continue + log.debug("Unable to retrieve a sort option for this browse", be); + } + + return SortOption.ASCENDING; + } /** * @param order The order to set. */ public void setOrder(String order) { - if (order != null && !"".equals(order)) - this.order = order; - } + if (order == null) + { + this.order = null; + } + else if (SortOption.ASCENDING.equalsIgnoreCase(order)) + { + this.order = SortOption.ASCENDING; + } + else if (SortOption.DESCENDING.equalsIgnoreCase(order)) + { + this.order = SortOption.DESCENDING; + } + } /** * @return Returns the resultsPerPage. @@ -392,7 +422,7 @@ public class BrowserScope // Create a dummy sortOption for the metadata sort String dataType = browseIndex.getDataType(); String type = ("date".equals(dataType) ? "date" : "text"); - sortOption = new SortOption(0, browseIndex.getName(), browseIndex.getMetadata(), type); + sortOption = new SortOption(0, browseIndex.getName(), browseIndex.getMetadata(), type, browseIndex.getDefaultOrder()); } else { @@ -505,15 +535,34 @@ public class BrowserScope } /** - * @return true if ascending, false if not + * @return true if ascending, false if not - or not set */ public boolean isAscending() { - if ("ASC".equals(order)) + if (SortOption.ASCENDING.equalsIgnoreCase(order)) { return true; } - return false; + + if (SortOption.DESCENDING.equalsIgnoreCase(order)) + { + return false; + } + + try + { + SortOption so = getSortOption(); + + if (so != null && SortOption.DESCENDING.equalsIgnoreCase(so.getDefaultOrder())) + return false; + } + catch (BrowseException be) + { + // recoverable problem, just log the error and continue + log.debug("Unable to retrieve a sort option for this browse", be); + } + + return true; } /** diff --git a/dspace-api/src/main/java/org/dspace/browse/SortOption.java b/dspace-api/src/main/java/org/dspace/browse/SortOption.java index 1817d29068..52f1ff2ac5 100644 --- a/dspace-api/src/main/java/org/dspace/browse/SortOption.java +++ b/dspace-api/src/main/java/org/dspace/browse/SortOption.java @@ -55,7 +55,10 @@ import org.dspace.core.ConfigurationManager; */ public class SortOption { - /** the sort configuration number */ + public static final String ASCENDING = "ASC"; + public static final String DESCENDING = "DESC"; + + /** the sort configuration number */ private int number; /** the name of the sort */ @@ -70,6 +73,9 @@ public class SortOption /** the metadata broken down into bits for convenience */ private String[] mdBits; + /** default ordering for this sort, when not supplied by the user */ + private String defaultOrder; + /** the sort options available for this index */ private static Set sortOptionsSet = null; private static Map sortOptionsMap = null; @@ -90,10 +96,25 @@ public class SortOption this.type = type; this.metadata = md; this.number = number; - generateMdBits(); + this.defaultOrder = SortOption.ASCENDING; + generateMdBits(); } - /** + public SortOption(int number, String name, String md, String type, String defaultOrder) + throws BrowseException + { + this.name = name; + this.type = type; + this.metadata = md; + this.number = number; + if (SortOption.DESCENDING.equalsIgnoreCase(defaultOrder)) + this.defaultOrder = SortOption.DESCENDING; + else + this.defaultOrder = SortOption.ASCENDING; + generateMdBits(); + } + + /** * Construct a new SortOption object using the definition from the configuration * * @param number @@ -105,7 +126,7 @@ public class SortOption { this.number = number; - String rx = "(\\w+):([\\w\\.\\*]+):(\\w+)"; + String rx = "(\\w+):([\\w\\.\\*]+):(\\w+):?(\\w*)"; Pattern pattern = Pattern.compile(rx); Matcher matcher = pattern.matcher(definition); @@ -118,10 +139,28 @@ public class SortOption name = matcher.group(1); metadata = matcher.group(2); type = matcher.group(3); + if (matcher.groupCount() > 3) + defaultOrder = matcher.group(4); + + // If the default order is specified as descending, keep it + // Otherwise, set the default order to ascending + if (SortOption.DESCENDING.equalsIgnoreCase(defaultOrder)) + defaultOrder = SortOption.DESCENDING; + else + defaultOrder = SortOption.ASCENDING; + generateMdBits(); } - - /** + + /** + * @return Returns the default ordering for this sort option + */ + public String getDefaultOrder() + { + return defaultOrder; + } + + /** * @return Returns the metadata. */ public String getMetadata() diff --git a/dspace-jspui/src/main/java/org/dspace/app/webui/components/RecentSubmissionsManager.java b/dspace-jspui/src/main/java/org/dspace/app/webui/components/RecentSubmissionsManager.java index ac09bde53d..d330ce7d18 100644 --- a/dspace-jspui/src/main/java/org/dspace/app/webui/components/RecentSubmissionsManager.java +++ b/dspace-jspui/src/main/java/org/dspace/app/webui/components/RecentSubmissionsManager.java @@ -103,7 +103,7 @@ public class RecentSubmissionsManager // fill in the scope with the relevant gubbins bs.setBrowseIndex(bi); - bs.setOrder("DESC"); // FIXME: eek - plain text flag! Should be BrowserScope.ASC or something + bs.setOrder(SortOption.DESCENDING); bs.setResultsPerPage(Integer.parseInt(count)); bs.setBrowseContainer(dso); for (SortOption so : SortOption.getSortOptions()) diff --git a/dspace-jspui/src/main/java/org/dspace/app/webui/servlet/AbstractBrowserServlet.java b/dspace-jspui/src/main/java/org/dspace/app/webui/servlet/AbstractBrowserServlet.java index d37690e439..ddc740bfca 100644 --- a/dspace-jspui/src/main/java/org/dspace/app/webui/servlet/AbstractBrowserServlet.java +++ b/dspace-jspui/src/main/java/org/dspace/app/webui/servlet/AbstractBrowserServlet.java @@ -145,12 +145,6 @@ public abstract class AbstractBrowserServlet extends DSpaceServlet resultsperpage = 20; } - // if no order parameter, default to ascending - if (order == null || "".equals(order)) - { - order = "ASC"; - } - // if year and perhaps month have been selected, we translate these into "startsWith" // if startsWith has already been defined then it is overwritten if (year != null && !"".equals(year) && !"-1".equals(year)) diff --git a/dspace-jspui/src/main/java/org/dspace/app/webui/servlet/admin/ItemMapServlet.java b/dspace-jspui/src/main/java/org/dspace/app/webui/servlet/admin/ItemMapServlet.java index c5b6b52f01..ba87135472 100644 --- a/dspace-jspui/src/main/java/org/dspace/app/webui/servlet/admin/ItemMapServlet.java +++ b/dspace-jspui/src/main/java/org/dspace/app/webui/servlet/admin/ItemMapServlet.java @@ -39,27 +39,13 @@ */ package org.dspace.app.webui.servlet.admin; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.apache.log4j.Logger; import org.dspace.app.webui.servlet.DSpaceServlet; import org.dspace.app.webui.util.JSPManager; import org.dspace.app.webui.util.UIUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeManager; -import org.dspace.browse.BrowseEngine; -import org.dspace.browse.BrowseException; -import org.dspace.browse.BrowseIndex; -import org.dspace.browse.BrowseInfo; -import org.dspace.browse.BrowserScope; -import org.dspace.browse.IndexBrowse; +import org.dspace.browse.*; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.ItemIterator; @@ -67,6 +53,14 @@ import org.dspace.core.ConfigurationManager; import org.dspace.core.Constants; import org.dspace.core.Context; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; + /** * Servlet for editing and deleting (expunging) items * @@ -372,7 +366,7 @@ public class ItemMapServlet extends DSpaceServlet // set up the browse scope bs.setBrowseIndex(bi); - bs.setOrder("ASC"); + bs.setOrder(SortOption.ASCENDING); bs.setFilterValue(name); bs.setJumpToValue(null); bs.setResultsPerPage(10000); // an arbitrary number (large) for the time being diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index 87e214172c..6850fd4a9e 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -376,7 +376,7 @@ webui.licence_bundle.show = false # # webui.browse.index. = : metadata : \ # .[.|.*] : \ -# (date | title | text) : +# (date | title | text) : (asc | desc) # # This form represent a unique index of metadata values from the item. # @@ -389,6 +389,10 @@ webui.licence_bundle.show = false # : any other datatype will be treated the same as 'text', although # it will apply any custom ordering normalisation configured below # +# The final part of the configuration is optional, and specifies the default ordering +# for the index - whether it is ASCending (the default, and best for text indexes), or +# DESCending (useful for dates - ie. most recent submissions) +# # NOTE: the text to render the index will use the parameter to select # the message key from Messages.properties using a key of the form: # @@ -429,14 +433,16 @@ webui.browse.index.4 = subject:metadata:dc.subject.*:text # # webui.browse.sort-option. =