RM-2470 Change security clearance sorting to be by full name.

Enable sorting by multiple fields and configure the security clearance page
to use first name, last name and then fall back to user name as a tie
breaker.

The rm-automation test fails for me locally, as the person search is case
sensitive. I'm pushing this anyway because Bamboo didn't protest at the
old sorting method (which also failed locally due to case sensitivity).

Remove "final" from UserQueryParams so it can be mocked.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@109169 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Tom Page
2015-07-29 15:16:25 +00:00
parent 10495abb88
commit 9edd378291
3 changed files with 124 additions and 20 deletions

View File

@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.ImmutableList;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
import org.alfresco.util.ParameterCheck;
@@ -37,7 +38,7 @@ import org.alfresco.util.ParameterCheck;
* @author Neil Mc Erlean
* @since 3.0.a
*/
public final class UserQueryParams
public class UserQueryParams
{
/** Required parameter. No default value. This is the username fragment. */
private final String searchTerm;
@@ -89,6 +90,19 @@ public final class UserQueryParams
return this;
}
/**
* Sets the sort properties required for the query.
*
* @param sortProps A list of pairs of properties and sort directions.
* @return The updated {@code UserQueryParams} object.
*/
public UserQueryParams withSortProps(List<Pair<QName, Boolean>> sortProps)
{
this.sortProps = ImmutableList.copyOf(sortProps);
validateList(sortProps);
return this;
}
public String getSearchTerm() { return this.searchTerm; }
public List<QName> getFilterProps() { return this.filterProps; }
public List<Pair<QName, Boolean>> getSortProps() { return this.sortProps; }
@@ -99,24 +113,25 @@ public final class UserQueryParams
@SuppressWarnings("unchecked")
private <T> List<T> toList(T firstElem, T... otherElems)
{
// At least one element is required.
ParameterCheck.mandatory("firstElem", firstElem);
List<T> elementList = new ArrayList<>();
elementList.add(firstElem);
if (otherElems != null)
{
final List<T> tList = asList(otherElems);
final int firstNull = tList.indexOf(null);
if (firstNull != -1)
{
// "+ 2" so that position 1 points to 'firstElem' and so on through otherElems.
throw new IllegalArgumentException("Unexpected null element at position " + firstNull + 2);
}
elementList.addAll(tList);
elementList.addAll(asList(otherElems));
}
validateList(elementList);
return elementList;
}
/** Validate a list of elements to check none of them are null. */
private <T> void validateList(List<T> elementList)
{
if (elementList.contains(null))
{
throw new IllegalArgumentException("Unexpected null in parameter list: " + elementList);
}
}
}

View File

@@ -20,10 +20,13 @@ package org.alfresco.module.org_alfresco_module_rm.script.classification;
import static java.lang.Boolean.parseBoolean;
import static java.lang.Integer.parseInt;
import static org.apache.commons.lang.StringUtils.isBlank;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import static org.springframework.extensions.webscripts.Status.STATUS_INTERNAL_SERVER_ERROR;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -34,6 +37,7 @@ import org.alfresco.module.org_alfresco_module_rm.script.AbstractRmWebScript;
import org.alfresco.query.PagingResults;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
import org.apache.commons.collections.iterators.ArrayIterator;
import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptException;
@@ -51,8 +55,9 @@ public class UserSecurityClearanceGet extends AbstractRmWebScript
private static final String TOTAL = "total";
private static final String SKIP_COUNT = "startIndex";
private static final String MAX_ITEMS = "pageSize";
private static final String SORT_FIELD = "sortField";
private static final String SORT_ASCENDING = "sortAscending";
private static final String SORT_FIELDS = "sortField";
private static final String SORT_ASCENDING_FLAGS = "sortAscending";
private static final String SEPARATOR = ",";
private static final String ITEM_COUNT = "itemCount";
private static final String ITEMS = "items";
private static final String DATA = "data";
@@ -204,14 +209,31 @@ public class UserSecurityClearanceGet extends AbstractRmWebScript
* @param req {@link WebScriptRequest} The webscript request
*/
@SuppressWarnings("unchecked")
private void setSortProps(UserQueryParams userQueryParams, WebScriptRequest req)
protected void setSortProps(UserQueryParams userQueryParams, WebScriptRequest req)
{
String sortField = req.getParameter(SORT_FIELD);
String sortAscending = req.getParameter(SORT_ASCENDING);
if (isNotBlank(sortField) && isNotBlank(sortAscending))
String sortFields = req.getParameter(SORT_FIELDS);
if (isBlank(sortFields))
{
userQueryParams.withSortProps(new Pair<>(QName.createQName(sortField, getNamespaceService()), parseBoolean(sortAscending)));
return;
}
String sortAscendingFlags = req.getParameter(SORT_ASCENDING_FLAGS);
sortAscendingFlags = (isBlank(sortAscendingFlags) ? "True" : sortAscendingFlags);
List<Pair<QName, Boolean>> sortPairs = new ArrayList<>();
Iterator<String> ascendingFlagIterator = new ArrayIterator((String[]) sortAscendingFlags.split(SEPARATOR));
for (String sortField : sortFields.split(SEPARATOR))
{
boolean ascendingFlag = (ascendingFlagIterator.hasNext() ? parseBoolean(ascendingFlagIterator.next()) : true);
if (isNotBlank(sortField))
{
Pair<QName, Boolean> sortPair = new Pair<>(QName.createQName(sortField, getNamespaceService()), ascendingFlag);
sortPairs.add(sortPair);
}
}
if (!sortPairs.isEmpty())
{
userQueryParams.withSortProps(sortPairs);
}
}
}