diff --git a/src/java.base/share/classes/java/util/spi/LocaleServiceProvider.java b/src/java.base/share/classes/java/util/spi/LocaleServiceProvider.java
index fd55a80cd0f..5d443963bef 100644
--- a/src/java.base/share/classes/java/util/spi/LocaleServiceProvider.java
+++ b/src/java.base/share/classes/java/util/spi/LocaleServiceProvider.java
@@ -120,18 +120,19 @@ import java.util.Locale;
* property on the java launcher command line. Setting it at runtime with
* {@link System#setProperty(String, String)} is discouraged and it may not affect
* the order.
- *
- * Java Runtime Environment provides the following four locale providers:
+ * JDK Reference Implementation provides the following four
+ * locale providers:
*
* - "CLDR": A provider based on Unicode Consortium's
* CLDR Project.
*
- "COMPAT": represents the locale sensitive services that is compatible
- * with the prior JDK releases up to JDK8 (same as JDK8's "JRE").
+ * with the prior JDK releases up to JDK 8 (same as JDK 8's "JRE"). This
+ * provider is deprecated and will be removed in the future release of JDK.
*
- "SPI": represents the locale sensitive services implementing the subclasses of
* this {@code LocaleServiceProvider} class.
*
- "HOST": A provider that reflects the user's custom settings in the
* underlying operating system. This provider may not be available, depending
- * on the Java Runtime Environment implementation.
+ * on the JDK Reference Implementation.
*
- "JRE": represents a synonym to "COMPAT". This name
* is deprecated and will be removed in the future release of JDK.
*
diff --git a/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java b/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java
index beb2acce51e..87ff39b9156 100644
--- a/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java
+++ b/src/java.base/share/classes/sun/util/locale/provider/LocaleProviderAdapter.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023, 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
@@ -33,7 +33,6 @@ import java.text.spi.DateFormatSymbolsProvider;
import java.text.spi.DecimalFormatSymbolsProvider;
import java.text.spi.NumberFormatProvider;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
@@ -125,13 +124,15 @@ public abstract class LocaleProviderAdapter {
String order = GetPropertyAction.privilegedGetProperty("java.locale.providers");
ArrayList typeList = new ArrayList<>();
String invalidTypeMessage = null;
+ String compatWarningMessage = null;
// Check user specified adapter preference
if (order != null && !order.isEmpty()) {
String[] types = order.split(",");
for (String type : types) {
type = type.trim().toUpperCase(Locale.ROOT);
- if (type.equals("COMPAT")) {
+ if (type.equals("COMPAT") || type.equals("JRE")) {
+ compatWarningMessage = "COMPAT locale provider will be removed in a future release";
type = "JRE";
}
try {
@@ -169,6 +170,10 @@ public abstract class LocaleProviderAdapter {
getLogger(LocaleProviderAdapter.class.getCanonicalName())
.log(Logger.Level.INFO, invalidTypeMessage);
}
+ if (compatWarningMessage != null) {
+ getLogger(LocaleProviderAdapter.class.getCanonicalName())
+ .log(Logger.Level.WARNING, compatWarningMessage);
+ }
}
/**
diff --git a/test/jdk/java/util/Locale/CompatWarning.java b/test/jdk/java/util/Locale/CompatWarning.java
new file mode 100644
index 00000000000..4e24c8ebff4
--- /dev/null
+++ b/test/jdk/java/util/Locale/CompatWarning.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2023, 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.
+ *
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8304982
+ * @summary Check if a warning is logged with COMPAT locale provider
+ * @run main/othervm -Djava.locale.providers=COMPAT CompatWarning
+ * @run main/othervm -Djava.locale.providers=JRE CompatWarning
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+public class CompatWarning {
+ private static final String WARNING =
+ "COMPAT locale provider will be removed in a future release";
+ private static boolean logged;
+
+ public static void main(String[] args) throws Throwable {
+ File conf = new File(System.getProperty("test.src", "./src"), "compatlog.properties");
+ if (!conf.canRead()) {
+ throw new IOException("Can't read config file: " + conf.getAbsolutePath());
+ }
+ System.setProperty("java.util.logging.config.file", conf.getAbsolutePath());
+ DateFormat.getInstance();
+ if (!logged) {
+ throw new RuntimeException("COMPAT warning message was not emitted");
+ }
+ }
+
+ public static class CheckWarning extends Handler {
+ @Override
+ public void publish(LogRecord record) {
+ var level = record.getLevel();
+ var msg = record.getMessage();
+ System.out.printf("""
+ LogRecord emitted:
+ Level: %s
+ Message: %s
+ """, level, msg);
+ if (level == Level.WARNING && WARNING.equals(msg)) {
+ logged = true;
+ }
+ }
+
+ @Override
+ public void flush() {}
+ @Override
+ public void close() throws SecurityException {}
+ }
+}
diff --git a/test/jdk/java/util/Locale/compatlog.properties b/test/jdk/java/util/Locale/compatlog.properties
new file mode 100644
index 00000000000..85c5c612555
--- /dev/null
+++ b/test/jdk/java/util/Locale/compatlog.properties
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2023, 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.
+#
+# 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.
+#
+
+handlers=CompatWarning$CheckWarning