diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 6f150f65c9d..8319ac38949 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -202,6 +202,8 @@ Improvements * GITHUB#13087: Changed `static final Set` constants to be immutable. Among others it affected ScandinavianNormalizer.ALL_FOLDINGS set with public access. (Dmitry Cherniachenko) +* GITHUB#13155: Hunspell: allow ignoring exceptions on duplicate ICONV/OCONV mappings (Peter Gromov) + Optimizations --------------------- diff --git a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java index 300cf5305d6..5a01a39d3c6 100644 --- a/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java +++ b/lucene/analysis/common/src/java/org/apache/lucene/analysis/hunspell/Dictionary.java @@ -815,7 +815,7 @@ public class Dictionary { for (int i = 0; i < num; i++) { String[] parts = splitBySpace(reader, reader.readLine(), 3); - if (mappings.put(parts[1], parts[2]) != null) { + if (mappings.put(parts[1], parts[2]) != null && !tolerateDuplicateConversionMappings()) { throw new IllegalStateException("duplicate mapping specified for: " + parts[1]); } } @@ -1167,6 +1167,14 @@ public class Dictionary { return false; } + /** + * Whether duplicate ICONV/OCONV lines should be silently ignored. False by default: an {@link + * IllegalStateException} will happen. + */ + protected boolean tolerateDuplicateConversionMappings() { + return false; + } + char[] allNonSuggestibleFlags() { return Dictionary.toSortedCharArray( Stream.of(HIDDEN_FLAG, noSuggest, forbiddenword, onlyincompound, subStandard) diff --git a/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/TestDictionary.java b/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/TestDictionary.java index f08fbfbd2d6..28cfb1330ed 100644 --- a/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/TestDictionary.java +++ b/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/TestDictionary.java @@ -206,6 +206,11 @@ public class TestDictionary extends LuceneTestCase { protected boolean tolerateAffixRuleCountMismatches() { return true; } + + @Override + protected boolean tolerateDuplicateConversionMappings() { + return true; + } }; } } diff --git a/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/forgivable-errors.aff b/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/forgivable-errors.aff index b9b56cc5d65..cb093496691 100644 --- a/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/forgivable-errors.aff +++ b/lucene/analysis/common/src/test/org/apache/lucene/analysis/hunspell/forgivable-errors.aff @@ -12,4 +12,8 @@ MAP a b SFX A Y 1 SFX A nout l [aeiouyáéíóúýůěr][^aeiouyáéíóúýůěrl][^aeiouy -SFX A b c d \ No newline at end of file +SFX A b c d + +ICONV 2 +ICONV x y +ICONV x y \ No newline at end of file