]> granicus.if.org Git - icu/commitdiff
ICU-7618 replace MessageFormat with SimpleFormatterImpl where easy; remove obsolete...
authorMarkus Scherer <markus.icu@gmail.com>
Tue, 26 Jan 2016 22:52:45 +0000 (22:52 +0000)
committerMarkus Scherer <markus.icu@gmail.com>
Tue, 26 Jan 2016 22:52:45 +0000 (22:52 +0000)
X-SVN-Rev: 38199

icu4j/main/classes/core/src/com/ibm/icu/impl/LocaleDisplayNamesImpl.java
icu4j/main/classes/core/src/com/ibm/icu/impl/SimpleFormatterImpl.java
icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java
icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java
icu4j/main/classes/core/src/com/ibm/icu/text/DecimalFormat.java
icu4j/main/classes/core/src/com/ibm/icu/text/DecimalFormatSymbols.java
icu4j/main/classes/core/src/com/ibm/icu/text/RelativeDateTimeFormatter.java
icu4j/main/classes/core/src/com/ibm/icu/text/SimpleDateFormat.java
icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateTimeGeneratorTest.java

index abff069a9012f5ce22ce08c6d6e4c6bd929263d6..4ab482ceeba5eb8a7ed9b71e850e9d5c300d203c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *******************************************************************************
- * Copyright (C) 2009-2015, International Business Machines Corporation and    *
- * others. All Rights Reserved.                                                *
+ * Copyright (C) 2009-2016, International Business Machines Corporation and
+ * others. All Rights Reserved.
  *******************************************************************************
  */
 package com.ibm.icu.impl;
@@ -27,7 +27,6 @@ import com.ibm.icu.text.BreakIterator;
 import com.ibm.icu.text.DisplayContext;
 import com.ibm.icu.text.DisplayContext.Type;
 import com.ibm.icu.text.LocaleDisplayNames;
-import com.ibm.icu.text.MessageFormat;
 import com.ibm.icu.util.ULocale;
 import com.ibm.icu.util.UResourceBundle;
 import com.ibm.icu.util.UResourceBundleIterator;
@@ -39,9 +38,10 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
     private final DisplayContext nameLength;
     private final DataTable langData;
     private final DataTable regionData;
-    private final MessageFormat separatorFormat;
-    private final MessageFormat format;
-    private final MessageFormat keyTypeFormat;
+    // Compiled SimpleFormatter patterns.
+    private final String separatorFormat;
+    private final String format;
+    private final String keyTypeFormat;
     private final char formatOpenParen;
     private final char formatReplaceOpenParen;
     private final char formatCloseParen;
@@ -139,13 +139,14 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
         if ("separator".equals(sep)) {
             sep = "{0}, {1}";
         }
-        this.separatorFormat = new MessageFormat(sep);
+        StringBuilder sb = new StringBuilder();
+        this.separatorFormat = SimpleFormatterImpl.compileToStringMinMaxArguments(sep, sb, 2, 2);
 
         String pattern = langData.get("localeDisplayPattern", "pattern");
         if ("pattern".equals(pattern)) {
             pattern = "{0} ({1})";
         }
