diff --git a/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/com/xpn/xwiki/plugin/tag/TagPlugin.java b/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/com/xpn/xwiki/plugin/tag/TagPlugin.java index a5d75b8bf809..31ae84178b6d 100644 --- a/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/com/xpn/xwiki/plugin/tag/TagPlugin.java +++ b/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/com/xpn/xwiki/plugin/tag/TagPlugin.java @@ -333,7 +333,7 @@ public Map getTagCountForQuery(String fromHql, String whereHql, */ public List getDocumentsWithTag(String tag, XWikiContext context) throws XWikiException { - return TagQueryUtils.getDocumentsWithTag(tag, context); + return TagQueryUtils.getDocumentsWithTag(tag, false, false); } /** @@ -349,7 +349,13 @@ public List getDocumentsWithTag(String tag, XWikiContext context) throws public List getDocumentsWithTag(String tag, boolean includeHiddenDocuments, XWikiContext context) throws XWikiException { - return TagQueryUtils.getDocumentsWithTag(tag, includeHiddenDocuments, context); + return getDocumentsWithTag(tag, includeHiddenDocuments, false); + } + + private List getDocumentsWithTag(String tag, boolean includeHiddenDocuments, boolean caseSensitive) + throws XWikiException + { + return TagQueryUtils.getDocumentsWithTag(tag, includeHiddenDocuments, caseSensitive); } /** @@ -560,10 +566,13 @@ public TagOperationResult removeTagFromDocument(String tag, XWikiDocument docume */ protected TagOperationResult renameTag(String tag, String newTag, XWikiContext context) throws XWikiException { + // if the user is renaming a tag to change its case, we want to ensure that we only retrieve tags based on + // the case. Else we want to rename the tag for all pages whatever the case. + boolean caseSensitive = StringUtils.equalsIgnoreCase(tag, newTag); // Since we're renaming a tag, we want to rename it even if the document is hidden. A hidden document is still // accessible to users, it's just not visible for simple users; it doesn't change permissions. - List docNamesToProcess = getDocumentsWithTag(tag, true, context); - if (StringUtils.equals(tag, newTag) || docNamesToProcess.size() == 0 || StringUtils.isBlank(newTag)) { + List docNamesToProcess = getDocumentsWithTag(tag, true, caseSensitive); + if (StringUtils.equals(tag, newTag) || docNamesToProcess.isEmpty() || StringUtils.isBlank(newTag)) { return TagOperationResult.NO_EFFECT; } diff --git a/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/com/xpn/xwiki/plugin/tag/TagQueryUtils.java b/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/com/xpn/xwiki/plugin/tag/TagQueryUtils.java index be454e07781d..c0e91f2930c8 100644 --- a/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/com/xpn/xwiki/plugin/tag/TagQueryUtils.java +++ b/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/com/xpn/xwiki/plugin/tag/TagQueryUtils.java @@ -23,6 +23,7 @@ import java.util.Map; import org.xwiki.query.internal.HiddenDocumentFilter; +import org.xwiki.stability.Unstable; import org.xwiki.tag.internal.TagException; import org.xwiki.tag.internal.TagsSelector; @@ -145,9 +146,29 @@ public static List getDocumentsWithTag(String tag, XWikiContext context) */ public static List getDocumentsWithTag(String tag, boolean includeHiddenDocuments, XWikiContext context) throws XWikiException + { + return getDocumentsWithTag(tag, includeHiddenDocuments, false); + } + + /** + * Get documents with the passed tags with the result depending on whether the caller decides to include hidden + * documents or not. + * + * @param tag a list of tags to match. + * @param includeHiddenDocuments if true then include hidden documents + * @param caseSensitive {@code true} if the case of the tag should be used in the query {@code false} for getting + * results whatever the case of the tag. + * @return list of docNames. + * @throws XWikiException if search query fails (possible failures: DB access problems, etc). + * @since 17.0.0RC1 + * @since 16.10.1 + */ + @Unstable + public static List getDocumentsWithTag(String tag, boolean includeHiddenDocuments, boolean caseSensitive) + throws XWikiException { try { - return getTagsSelector().getDocumentsWithTag(tag, includeHiddenDocuments); + return getTagsSelector().getDocumentsWithTag(tag, includeHiddenDocuments, caseSensitive); } catch (TagException e) { throw new XWikiException(MODULE_XWIKI_STORE, ERROR_XWIKI_UNKNOWN, String.format("Failed to get all documents with tag [%s]", tag), e); diff --git a/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/org/xwiki/tag/internal/TagsSelector.java b/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/org/xwiki/tag/internal/TagsSelector.java index c3b6c3fd1e58..46dbb9add159 100644 --- a/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/org/xwiki/tag/internal/TagsSelector.java +++ b/xwiki-platform-core/xwiki-platform-tag/xwiki-platform-tag-api/src/main/java/org/xwiki/tag/internal/TagsSelector.java @@ -71,8 +71,11 @@ Map getTagCountForQuery(String fromHql, String whereHql, Map