diff --git a/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQuery.java b/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQuery.java index e5bdfcad94..7ab70540f1 100644 --- a/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQuery.java +++ b/source/java/org/alfresco/repo/node/getchildren/GetChildrenCannedQuery.java @@ -20,8 +20,6 @@ package org.alfresco.repo.node.getchildren; import java.io.Serializable; import java.text.Collator; -import java.text.ParseException; -import java.text.RuleBasedCollator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -61,6 +59,7 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.namespace.QName; +import org.alfresco.util.AlfrescoCollator; import org.alfresco.util.Pair; import org.alfresco.util.ParameterCheck; import org.apache.commons.logging.Log; @@ -374,7 +373,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions inclusiveAspects, Set exclusiveAspects) { if (inclusiveAspects == null && exclusiveAspects == null) diff --git a/source/java/org/alfresco/util/AlfrescoCollator.java b/source/java/org/alfresco/util/AlfrescoCollator.java new file mode 100644 index 0000000000..fc82e89298 --- /dev/null +++ b/source/java/org/alfresco/util/AlfrescoCollator.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.util; + +import java.text.Collator; +import java.text.ParseException; +import java.text.RuleBasedCollator; +import java.util.Locale; +/** + * Can be used to overwrite a RuleBaseCollator instance rules + * + * @author sergey.shcherbovich + */ +public class AlfrescoCollator +{ + public static Collator getInstance(Locale locale) + { + return updateCollatorRules(Collator.getInstance(locale)); + } + + // update RuleBasedCollator rules to change order of characters during comparison + // MNT-10169 fix + private static synchronized Collator updateCollatorRules(Collator collator) + { + if (collator instanceof RuleBasedCollator) + { + try + { + // get current collator rules + String collatorRules = ((RuleBasedCollator)collator).getRules(); + // we shoudn't ignore space character in character comparison - put it before u0021 character + String newCollatorRules = collatorRules.replaceAll("<'\u0021'", "<'\u0020'<'\u0021'"); + // create new collator with overridden rules + return new RuleBasedCollator(newCollatorRules); + } + catch(ParseException e) + { + return collator; + } + } + return collator; + } +} diff --git a/source/test-java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryTest.java b/source/test-java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryTest.java index 66584039bf..d5f350efc2 100644 --- a/source/test-java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryTest.java +++ b/source/test-java/org/alfresco/repo/node/getchildren/GetChildrenCannedQueryTest.java @@ -75,6 +75,7 @@ import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; import org.alfresco.test_category.OwnJVMTestsCategory; +import org.alfresco.util.AlfrescoCollator; import org.alfresco.util.ApplicationContextHelper; import org.alfresco.util.Pair; import org.alfresco.util.PropertyMap; @@ -83,6 +84,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.experimental.categories.Category; import org.springframework.context.ApplicationContext; +import org.springframework.extensions.surf.util.I18NUtil; /** * GetChildren canned query - simple unit tests @@ -1051,7 +1053,7 @@ public class GetChildrenCannedQueryTest extends TestCase logger.info("testSorting: "+count+" items ["+sortPropQName+","+(sortAscending ? " ascending" : " descending")+"]"); } - Collator collator = Collator.getInstance(); + Collator collator = AlfrescoCollator.getInstance(I18NUtil.getContentLocale()); // check order Serializable prevVal = null;