-        this.format = new MessageFormat(pattern);
+        this.format = SimpleFormatterImpl.compileToStringMinMaxArguments(pattern, sb, 2, 2);
         if (pattern.contains("(")) {
             formatOpenParen = '(';
             formatCloseParen = ')';
@@ -162,7 +163,8 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
         if ("keyTypePattern".equals(keyTypePattern)) {
             keyTypePattern = "{0}={1}";
         }
-        this.keyTypeFormat = new MessageFormat(keyTypePattern);
+        this.keyTypeFormat = SimpleFormatterImpl.compileToStringMinMaxArguments(
+                keyTypePattern, sb, 2, 2);
 
         // Get values from the contextTransforms data if we need them
         // Also check whether we will need a break iterator (depends on the data)
@@ -365,8 +367,8 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
                 if (!valueDisplayName.equals(value)) {
                     appendWithSep(valueDisplayName, buf);
                 } else if (!key.equals(keyDisplayName)) {
-                    String keyValue = keyTypeFormat.format(
-                            new String[] { keyDisplayName, valueDisplayName });
+                    String keyValue = SimpleFormatterImpl.formatCompiledPattern(
+                            keyTypeFormat, keyDisplayName, valueDisplayName);
                     appendWithSep(keyValue, buf);
                 } else {
                     appendWithSep(keyDisplayName, buf)
@@ -382,7 +384,8 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
         }
 
         if (resultRemainder != null) {
-            resultName =  format.format(new Object[] {resultName, resultRemainder});
+            resultName = SimpleFormatterImpl.formatCompiledPattern(
+                    format, resultName, resultRemainder);
         }
 
         return adjustForUsageAndContext(CapitalizationContextUsage.LANGUAGE, resultName);
@@ -639,8 +642,7 @@ public class LocaleDisplayNamesImpl extends LocaleDisplayNames {
         if (b.length() == 0) {
             b.append(s); 
         } else {
-            String combined = separatorFormat.format(new String[] { b.toString(), s });
-            b.replace(0, b.length(), combined);
+            SimpleFormatterImpl.formatAndReplace(separatorFormat, b, null, b, s);
         }
         return b;
     }
index 7098c607d02ec2b409b3145842c76275ea1ec90e..4ce541953fc29b13016e7947390b6def28dbb165 100644 (file)
@@ -186,6 +186,25 @@ public final class SimpleFormatterImpl {
         return formatAndAppend(compiledPattern, new StringBuilder(), null, values).toString();
     }
 
+    /**
+     * Formats the not-compiled pattern with the given values.
+     * Equivalent to compileToStringMinMaxArguments() followed by formatCompiledPattern().
+     * The number of arguments checked against the given limits is the
+     * highest argument number plus one, not the number of occurrences of arguments.
+     *
+     * @param pattern Not-compiled form of a pattern string.
+     * @param min The pattern must have at least this many arguments.
+     * @param max The pattern must have at most this many arguments.
+     * @return The compiled-pattern string.
+     * @throws IllegalArgumentException for bad argument syntax and too few or too many arguments.
+     */
+    public static String formatRawPattern(String pattern, int min, int max, CharSequence... values) {
+        StringBuilder sb = new StringBuilder();
+        String compiledPattern = compileToStringMinMaxArguments(pattern, sb, min, max);
+        sb.setLength(0);
+        return formatAndAppend(compiledPattern, sb, null, values).toString();
+    }
+
     /**
      * Formats the given values, appending to the appendTo builder.
      *
index 0808052d4c1c568ebc914ceceef8ccad0b85429f..2eb69af7ec8c69fa699a01d42c881c06f1863ad8 100644 (file)
@@ -17,6 +17,7 @@ import java.util.Map;
 import com.ibm.icu.impl.CalendarData;
 import com.ibm.icu.impl.ICUCache;
 import com.ibm.icu.impl.SimpleCache;
+import com.ibm.icu.impl.SimpleFormatterImpl;
 import com.ibm.icu.text.DateIntervalInfo.PatternInfo;
 import com.ibm.icu.util.Calendar;
 import com.ibm.icu.util.DateInterval;
@@ -858,8 +859,8 @@ public class DateIntervalFormat extends UFormat {
             laterDate = fDateFormat.format(toCalendar, laterDate, otherPos);
             String fallbackPattern = fInfo.getFallbackIntervalPattern();
             adjustPosition(fallbackPattern, earlierDate.toString(), pos, laterDate.toString(), otherPos, pos);
-            String fallbackRange = MessageFormat.format(fallbackPattern, new Object[]
-                            {earlierDate.toString(), laterDate.toString()});
+            String fallbackRange = SimpleFormatterImpl.formatRawPattern(
+                    fallbackPattern, 2, 2, earlierDate, laterDate);
             if (formatDatePlusTimeRange) {
                 // fallbackRange has just the time range, need to format the date part and combine that
                 fDateFormat.applyPattern(fDatePattern);
@@ -868,8 +869,8 @@ public class DateIntervalFormat extends UFormat {
                 otherPos.setEndIndex(0);
                 datePortion = fDateFormat.format(fromCalendar, datePortion, otherPos);
                 adjustPosition(fDateTimeFormat, fallbackRange, pos, datePortion.toString(), otherPos, pos);
-                fallbackRange = MessageFormat.format(fDateTimeFormat, new Object[]
-                            {fallbackRange, datePortion.toString()});
+                fallbackRange = SimpleFormatterImpl.formatRawPattern(
+                        fDateTimeFormat, 2, 2, fallbackRange, datePortion);
             }
             appendTo.append(fallbackRange);
             if (formatDatePlusTimeRange) {
@@ -1813,8 +1814,8 @@ public class DateIntervalFormat extends UFormat {
         if ( timeItvPtnInfo != null ) {
             String timeIntervalPattern = timeItvPtnInfo.getFirstPart() + 
                                          timeItvPtnInfo.getSecondPart();
-            String pattern = MessageFormat.format(dtfmt, new Object[] 
-                                         {timeIntervalPattern, datePattern});
+            String pattern = SimpleFormatterImpl.formatRawPattern(
+                    dtfmt, 2, 2, timeIntervalPattern, datePattern);
             timeItvPtnInfo = DateIntervalInfo.genPatternInfo(pattern,
                                 timeItvPtnInfo.firstDateInPtnIsLaterDate());
             intervalPatterns.put(
index a53a69fac5329ce046fa84b0fa844952bb164350..c72217264085af665c69731a1dfb94b3f85f6bd6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  ********************************************************************************
- * Copyright (C) 2006-2015, Google, International Business Machines Corporation *
- * and others. All Rights Reserved.                                             *
+ * Copyright (C) 2006-2016, Google, International Business Machines Corporation
+ * and others. All Rights Reserved.
  ********************************************************************************
  */
 package com.ibm.icu.text;
@@ -27,6 +27,7 @@ import com.ibm.icu.impl.ICUCache;
 import com.ibm.icu.impl.ICUResourceBundle;
 import com.ibm.icu.impl.PatternTokenizer;
 import com.ibm.icu.impl.SimpleCache;
+import com.ibm.icu.impl.SimpleFormatterImpl;
 import com.ibm.icu.impl.Utility;
 import com.ibm.icu.util.Calendar;
 import com.ibm.icu.util.Freezable;
@@ -434,7 +435,8 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
 
         if (datePattern == null) return timePattern == null ? "" : timePattern;
         if (timePattern == null) return datePattern;
-        return MessageFormat.format(getDateTimeFormat(), new Object[]{timePattern, datePattern});
+        return SimpleFormatterImpl.formatRawPattern(
+                getDateTimeFormat(), 2, 2, timePattern, datePattern);
     }
 
     /**
@@ -1646,7 +1648,8 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
                 String temp = adjustFieldTypes(tempWithMatcher, source, flags, options);
                 int foundMask = startingMask & ~distInfo.missingFieldMask;
                 int topField = getTopBitNumber(foundMask);
-                resultPattern = MessageFormat.format(getAppendFormat(topField), new Object[]{resultPattern, temp, getAppendName(topField)});
+                resultPattern = SimpleFormatterImpl.formatRawPattern(
+                        getAppendFormat(topField), 2, 3, resultPattern, temp, getAppendName(topField));
             }
         }
         return resultPattern;
index c82c7b0481be90f96d8f2422c2b4934b61df3087..22557b676e1beff06d084005ad6cf23e0d1fecd3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *******************************************************************************
- * Copyright (C) 1996-2015, International Business Machines Corporation and    *
- * others. All Rights Reserved.                                                *
+ * Copyright (C) 1996-2016, International Business Machines Corporation and
+ * others. All Rights Reserved.
  *******************************************************************************
  */
 package com.ibm.icu.text;
