From 421cad511e8ceaf11d5b45d4bcde1dac2de4ca5a Mon Sep 17 00:00:00 2001 From: Tiago Salvado Date: Tue, 5 Jul 2022 11:22:44 +0100 Subject: [PATCH 1/2] [MNT-23094] Prevent ArrayIndexOutOfBoundsException when sorting by empty field --- .../solr/AlfrescoCollatableTextFieldType.java | 9 ++++++++- .../solr/AlfrescoCollatableTextFieldTypeTest.java | 13 +++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCollatableTextFieldType.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCollatableTextFieldType.java index 0bd6f84ab..6e255fbab 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCollatableTextFieldType.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCollatableTextFieldType.java @@ -179,7 +179,14 @@ public class AlfrescoCollatableTextFieldType extends StrField else if (withLocale.startsWith("\u0000")) { String[] parts = withLocale.split("\u0000"); - return parts[2]; + if (parts != null && parts.length == 3) + { + return parts[2]; + } + else + { + return withLocale; + } } else { diff --git a/search-services/alfresco-search/src/test/java/org/alfresco/solr/AlfrescoCollatableTextFieldTypeTest.java b/search-services/alfresco-search/src/test/java/org/alfresco/solr/AlfrescoCollatableTextFieldTypeTest.java index d3424bb5a..122880fef 100644 --- a/search-services/alfresco-search/src/test/java/org/alfresco/solr/AlfrescoCollatableTextFieldTypeTest.java +++ b/search-services/alfresco-search/src/test/java/org/alfresco/solr/AlfrescoCollatableTextFieldTypeTest.java @@ -173,4 +173,17 @@ public class AlfrescoCollatableTextFieldTypeTest verify(mockCollator).compare("NotNull1", "NotNull2"); assertEquals("Expected result to be obtained from collator.", comparisonResult, result); } + + @Test + public void testMNT23094() + { + // Set up the document to have an encoded value for the field. + when(mockDocTerms.get(DOC)).thenReturn(new BytesRef("\u0000")); + when(mockDocsWithField.get(DOC)).thenReturn(false); + + // Call the method under test. + textSortFieldComparator.compareBottom(DOC); + + verify(mockCollator).compare(BOTTOM_STRING, "\u0000"); + } } From c3a8addc46b71f68d9334c0c4afcd410f046672e Mon Sep 17 00:00:00 2001 From: Tiago Salvado Date: Thu, 7 Jul 2022 10:35:58 +0100 Subject: [PATCH 2/2] [MNT-23094] Changed if statement. Added javadoc/comments. --- .../solr/AlfrescoCollatableTextFieldType.java | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCollatableTextFieldType.java b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCollatableTextFieldType.java index 6e255fbab..f94c97fa7 100644 --- a/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCollatableTextFieldType.java +++ b/search-services/alfresco-search/src/main/java/org/alfresco/solr/AlfrescoCollatableTextFieldType.java @@ -162,36 +162,39 @@ public class AlfrescoCollatableTextFieldType extends StrField return values[slot]; } + /** + * Finds the term string value for supplied doc + * + * @param doc + * the document id that was hit + * @param term + * a {@link BytesRef} object representing an UTF8 encoded term in the index + * + * @return the term value in string format + */ private String findBestValue(int doc, BytesRef term) { if (term.length == 0 && docsWithField != null && docsWithField.get(doc) == false) { return null; } - + + // Converts the stored bytes (as UTF8) to string String withLocale = term.utf8ToString(); - - // split strin into MLText object - if (withLocale == null) - { - return withLocale; - } - else if (withLocale.startsWith("\u0000")) + + if (withLocale != null && withLocale.startsWith("\u0000")) { + // the array can either be [, locale, term value] or just [, locale] depending whether the term value used + // to perform the sort is empty or not String[] parts = withLocale.split("\u0000"); + if (parts != null && parts.length == 3) { return parts[2]; } - else - { - return withLocale; - } - } - else - { - return withLocale; } + + return withLocale; } /* (non-Javadoc)