From be370cd0ef134bb44fde733e4ee91661a012dae5 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Thu, 24 Oct 2013 20:54:34 +0000 Subject: [PATCH] Applying Thomas' patch from LANG-917 - fixing Arne Burmeister's reported exception when combining custom and choice formats git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/trunk@1535547 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../commons/lang3/text/ExtendedMessageFormat.java | 4 ++-- .../commons/lang3/text/ExtendedMessageFormatTest.java | 10 ++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index ee1d0d1ad..dd3c148aa 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -22,6 +22,7 @@ + Fixed exception when combining custom and choice format in ExtendedMessageFormat Added StringUtils.isBlank/isEmpty CharSequence... methods Added ArrayUtils.reverse(array, from, to) methods StringUtils.toString(byte[], String) deprecated in favour of a new StringUtils.toString(byte[], CharSet) diff --git a/src/main/java/org/apache/commons/lang3/text/ExtendedMessageFormat.java b/src/main/java/org/apache/commons/lang3/text/ExtendedMessageFormat.java index 722d3b5a7..59c51e93f 100644 --- a/src/main/java/org/apache/commons/lang3/text/ExtendedMessageFormat.java +++ b/src/main/java/org/apache/commons/lang3/text/ExtendedMessageFormat.java @@ -417,10 +417,10 @@ private String insertFormats(final String pattern, final ArrayList custo break; case START_FE: depth++; + sb.append(START_FE).append(readArgumentIndex(pattern, next(pos))); + // do not look for custom patterns when they are embedded, e.g. in a choice if (depth == 1) { fe++; - sb.append(START_FE).append( - readArgumentIndex(pattern, next(pos))); final String customPattern = customPatterns.get(fe); if (customPattern != null) { sb.append(START_FMT).append(customPattern); diff --git a/src/test/java/org/apache/commons/lang3/text/ExtendedMessageFormatTest.java b/src/test/java/org/apache/commons/lang3/text/ExtendedMessageFormatTest.java index 973a3b739..5741b3973 100644 --- a/src/test/java/org/apache/commons/lang3/text/ExtendedMessageFormatTest.java +++ b/src/test/java/org/apache/commons/lang3/text/ExtendedMessageFormatTest.java @@ -79,6 +79,16 @@ public void testEscapedQuote_LANG_477() { assertEquals("it's a dummy test!", emf.format(new Object[] {"DUMMY"})); } + /** + * Test Bug LANG-917 - IndexOutOfBoundsException and/or infinite loop when using a choice pattern + */ + @Test + public void testEmbeddedPatternInChoice() { + final String pattern = "Hi {0,lower}, got {1,choice,0#none|1#one|1<{1,number}}, {2,upper}!"; + final ExtendedMessageFormat emf = new ExtendedMessageFormat(pattern, registry); + assertEquals(emf.format(new Object[] {"there", 3, "great"}), "Hi there, got 3, GREAT!"); + } + /** * Test extended and built in formats. */