@@ -4040,19 +4040,19 @@ public class DecimalFormat extends NumberFormat {
         // Reuse one StringBuffer for better performance
         StringBuffer buffer = new StringBuffer();
         if (posPrefixPattern != null) {
-            expandAffix(posPrefixPattern, pluralCount, buffer, false);
+            expandAffix(posPrefixPattern, pluralCount, buffer);
             positivePrefix = buffer.toString();
         }
         if (posSuffixPattern != null) {
-            expandAffix(posSuffixPattern, pluralCount, buffer, false);
+            expandAffix(posSuffixPattern, pluralCount, buffer);
             positiveSuffix = buffer.toString();
         }
         if (negPrefixPattern != null) {
-            expandAffix(negPrefixPattern, pluralCount, buffer, false);
+            expandAffix(negPrefixPattern, pluralCount, buffer);
             negativePrefix = buffer.toString();
         }
         if (negSuffixPattern != null) {
-            expandAffix(negSuffixPattern, pluralCount, buffer, false);
+            expandAffix(negSuffixPattern, pluralCount, buffer);
             negativeSuffix = buffer.toString();
         }
     }
@@ -4071,6 +4071,7 @@ public class DecimalFormat extends NumberFormat {
      * it is used to expand the stored affix patterns given a specific number (doFormat ==
      * true), for those rare cases in which a currency format references a ChoiceFormat
      * (e.g., en_IN display name for INR). The number itself is taken from digitList.
+     * TODO: There are no currency ChoiceFormat patterns, figure out what is still relevant here.
      *
      * When used in the first way, this method has a side effect: It sets currencyChoice
      * to a ChoiceFormat object, if the currency's display name in this locale is a
@@ -4083,15 +4084,9 @@ public class DecimalFormat extends NumberFormat {
      * it is the singular "one", or the plural "other". For all other cases, it is null,
      * and is not being used.
      * @param buffer a scratch StringBuffer; its contents will be lost
-     * @param doFormat if false, then the pattern will be expanded, and if a currency
-     * symbol is encountered that expands to a ChoiceFormat, the currencyChoice member
-     * variable will be initialized if it is null. If doFormat is true, then it is assumed
-     * that the currencyChoice has been created, and it will be used to format the value
-     * in digitList.
      */
     // Bug 4212072 [Richard/GCL]
-    private void expandAffix(String pattern, String pluralCount, StringBuffer buffer,
-                             boolean doFormat) {
+    private void expandAffix(String pattern, String pluralCount, StringBuffer buffer) {
         buffer.setLength(0);
         for (int i = 0; i < pattern.length();) {
             char c = pattern.charAt(i++);
@@ -4143,37 +4138,10 @@ public class DecimalFormat extends NumberFormat {
                     // when formatting currency plural names.  For other cases,
                     // pluralCount == null, and plural names are not needed.
                     if (plural && pluralCount != null) {
-                        boolean isChoiceFormat[] = new boolean[1];
                         s = currency.getName(symbols.getULocale(), Currency.PLURAL_LONG_NAME,
-                                             pluralCount, isChoiceFormat);
+                                             pluralCount, null);
                     } else if (!intl) {
-                        boolean isChoiceFormat[] = new boolean[1];
-                        s = currency.getName(symbols.getULocale(), Currency.SYMBOL_NAME,
-                                             isChoiceFormat);
-                        if (isChoiceFormat[0]) {
-                            // Two modes here: If doFormat is false, we set up
-                            // currencyChoice. If doFormat is true, we use the previously
-                            // created currencyChoice to format the value in digitList.
-                            if (!doFormat) {
-                                // If the currency is handled by a ChoiceFormat, then
-                                // we're not going to use the expanded
-                                // patterns. Instantiate the ChoiceFormat and return.
-                                if (currencyChoice == null) {
-                                    currencyChoice = new ChoiceFormat(s);
-                                }
-                                // We could almost return null or "" here, since the
-                                // expanded affixes are almost not used at all in this
-                                // situation. However, one method -- toPattern() -- still
-                                // does use the expanded affixes, in order to set up a
-                                // padding pattern. We use the CURRENCY_SIGN as a
-                                // placeholder.
-                                s = String.valueOf(CURRENCY_SIGN);
-                            } else {
-                                FieldPosition pos = new FieldPosition(0); // ignored
-                                currencyChoice.format(digitList.getDouble(), buffer, pos);
-                                continue;
-                            }
-                        }
+                        s = currency.getName(symbols.getULocale(), Currency.SYMBOL_NAME, null);
                     } else {
                         s = currency.getCurrencyCode();
                     }
@@ -4220,7 +4188,7 @@ public class DecimalFormat extends NumberFormat {
                 affixPat = isNegative ? negSuffixPattern : posSuffixPattern;
             }
             StringBuffer affixBuf = new StringBuffer();
-            expandAffix(affixPat, null, affixBuf, true);
+            expandAffix(affixPat, null, affixBuf);
             buf.append(affixBuf);
             return affixBuf.length();
         }
@@ -5287,9 +5255,7 @@ public class DecimalFormat extends NumberFormat {
 
         super.setCurrency(theCurrency);
         if (theCurrency != null) {
-            boolean[] isChoiceFormat = new boolean[1];
-            String s = theCurrency.getName(symbols.getULocale(),
-                                           Currency.SYMBOL_NAME, isChoiceFormat);
+            String s = theCurrency.getName(symbols.getULocale(), Currency.SYMBOL_NAME, null);
             symbols.setCurrency(theCurrency);
             symbols.setCurrencySymbol(s);
         }
@@ -5602,6 +5568,7 @@ public class DecimalFormat extends NumberFormat {
     /**
      * Formatter for ChoiceFormat-based currency names. If this field is not null, then
      * delegate to it to format currency symbols.
+     * TODO: This is obsolete: Remove, and design extensible serialization. ICU ticket #12090.
      *
      * @since ICU 2.6
      */
index fe2254c26c0a8cbf2f3fd9ffbabb6ad7db645c6a..e0093e98927b896ce87bbf2c3ef3c9176994273a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *******************************************************************************
- * Copyright (C) 1996-2015, International Business Machines Corporation and    *
- * others. All Rights Reserved.                                                *
+ * Copyright (C) 1996-2016, International Business Machines Corporation and
+ * others. All Rights Reserved.
  *******************************************************************************
  */
 package com.ibm.icu.text;
@@ -9,7 +9,6 @@ package com.ibm.icu.text;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
-import java.text.ChoiceFormat;
 import java.util.Arrays;
 import java.util.Locale;
 import java.util.MissingResourceException;
@@ -966,17 +965,10 @@ public class DecimalFormatSymbols implements Cloneable, Serializable {
         // Obtain currency data from the currency API.  This is strictly
         // for backward compatibility; we don't use DecimalFormatSymbols
         // for currency data anymore.
-        String currname = null;
         currency = Currency.getInstance(locale);
         if (currency != null) {
             intlCurrencySymbol = currency.getCurrencyCode();
-            boolean[] isChoiceFormat = new boolean[1];
-            currname = currency.getName(locale, Currency.SYMBOL_NAME, isChoiceFormat);
-            // If this is a ChoiceFormat currency, then format an
-            // arbitrary value; pick something != 1; more common.
-            currencySymbol = isChoiceFormat[0]
-                ? new ChoiceFormat(currname).format(2.0)
-                : currname;
+            currencySymbol = currency.getName(locale, Currency.SYMBOL_NAME, null);
             CurrencyFormatInfo fmtInfo = info.getFormatInfo(intlCurrencySymbol);
             if (fmtInfo != null) {
                 currencyPattern = fmtInfo.currencyPattern;
index 49260501f8a3beefee05093800f677c8fd82a0df..4ea9324083e9bcb9af926fdf30422f3fd77369c7 100644 (file)
@@ -356,7 +356,8 @@ public final class RelativeDateTimeFormatter {
         return new RelativeDateTimeFormatter(
                 data.qualitativeUnitMap,
                 data.relUnitPatternMap,
-                new MessageFormat(data.dateTimePattern),
+                SimpleFormatterImpl.compileToStringMinMaxArguments(
+                        data.dateTimePattern, new StringBuilder(), 2, 2),
                 PluralRules.forLocale(locale),
                 nf,
                 style,
@@ -492,8 +493,8 @@ public final class RelativeDateTimeFormatter {
      * @stable ICU 53
      */
     public String combineDateAndTime(String relativeDateString, String timeString) {
-        return this.combinedDateAndTime.format(
-            new Object[]{timeString, relativeDateString}, new StringBuffer(), null).toString();
+        return SimpleFormatterImpl.formatCompiledPattern(
+                combinedDateAndTime, timeString, relativeDateString);
     }
 
     /**
@@ -544,7 +545,7 @@ public final class RelativeDateTimeFormatter {
     private RelativeDateTimeFormatter(
             EnumMap<Style, EnumMap<AbsoluteUnit, EnumMap<Direction, String>>> qualitativeUnitMap,
             EnumMap<Style, EnumMap<RelativeUnit, String[][]>> patternMap, 
-            MessageFormat combinedDateAndTime,
+            String combinedDateAndTime,
             PluralRules pluralRules,
             NumberFormat numberFormat,
             Style style,
@@ -601,7 +602,7 @@ public final class RelativeDateTimeFormatter {
     private final EnumMap<Style, EnumMap<AbsoluteUnit, EnumMap<Direction, String>>> qualitativeUnitMap;
     private final EnumMap<Style, EnumMap<RelativeUnit, String[][]>> patternMap;
 
-    private final MessageFormat combinedDateAndTime;
+    private final String combinedDateAndTime;  // compiled SimpleFormatter pattern
     private final PluralRules pluralRules;
     private final NumberFormat numberFormat;
 
index 0ea71278a9cba4552d4aa059698cc4ce568e59bc..cd0d9ff109da48928ae3f91db9fee12ac51f781e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 1996-2015, International Business Machines Corporation and
+ * Copyright (C) 1996-2016, International Business Machines Corporation and
  * others. All Rights Reserved.
  *******************************************************************************
  */
@@ -28,6 +28,7 @@ import com.ibm.icu.impl.DateNumberFormat;
 import com.ibm.icu.impl.ICUCache;
 import com.ibm.icu.impl.PatternProps;
 import com.ibm.icu.impl.SimpleCache;
+import com.ibm.icu.impl.SimpleFormatterImpl;
 import com.ibm.icu.lang.UCharacter;
 import com.ibm.icu.text.TimeZoneFormat.Style;
 import com.ibm.icu.text.TimeZoneFormat.TimeType;
@@ -1181,8 +1182,9 @@ public class SimpleDateFormat extends DateFormat {
                 {
                     glueIndex += (SHORT + 1);
                 }
-                cachedDefaultPattern = MessageFormat.format(dateTimePatterns[glueIndex],
-                        new Object[] {dateTimePatterns[SHORT], dateTimePatterns[SHORT + 4]});
+                cachedDefaultPattern = SimpleFormatterImpl.formatRawPattern(
+                        dateTimePatterns[glueIndex], 2, 2,
+                        dateTimePatterns[SHORT], dateTimePatterns[SHORT + 4]);
             } catch (MissingResourceException e) {
                 cachedDefaultPattern = FALLBACKPATTERN;
             }
@@ -1919,7 +1921,8 @@ public class SimpleDateFormat extends DateFormat {
             if (monthPattern == null) {
                 appendTo.append(array[value]);
             } else {
-                appendTo.append(MessageFormat.format(monthPattern, array[value]));
+                String s = SimpleFormatterImpl.formatRawPattern(monthPattern, 1, 1, array[value]);
+                appendTo.append(s);
             }
         }
     }
@@ -2684,7 +2687,8 @@ public class SimpleDateFormat extends DateFormat {
                         isLeapMonth = 0;
                     }
                 if (monthPattern != null) {
-                    String leapMonthName = MessageFormat.format(monthPattern, data[i]);
+                    String leapMonthName = SimpleFormatterImpl.formatRawPattern(
+                            monthPattern, 1, 1, data[i]);
                     length = leapMonthName.length();
                     if (length > bestMatchLength &&
                         (matchLength = regionMatchesWithOptionalDot(text, start, leapMonthName, length)) >= 0)
index 93329747c388f03dda56f311192c3b97e2a91979..2eabb5d6d389655a6ace0a7c56c41b1e87ec2532 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *   Copyright (C) 1996-2015, International Business Machines
+ *   Copyright (C) 1996-2016, International Business Machines
  *   Corporation and others.  All Rights Reserved.
  */
 
@@ -20,10 +20,10 @@ import com.ibm.icu.impl.CalendarUtil;
 import com.ibm.icu.impl.ICUCache;
 import com.ibm.icu.impl.ICUResourceBundle;
 import com.ibm.icu.impl.SimpleCache;
+import com.ibm.icu.impl.SimpleFormatterImpl;
 import com.ibm.icu.impl.SoftCache;
 import com.ibm.icu.text.DateFormat;
 import com.ibm.icu.text.DateFormatSymbols;
-import com.ibm.icu.text.MessageFormat;
 import com.ibm.icu.text.SimpleDateFormat;
 import com.ibm.icu.util.ULocale.Category;
 
@@ -3555,9 +3555,10 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable<Ca
         // Resolve a pattern for the date/time style
         String pattern = null;
         if ((timeStyle >= 0) && (dateStyle >= 0)) {
-            pattern = MessageFormat.format(patternData.getDateTimePattern(dateStyle),
-                    new Object[] {patternData.patterns[timeStyle],
-                patternData.patterns[dateStyle + 4]});
+            pattern = SimpleFormatterImpl.formatRawPattern(
+                    patternData.getDateTimePattern(dateStyle), 2, 2,
+                    patternData.patterns[timeStyle],
+                    patternData.patterns[dateStyle + 4]);
             // Might need to merge the overrides from the date and time into a single
             // override string TODO: Right now we are forcing the date's override into the
             // time style.
index c731af7033620514040f087c81816d1ef8c0631c..7ded29da0525388b0756263befa93b37d00a8392 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *******************************************************************************
- * Copyright (C) 2006-2015, Google, International Business Machines Corporation *
- * and others. All Rights Reserved.                                            *
+ * Copyright (C) 2006-2016, Google, International Business Machines Corporation
+ * and others. All Rights Reserved.
  *******************************************************************************
  */
 
@@ -866,24 +866,23 @@ public class DateTimeGeneratorTest extends TestFmwk {
        */
       public void TestGetRedundants(){
           DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance();
-          
+
           // Tests when "if (output == null)" is true
           try{
               dtpg.getRedundants(null);
           } catch(Exception e){
-              errln("DateTimeGenerator.getRedundants was not suppose to return " +
-                      "an exception when passing a null parameter.");
+              errln("DateTimeGenerator.getRedundants was not supposed to return " +
+                      "an exception when passing a null parameter: " + e);
           }
-          
+
           // Tests when "if (output == null)" is false
           try{
               Collection<String> out = new LinkedHashSet<String>();
               dtpg.getRedundants(out);
           } catch(Exception e){
-              errln("DateTimeGenerator.getRedundants was not suppose to return " +
-                  "an exception when passing a new LinkedHashSet<String>() parameter.");
+              errln("DateTimeGenerator.getRedundants was not supposed to return " +
+                  "an exception when passing a new LinkedHashSet<String>() parameter: " + e);
           }
-          
       }
       
       /* Tests the method