OpenJDK / jdk / jdk
changeset 47011:9eba50796e72
8171049: Era.getDisplayName doesn't work with non-IsoChronology
Reviewed-by: rriggs
author | naoto |
---|---|
date | Mon, 28 Aug 2017 10:16:33 -0700 |
parents | d8dd5c878ce5 |
children | 6bd886e01c78 |
files | jdk/src/java.base/share/classes/java/time/chrono/HijrahEra.java jdk/src/java.base/share/classes/java/time/chrono/JapaneseEra.java jdk/src/java.base/share/classes/java/time/chrono/MinguoEra.java jdk/src/java.base/share/classes/java/time/chrono/ThaiBuddhistEra.java jdk/test/java/time/test/java/time/chrono/TestEraDisplayName.java |
diffstat | 5 files changed, 203 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/jdk/src/java.base/share/classes/java/time/chrono/HijrahEra.java Fri Aug 25 10:52:17 2017 -0700 +++ b/jdk/src/java.base/share/classes/java/time/chrono/HijrahEra.java Mon Aug 28 10:16:33 2017 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -64,10 +64,13 @@ import static java.time.temporal.ChronoField.ERA; import java.time.DateTimeException; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.TextStyle; import java.time.temporal.ChronoField; import java.time.temporal.TemporalField; import java.time.temporal.UnsupportedTemporalTypeException; import java.time.temporal.ValueRange; +import java.util.Locale; /** * An era in the Hijrah calendar system. @@ -155,4 +158,18 @@ return Era.super.range(field); } + /** + * {@inheritDoc} + * + * @param style {@inheritDoc} + * @param locale {@inheritDoc} + */ + @Override + public String getDisplayName(TextStyle style, Locale locale) { + return new DateTimeFormatterBuilder() + .appendText(ERA, style) + .toFormatter(locale) + .withChronology(HijrahChronology.INSTANCE) + .format(HijrahDate.now()); + } }
--- a/jdk/src/java.base/share/classes/java/time/chrono/JapaneseEra.java Fri Aug 25 10:52:17 2017 -0700 +++ b/jdk/src/java.base/share/classes/java/time/chrono/JapaneseEra.java Mon Aug 28 10:16:33 2017 -0700 @@ -73,6 +73,7 @@ import java.io.Serializable; import java.time.DateTimeException; import java.time.LocalDate; +import java.time.format.DateTimeFormatterBuilder; import java.time.format.TextStyle; import java.time.temporal.ChronoField; import java.time.temporal.TemporalField; @@ -253,7 +254,12 @@ Objects.requireNonNull(locale, "locale"); return style.asNormal() == TextStyle.NARROW ? getAbbreviation() : getName(); } - return Era.super.getDisplayName(style, locale); + + return new DateTimeFormatterBuilder() + .appendText(ERA, style) + .toFormatter(locale) + .withChronology(JapaneseChronology.INSTANCE) + .format(this == MEIJI ? MEIJI_6_ISODATE : since); } //-----------------------------------------------------------------------
--- a/jdk/src/java.base/share/classes/java/time/chrono/MinguoEra.java Fri Aug 25 10:52:17 2017 -0700 +++ b/jdk/src/java.base/share/classes/java/time/chrono/MinguoEra.java Mon Aug 28 10:16:33 2017 -0700 @@ -61,7 +61,12 @@ */ package java.time.chrono; +import static java.time.temporal.ChronoField.ERA; + import java.time.DateTimeException; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.TextStyle; +import java.util.Locale; /** * An era in the Minguo calendar system. @@ -153,4 +158,19 @@ return ordinal(); } + /** + * {@inheritDoc} + * + * @param style {@inheritDoc} + * @param locale {@inheritDoc} + */ + @Override + public String getDisplayName(TextStyle style, Locale locale) { + return new DateTimeFormatterBuilder() + .appendText(ERA, style) + .toFormatter(locale) + .withChronology(MinguoChronology.INSTANCE) + .format(this == ROC ? MinguoDate.of(1, 1, 1) : MinguoDate.of(0, 1, 1)); + } + }
--- a/jdk/src/java.base/share/classes/java/time/chrono/ThaiBuddhistEra.java Fri Aug 25 10:52:17 2017 -0700 +++ b/jdk/src/java.base/share/classes/java/time/chrono/ThaiBuddhistEra.java Mon Aug 28 10:16:33 2017 -0700 @@ -61,7 +61,12 @@ */ package java.time.chrono; +import static java.time.temporal.ChronoField.ERA; + import java.time.DateTimeException; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.TextStyle; +import java.util.Locale; /** * An era in the Thai Buddhist calendar system. @@ -153,4 +158,19 @@ return ordinal(); } + /** + * {@inheritDoc} + * + * @param style {@inheritDoc} + * @param locale {@inheritDoc} + */ + @Override + public String getDisplayName(TextStyle style, Locale locale) { + return new DateTimeFormatterBuilder() + .appendText(ERA, style) + .toFormatter(locale) + .withChronology(ThaiBuddhistChronology.INSTANCE) + .format(this == BE ? ThaiBuddhistDate.of(1, 1, 1) : ThaiBuddhistDate.of(0, 1, 1)); + } + }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/time/test/java/time/chrono/TestEraDisplayName.java Mon Aug 28 10:16:33 2017 -0700 @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package test.java.time.chrono; + +import java.time.*; +import java.time.chrono.*; +import java.time.format.*; +import java.util.Locale; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import static org.testng.Assert.assertEquals; + +/** + * Tests Era.getDisplayName() correctly returns the name based on each + * chrono implementation. + * Note: The exact result may depend on locale data provider's implementation. + * + * @bug 8171049 + */ +@Test +public class TestEraDisplayName { + private static final Locale THAI = Locale.forLanguageTag("th-TH"); + private static final Locale EGYPT = Locale.forLanguageTag("ar-EG"); + + @DataProvider(name="eraDisplayName") + Object[][] eraDisplayName() { + return new Object[][] { + // Era, text style, displyay locale, expected name + // IsoEra + { IsoEra.BCE, TextStyle.FULL, Locale.US, "Before Christ" }, + { IsoEra.CE, TextStyle.FULL, Locale.US, "Anno Domini" }, + { IsoEra.BCE, TextStyle.FULL, Locale.JAPAN, "\u7d00\u5143\u524d" }, + { IsoEra.CE, TextStyle.FULL, Locale.JAPAN, "\u897f\u66a6" }, + { IsoEra.BCE, TextStyle.SHORT, Locale.US, "BC" }, + { IsoEra.CE, TextStyle.SHORT, Locale.US, "AD" }, + { IsoEra.BCE, TextStyle.SHORT, Locale.JAPAN, "\u7d00\u5143\u524d" }, + { IsoEra.CE, TextStyle.SHORT, Locale.JAPAN, "\u897f\u66a6" }, + { IsoEra.BCE, TextStyle.NARROW, Locale.US, "B" }, + { IsoEra.CE, TextStyle.NARROW, Locale.US, "A" }, + { IsoEra.BCE, TextStyle.NARROW, Locale.JAPAN, "BC" }, + { IsoEra.CE, TextStyle.NARROW, Locale.JAPAN, "AD" }, + + // JapaneseEra + { JapaneseEra.MEIJI, TextStyle.FULL, Locale.US, "Meiji" }, + { JapaneseEra.TAISHO, TextStyle.FULL, Locale.US, "Taisho" }, + { JapaneseEra.SHOWA, TextStyle.FULL, Locale.US, "Showa" }, + { JapaneseEra.HEISEI, TextStyle.FULL, Locale.US, "Heisei" }, + { JapaneseEra.MEIJI, TextStyle.FULL, Locale.JAPAN, "\u660e\u6cbb" }, + { JapaneseEra.TAISHO, TextStyle.FULL, Locale.JAPAN, "\u5927\u6b63" }, + { JapaneseEra.SHOWA, TextStyle.FULL, Locale.JAPAN, "\u662d\u548c" }, + { JapaneseEra.HEISEI, TextStyle.FULL, Locale.JAPAN, "\u5e73\u6210" }, + { JapaneseEra.MEIJI, TextStyle.SHORT, Locale.US, "Meiji" }, + { JapaneseEra.TAISHO, TextStyle.SHORT, Locale.US, "Taisho" }, + { JapaneseEra.SHOWA, TextStyle.SHORT, Locale.US, "Showa" }, + { JapaneseEra.HEISEI, TextStyle.SHORT, Locale.US, "Heisei" }, + { JapaneseEra.MEIJI, TextStyle.SHORT, Locale.JAPAN, "\u660e\u6cbb" }, + { JapaneseEra.TAISHO, TextStyle.SHORT, Locale.JAPAN, "\u5927\u6b63" }, + { JapaneseEra.SHOWA, TextStyle.SHORT, Locale.JAPAN, "\u662d\u548c" }, + { JapaneseEra.HEISEI, TextStyle.SHORT, Locale.JAPAN, "\u5e73\u6210" }, + { JapaneseEra.MEIJI, TextStyle.NARROW, Locale.US, "M" }, + { JapaneseEra.TAISHO, TextStyle.NARROW, Locale.US, "T" }, + { JapaneseEra.SHOWA, TextStyle.NARROW, Locale.US, "S" }, + { JapaneseEra.HEISEI, TextStyle.NARROW, Locale.US, "H" }, + { JapaneseEra.MEIJI, TextStyle.NARROW, Locale.JAPAN, "M" }, + { JapaneseEra.TAISHO, TextStyle.NARROW, Locale.JAPAN, "T" }, + { JapaneseEra.SHOWA, TextStyle.NARROW, Locale.JAPAN, "S" }, + { JapaneseEra.HEISEI, TextStyle.NARROW, Locale.JAPAN, "H" }, + + // ThaiBuddhistEra + { ThaiBuddhistEra.BEFORE_BE, TextStyle.FULL, Locale.US, "BC" }, + { ThaiBuddhistEra.BE, TextStyle.FULL, Locale.US, "BE" }, + { ThaiBuddhistEra.BEFORE_BE, TextStyle.FULL, THAI, "BC" }, + { ThaiBuddhistEra.BE, TextStyle.FULL, THAI, + "\u0e1e\u0e38\u0e17\u0e18\u0e28\u0e31\u0e01\u0e23\u0e32\u0e0a" }, + { ThaiBuddhistEra.BEFORE_BE, TextStyle.SHORT, Locale.US, "BC" }, + { ThaiBuddhistEra.BE, TextStyle.SHORT, Locale.US, "BE" }, + { ThaiBuddhistEra.BEFORE_BE, TextStyle.SHORT, THAI, + "\u0e1b\u0e35\u0e01\u0e48\u0e2d\u0e19\u0e04\u0e23\u0e34\u0e2a" + + "\u0e15\u0e4c\u0e01\u0e32\u0e25\u0e17\u0e35\u0e48" }, + { ThaiBuddhistEra.BE, TextStyle.SHORT, THAI, "\u0e1e.\u0e28." }, + { ThaiBuddhistEra.BEFORE_BE, TextStyle.NARROW, Locale.US, "BC" }, + { ThaiBuddhistEra.BE, TextStyle.NARROW, Locale.US, "BE" }, + { ThaiBuddhistEra.BEFORE_BE, TextStyle.NARROW, THAI, "BC" }, + { ThaiBuddhistEra.BE, TextStyle.NARROW, THAI, "\u0e1e.\u0e28." }, + + // MinguoEra + { MinguoEra.BEFORE_ROC, TextStyle.FULL, Locale.US, "Before R.O.C." }, + { MinguoEra.ROC, TextStyle.FULL, Locale.US, "Minguo" }, + { MinguoEra.BEFORE_ROC, TextStyle.FULL, Locale.TAIWAN, "\u6c11\u570b\u524d" }, + { MinguoEra.ROC, TextStyle.FULL, Locale.TAIWAN, "\u6c11\u570b" }, + { MinguoEra.BEFORE_ROC, TextStyle.SHORT, Locale.US, "Before R.O.C." }, + { MinguoEra.ROC, TextStyle.SHORT, Locale.US, "Minguo" }, + { MinguoEra.BEFORE_ROC, TextStyle.SHORT, Locale.TAIWAN, "\u6c11\u570b\u524d" }, + { MinguoEra.ROC, TextStyle.SHORT, Locale.TAIWAN, "\u6c11\u570b" }, + { MinguoEra.BEFORE_ROC, TextStyle.NARROW, Locale.US, "Before R.O.C." }, + { MinguoEra.ROC, TextStyle.NARROW, Locale.US, "Minguo" }, + { MinguoEra.BEFORE_ROC, TextStyle.NARROW, Locale.TAIWAN, "\u6c11\u570b\u524d" }, + { MinguoEra.ROC, TextStyle.NARROW, Locale.TAIWAN, "\u6c11\u570b" }, + + // HijrahEra + { HijrahEra.AH, TextStyle.FULL, Locale.US, "AH" }, + { HijrahEra.AH, TextStyle.FULL, EGYPT, "\u0647\u0640" }, + { HijrahEra.AH, TextStyle.SHORT, Locale.US, "AH" }, + { HijrahEra.AH, TextStyle.SHORT, EGYPT, "\u0647\u0640" }, + { HijrahEra.AH, TextStyle.NARROW, Locale.US, "AH" }, + { HijrahEra.AH, TextStyle.NARROW, EGYPT, "\u0647\u0640" }, + }; + } + + @Test(dataProvider="eraDisplayName") + public void test_eraDisplayName(Era era, TextStyle style, Locale locale, String expected) { + assertEquals(era.getDisplayName(style, locale), expected); + } +}