From 603b82a006e2ec53c1e2fa7984496e487d815708 Mon Sep 17 00:00:00 2001 From: Graham Triggs Date: Thu, 29 Nov 2007 11:58:05 +0000 Subject: [PATCH] Improved browse configuration (ability to hide sort options from the browse controls, can set left-hand navigation to asc and/or desc lists). Improves normalisation of titles. git-svn-id: http://scm.dspace.org/svn/repo/branches/dspace-1_5_x@2406 9c30dcfa-912a-0410-8fc2-9e0234be79fd --- .../java/org/dspace/browse/BrowseIndex.java | 35 +++++---- .../dspace/browse/BrowseOrderTitleMarc21.java | 8 +- .../java/org/dspace/browse/BrowserScope.java | 31 ++------ .../java/org/dspace/browse/IndexBrowse.java | 4 +- .../java/org/dspace/browse/SortOption.java | 76 +++++++------------ .../text/filter/InitialArticleWord.java | 2 +- .../text/filter/MARC21InitialArticleWord.java | 12 +-- .../text/filter/StripLeadingNonAlphaNum.java | 62 +++++++++++++++ .../webui/servlet/AbstractBrowserServlet.java | 7 +- dspace-jspui/src/main/webapp/browse/full.jsp | 11 ++- .../artifactbrowser/ConfigurableBrowse.java | 7 +- dspace/config/dspace.cfg | 15 ++-- 12 files changed, 156 insertions(+), 114 deletions(-) create mode 100644 dspace-api/src/main/java/org/dspace/text/filter/StripLeadingNonAlphaNum.java 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 d64b2a429c..07ce9e5b0b 100644 --- a/dspace-api/src/main/java/org/dspace/browse/BrowseIndex.java +++ b/dspace-api/src/main/java/org/dspace/browse/BrowseIndex.java @@ -184,7 +184,16 @@ public class BrowseIndex if (sortOption == null) valid = false; - + + // If an optional ordering configuration is supplied, + // set the defaultOrder appropriately (asc or desc) + if (matcher.groupCount() > 3) + { + String order = matcher.group(4); + if (SortOption.DESCENDING.equalsIgnoreCase(order)) + this.defaultOrder = SortOption.DESCENDING; + } + tableBaseName = getItemBrowseIndex().tableBaseName; } else @@ -629,23 +638,19 @@ public class BrowseIndex * @throws BrowseException */ public static String[] tables() - throws BrowseException + throws BrowseException { BrowseIndex[] bis = getBrowseIndices(); - ArrayList tables = new ArrayList(); + String[] returnTables = new String[bis.length + 1]; for (int i = 0; i < bis.length; i++) { - String tableName = bis[i].getTableName(); - tables.add(tableName); + returnTables[i] = bis[i].getTableName(); } - + // FIXME: this complies with the old BrowseTables method, but I'm // not really sure why it's here - tables.add("Communities2Item"); - - String[] returnTables = new String[tables.size()]; - returnTables = (String[]) tables.toArray((String[]) returnTables); - + returnTables[bis.length] = "Communities2Item"; + return returnTables; } @@ -668,17 +673,17 @@ public class BrowseIndex browseIndices.add(bi); idx++; } - + BrowseIndex[] bis = new BrowseIndex[browseIndices.size()]; bis = (BrowseIndex[]) browseIndices.toArray((BrowseIndex[]) bis); - + return bis; } - + /** * Get the browse index from configuration with the specified name. * The name is the first part of the browse configuration - * + * * @param name the name to retrieve * @return the specified browse index * @throws BrowseException diff --git a/dspace-api/src/main/java/org/dspace/browse/BrowseOrderTitleMarc21.java b/dspace-api/src/main/java/org/dspace/browse/BrowseOrderTitleMarc21.java index acdb463356..c3d6f9b850 100644 --- a/dspace-api/src/main/java/org/dspace/browse/BrowseOrderTitleMarc21.java +++ b/dspace-api/src/main/java/org/dspace/browse/BrowseOrderTitleMarc21.java @@ -40,10 +40,7 @@ package org.dspace.browse; -import org.dspace.text.filter.DecomposeDiactritics; -import org.dspace.text.filter.LowerCaseAndTrim; -import org.dspace.text.filter.MARC21InitialArticleWord; -import org.dspace.text.filter.TextFilter; +import org.dspace.text.filter.*; /** * MARC 21 title ordering delegate implementation @@ -54,7 +51,8 @@ public class BrowseOrderTitleMarc21 extends AbstractTextFilterBOD { { filters = new TextFilter[] { new MARC21InitialArticleWord(), - new DecomposeDiactritics(), + new DecomposeDiactritics(), + new StripLeadingNonAlphaNum(), new LowerCaseAndTrim() }; } } 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 f881308a23..4072aea9a6 100644 --- a/dspace-api/src/main/java/org/dspace/browse/BrowserScope.java +++ b/dspace-api/src/main/java/org/dspace/browse/BrowserScope.java @@ -335,18 +335,9 @@ public class BrowserScope 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); - } + BrowseIndex bi = getBrowseIndex(); + if (bi != null) + return bi.getDefaultOrder(); return SortOption.ASCENDING; } @@ -425,7 +416,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, browseIndex.getDefaultOrder()); + sortOption = new SortOption(0, browseIndex.getName(), browseIndex.getMetadata(), type); } else { @@ -570,18 +561,10 @@ public class BrowserScope return false; } - try - { - SortOption so = getSortOption(); + BrowseIndex bi = getBrowseIndex(); - 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); - } + if (bi != null && SortOption.DESCENDING.equalsIgnoreCase(bi.getDefaultOrder())) + return false; return true; } diff --git a/dspace-api/src/main/java/org/dspace/browse/IndexBrowse.java b/dspace-api/src/main/java/org/dspace/browse/IndexBrowse.java index 066fce42f3..3fd92160ae 100644 --- a/dspace-api/src/main/java/org/dspace/browse/IndexBrowse.java +++ b/dspace-api/src/main/java/org/dspace/browse/IndexBrowse.java @@ -561,7 +561,8 @@ public class IndexBrowse public static void main(String[] argv) throws SQLException, BrowseException, ParseException { - IndexBrowse indexer = new IndexBrowse(); + Context context = new Context(); + IndexBrowse indexer = new IndexBrowse(context); // create an options object and populate it CommandLineParser parser = new PosixParser(); @@ -655,6 +656,7 @@ public class IndexBrowse } indexer.usage(options); + context.complete(); } /** 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 52f1ff2ac5..e5829d9a99 100644 --- a/dspace-api/src/main/java/org/dspace/browse/SortOption.java +++ b/dspace-api/src/main/java/org/dspace/browse/SortOption.java @@ -36,7 +36,6 @@ package org.dspace.browse; import java.io.IOException; -import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -73,8 +72,8 @@ 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; + /** should the sort option be visible for user selection */ + private boolean visible; /** the sort options available for this index */ private static Set sortOptionsSet = null; @@ -96,24 +95,10 @@ public class SortOption this.type = type; this.metadata = md; this.number = number; - this.defaultOrder = SortOption.ASCENDING; + this.visible = true; 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 * @@ -139,27 +124,17 @@ 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; + // If the option is configured to be hidden, then set the visible flag to false + // otherwise, flag it as visible (true) + if (matcher.groupCount() > 3 && "hide".equalsIgnoreCase(matcher.group(4))) + visible = false; else - defaultOrder = SortOption.ASCENDING; + visible = true; generateMdBits(); } - /** - * @return Returns the default ordering for this sort option - */ - public String getDefaultOrder() - { - return defaultOrder; - } - /** * @return Returns the metadata. */ @@ -223,8 +198,17 @@ public class SortOption { this.number = number; } - - /** + + /** + * Should this sort option be made visible in the UI + * @return true if visible, false otherwise + */ + public boolean isVisible() + { + return visible; + } + + /** * @return a 3 element array of the metadata bits */ public String[] getMdBits() @@ -346,22 +330,14 @@ public class SortOption SortOption.sortOptionsSet = new HashSet(); synchronized (SortOption.sortOptionsSet) { - Enumeration en = ConfigurationManager.propertyNames(); - - String rx = "webui\\.browse\\.sort-option\\.(\\d+)"; - Pattern pattern = Pattern.compile(rx); - - while (en.hasMoreElements()) + int idx = 1; + String option; + + while ( ((option = ConfigurationManager.getProperty("webui.browse.sort-option." + idx))) != null) { - String property = (String) en.nextElement(); - Matcher matcher = pattern.matcher(property); - if (matcher.matches()) - { - int number = Integer.parseInt(matcher.group(1)); - String option = ConfigurationManager.getProperty(property); - SortOption so = new SortOption(number, option); - SortOption.sortOptionsSet.add(so); - } + SortOption so = new SortOption(idx, option); + SortOption.sortOptionsSet.add(so); + idx++; } } diff --git a/dspace-api/src/main/java/org/dspace/text/filter/InitialArticleWord.java b/dspace-api/src/main/java/org/dspace/text/filter/InitialArticleWord.java index 86fcf1f63f..b1d735f680 100644 --- a/dspace-api/src/main/java/org/dspace/text/filter/InitialArticleWord.java +++ b/dspace-api/src/main/java/org/dspace/text/filter/InitialArticleWord.java @@ -83,7 +83,7 @@ public abstract class InitialArticleWord implements TextFilter while (initialEnd < 0 && curPos < str.length()) { // Have we found a significant character - if (Character.isLetterOrDigit(str.charAt(curPos)) || str.charAt(curPos) == '\'') + if (Character.isLetterOrDigit(str.charAt(curPos))) { // Mark this as the cut point for the initial word initialStart = curPos; 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 3fa68701cd..2ba93f9975 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 @@ -133,7 +133,7 @@ public class MARC21InitialArticleWord extends InitialArticleWord { "die", Language.AFRIKAANS, Language.GERMAN, Language.YIDDISH }, { "dos", Language.YIDDISH }, { "e", Language.NORWEGIAN }, - { "'e", Language.FRISIAN }, + { "e", Language.FRISIAN }, // should be 'e - leading apostrophes are ignored { "een", Language.DUTCH }, { "eene", Language.DUTCH }, { "egy", Language.HUNGARIAN }, @@ -205,21 +205,21 @@ public class MARC21InitialArticleWord extends InitialArticleWord { "mga", Language.TAGALOG }, { "m\u0303ga", Language.TAGALOG }, { "mia", Language.GREEK }, - { "'n", Language.AFRIKAANS, Language.DUTCH, Language.FRISIAN }, + { "n", Language.AFRIKAANS, Language.DUTCH, Language.FRISIAN }, // should be 'n - leading apostrophes are ignored { "na", Language.HAWAIIAN, Language.IRISH, Language.SCOTTISH_GAELIC }, { "na h-", Language.IRISH, Language.SCOTTISH_GAELIC }, { "nje", Language.ALBANIAN }, { "ny", Language.MALAGASY }, - { "'o", Language.NEAPOLITAN_ITALIAN }, + { "o", Language.NEAPOLITAN_ITALIAN }, // should be 'o - leading apostrophes are ignored { "o", Language.GALICIAN, Language.HAWAIIAN, Language.PORTUGUESE, Language.ROMANIAN }, { "os", Language.PORTUGUESE }, - { "'r", Language.ICELANDIC }, - { "'s", Language.GERMAN }, + { "r", Language.ICELANDIC }, // should be 'r - leading apostrophes are ignored + { "s", Language.GERMAN }, // should be 's - leading apostrophes are ignored { "sa", Language.TAGALOG }, { "sa mga", Language.TAGALOG }, { "si", Language.TAGALOG }, { "sin\u00e1", Language.TAGALOG }, - { "'t", Language.DUTCH, Language.FRISIAN }, + { "t", Language.DUTCH, Language.FRISIAN }, // should be 't - leading apostrophes are ignored { "ta", Language.CLASSICAL_GREEK, Language.GREEK }, { "tais", Language.CLASSICAL_GREEK }, { "tas", Language.CLASSICAL_GREEK }, diff --git a/dspace-api/src/main/java/org/dspace/text/filter/StripLeadingNonAlphaNum.java b/dspace-api/src/main/java/org/dspace/text/filter/StripLeadingNonAlphaNum.java new file mode 100644 index 0000000000..6119330464 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/text/filter/StripLeadingNonAlphaNum.java @@ -0,0 +1,62 @@ +/* + * StripLeadingNonAlphaNum.java + * + * Version: $Revision: 1.0 $ + * + * Date: $Date: 2007/03/02 11:22:13 $ + * + * Copyright (c) 2002-2005, Hewlett-Packard Company and Massachusetts + * Institute of Technology. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Hewlett-Packard Company nor the name of the + * Massachusetts Institute of Technology nor the names of their + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +package org.dspace.text.filter; + +public class StripLeadingNonAlphaNum implements TextFilter +{ + public String filter(String str) + { + int i = 0; + + while (i < str.length() && !Character.isLetterOrDigit(str.charAt(i))) + i++; + + if (i > 0) + return str.substring(i); + + return str; + } + + public String filter(String str, String lang) + { + return filter(str); + } +} 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 ddc740bfca..94b4f06216 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 @@ -138,7 +138,12 @@ public abstract class AbstractBrowserServlet extends DSpaceServlet } } } - + + if (order == null && bi != null) + { + order = bi.getDefaultOrder(); + } + // if no resultsperpage set, default to 20 if (resultsperpage == -1) { diff --git a/dspace-jspui/src/main/webapp/browse/full.jsp b/dspace-jspui/src/main/webapp/browse/full.jsp index bc051feeb9..c26ae382d7 100644 --- a/dspace-jspui/src/main/webapp/browse/full.jsp +++ b/dspace-jspui/src/main/webapp/browse/full.jsp @@ -359,10 +359,13 @@ <% for (SortOption sortBy : sortOptions) { - String selected = (sortBy.getName().equals(sortedBy) ? "selected=\"selected\"" : ""); - String mKey = "browse.sort-by." + sortBy.getName(); - %> <% - } + if (sortBy.isVisible()) + { + String selected = (sortBy.getName().equals(sortedBy) ? "selected=\"selected\"" : ""); + String mKey = "browse.sort-by." + sortBy.getName(); + %> <% + } + } %> <% diff --git a/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/artifactbrowser/ConfigurableBrowse.java b/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/artifactbrowser/ConfigurableBrowse.java index 3aafb3a13a..b23813f31b 100644 --- a/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/artifactbrowser/ConfigurableBrowse.java +++ b/dspace-xmlui/dspace-xmlui-api/src/main/java/org/dspace/app/xmlui/aspect/artifactbrowser/ConfigurableBrowse.java @@ -465,8 +465,11 @@ public class ConfigurableBrowse extends AbstractDSpaceTransformer implements for (SortOption so : sortOptions) { - sortSelect.addOption(so.equals(info.getSortOption()), so.getNumber(), - message("xmlui.ArtifactBrowser.ConfigurableBrowse.sort_by." + so.getName())); + if (so.isVisible()) + { + sortSelect.addOption(so.equals(info.getSortOption()), so.getNumber(), + message("xmlui.ArtifactBrowser.ConfigurableBrowse.sort_by." + so.getName())); + } } } } diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index 9ed1355c55..22eeef5889 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -453,11 +453,15 @@ plugin.single.org.dspace.app.webui.util.StyleSelection = \ # The other form is for indexes of the items themselves, ie. each entry will be displayed # according to the configuration of by webui.itemlist.columns: # -# webui.browse.index. = : item : +# webui.browse.index. = : item : : (asc | desc) # # sort option name: this is the sorting to be applied to the display. It must match the # name given to one of the webui.browse.sort-option entries given 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: # @@ -485,15 +489,16 @@ webui.browse.index.4 = subject:metadata:dc.subject.*:text # # webui.browse.sort-option. =