History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/util/resources/LocaleData.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/util/resources/LocaleData.java+286−0
@@ -0,0 +1,286 @@
1+/*
2+ * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
3+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+ *
5+ * This code is free software; you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 2 only, as
7+ * published by the Free Software Foundation. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle in the LICENSE file that accompanied this code.
10+ *
11+ * This code is distributed in the hope that it will be useful, but WITHOUT
12+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+ * version 2 for more details (a copy is included in the LICENSE file that
15+ * accompanied this code).
16+ *
17+ * You should have received a copy of the GNU General Public License version
18+ * 2 along with this work; if not, write to the Free Software Foundation,
19+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+ *
21+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+
26+/*
27+ * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
28+ * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
29+ *
30+ * The original version of this source code and documentation
31+ * is copyrighted and owned by Taligent, Inc., a wholly-owned
32+ * subsidiary of IBM. These materials are provided under terms
33+ * of a License Agreement between Taligent and Sun. This technology
34+ * is protected by multiple US and International patents.
35+ *
36+ * This notice and attribution to Taligent may not be removed.
37+ * Taligent is a registered trademark of Taligent, Inc.
38+ *
39+ */
40+
41+package sun.util.resources;
42+
43+import java.io.File;
44+import java.security.AccessController;
45+import java.security.PrivilegedAction;
46+import java.util.Iterator;
47+import java.util.List;
48+import java.util.Locale;
49+import java.util.ResourceBundle;
50+import java.util.StringTokenizer;
51+
52+import sun.util.LocaleDataMetaInfo;
53+
54+/**
55+ * Provides information about and access to resource bundles in the
56+ * sun.text.resources and sun.util.resources package.
57+ *
58+ * @author Asmus Freytag
59+ * @author Mark Davis
60+ */
61+
62+public class LocaleData {
63+
64+ private static final String localeDataJarName = "localedata.jar";
65+
66+ /**
67+ * Lazy load available locales.
68+ */
69+ private static class AvailableLocales {
70+ static final Locale[] localeList = createLocaleList();
71+ }
72+
73+ /**
74+ * Returns a list of the installed locales. Currently, this simply returns
75+ * the list of locales for which a sun.text.resources.FormatData bundle
76+ * exists. This bundle family happens to be the one with the broadest
77+ * locale coverage in the JRE.
78+ */
79+ public static Locale[] getAvailableLocales() {
80+ return AvailableLocales.localeList.clone();
81+ }
82+
83+ /**
84+ * Gets a calendar data resource bundle, using privileges
85+ * to allow accessing a sun.* package.
86+ */
87+ public static ResourceBundle getCalendarData(Locale locale) {
88+ return getBundle("sun.util.resources.CalendarData", locale);
89+ }
90+
91+ /**
92+ * Gets a currency names resource bundle, using privileges
93+ * to allow accessing a sun.* package.
94+ */
95+ public static OpenListResourceBundle getCurrencyNames(Locale locale) {
96+ return (OpenListResourceBundle)getBundle("sun.util.resources.CurrencyNames", locale);
97+ }
98+
99+ /**
100+ * Gets a locale names resource bundle, using privileges
101+ * to allow accessing a sun.* package.
102+ */
103+ public static OpenListResourceBundle getLocaleNames(Locale locale) {
104+ return (OpenListResourceBundle)getBundle("sun.util.resources.LocaleNames", locale);
105+ }
106+
107+ /**
108+ * Gets a time zone names resource bundle, using privileges
109+ * to allow accessing a sun.* package.
110+ */
111+ public static OpenListResourceBundle getTimeZoneNames(Locale locale) {
112+ return (OpenListResourceBundle)getBundle("sun.util.resources.TimeZoneNames", locale);
113+ }
114+
115+ /**
116+ * Gets a collation data resource bundle, using privileges
117+ * to allow accessing a sun.* package.
118+ */
119+ public static ResourceBundle getCollationData(Locale locale) {
120+ return getBundle("sun.text.resources.CollationData", locale);
121+ }
122+
123+ /**
124+ * Gets a date format data resource bundle, using privileges
125+ * to allow accessing a sun.* package.
126+ */
127+ public static ResourceBundle getDateFormatData(Locale locale) {
128+ return getBundle("sun.text.resources.FormatData", locale);
129+ }
130+
131+ /**
132+ * Gets a number format data resource bundle, using privileges
133+ * to allow accessing a sun.* package.
134+ */
135+ public static ResourceBundle getNumberFormatData(Locale locale) {
136+ return getBundle("sun.text.resources.FormatData", locale);
137+ }
138+
139+ private static ResourceBundle getBundle(final String baseName, final Locale locale) {
140+ return (ResourceBundle) AccessController.doPrivileged(new PrivilegedAction() {
141+ public Object run() {
142+ return ResourceBundle.
143+ getBundle(baseName, locale,
144+ LocaleDataResourceBundleControl.getRBControlInstance());
145+ }
146+ });
147+ }
148+
149+ static class LocaleDataResourceBundleControl extends ResourceBundle.Control {
150+ /* Singlton instance of ResourceBundle.Control. */
151+ private static LocaleDataResourceBundleControl rbControlInstance =
152+ new LocaleDataResourceBundleControl();
153+
154+ public static LocaleDataResourceBundleControl getRBControlInstance() {
155+ return rbControlInstance;
156+ }
157+
158+ /*
159+ * This method overrides the default implementation to search
160+ * from a prebaked locale string list to determin the candidate
161+ * locale list.
162+ *
163+ * @param baseName the resource bundle base name.
164+ * locale the requested locale for the resource bundle.
165+ * @returns a list of candidate locales to search from.
166+ * @exception NullPointerException if baseName or locale is null.
167+ */
168+ @Override
169+ public List<Locale> getCandidateLocales(String baseName, Locale locale) {
170+ List<Locale> candidates = super.getCandidateLocales(baseName, locale);
171+ /* Get the locale string list from LocaleDataMetaInfo class. */
172+ String localeString = LocaleDataMetaInfo.getSupportedLocaleString(baseName);
173+
174+ if (localeString.length() == 0) {
175+ return candidates;
176+ }
177+
178+ for (Iterator<Locale> l = candidates.iterator(); l.hasNext(); ) {
179+ Locale loc = l.next();
180+ String lstr = null;
181+ if (loc.getScript().length() > 0) {
182+ lstr = loc.toLanguageTag().replace('-', '_');
183+ } else {
184+ lstr = loc.toString();
185+ int idx = lstr.indexOf("_#");
186+ if (idx >= 0) {
187+ lstr = lstr.substring(0, idx);
188+ }
189+ }
190+ /* Every locale string in the locale string list returned from
191+ the above getSupportedLocaleString is enclosed
192+ within two white spaces so that we could check some locale
193+ such as "en".
194+ */
195+ if (lstr.length() != 0 && localeString.indexOf(" " + lstr + " ") == -1) {
196+ l.remove();
197+ }
198+ }
199+ return candidates;
200+ }
201+
202+ /*
203+ * Overrides "getFallbackLocale" to return null so
204+ * that the fallback locale will be null.
205+ * @param baseName the resource bundle base name.
206+ * locale the requested locale for the resource bundle.
207+ * @return null for the fallback locale.
208+ * @exception NullPointerException if baseName or locale is null.
209+ */
210+ @Override
211+ public Locale getFallbackLocale(String baseName, Locale locale) {
212+ if (baseName == null || locale == null) {
213+ throw new NullPointerException();
214+ }
215+ return null;
216+ }
217+ }
218+
219+ /*
220+ * Returns true if the non European resources jar file exists in jre
221+ * extension directory.
222+ * @returns true if the jar file is there. Otherwise, returns false.
223+ */
224+ private static boolean isNonEuroLangSupported() {
225+ final String sep = File.separator;
226+ String localeDataJar =
227+ java.security.AccessController.doPrivileged(
228+ new sun.security.action.GetPropertyAction("java.home")) +
229+ sep + "lib" + sep + "ext" + sep + localeDataJarName;
230+
231+ /* Peek at the installed extension directory to see if
232+ localedata.jar is installed or not.
233+ */
234+ final File f = new File(localeDataJar);
235+ boolean isNonEuroResJarExist =
236+ AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
237+ public Boolean run() {
238+ return Boolean.valueOf(f.exists());
239+ }
240+ }).booleanValue();
241+
242+ return isNonEuroResJarExist;
243+ }
244+
245+ /*
246+ * This method gets the locale string list from LocaleDataMetaInfo class and
247+ * then contructs the Locale array based on the locale string returned above.
248+ * @returns the Locale array for the supported locale of JRE.
249+ *
250+ */
251+ private static Locale[] createLocaleList() {
252+ String supportedLocaleString = LocaleDataMetaInfo.
253+ getSupportedLocaleString("sun.text.resources.FormatData");
254+
255+ if (supportedLocaleString.length() == 0) {
256+ return null;
257+ }
258+
259+ /* Look for "|" and construct a new locale string list. */
260+ int barIndex = supportedLocaleString.indexOf("|");
261+ StringTokenizer localeStringTokenizer = null;
262+ if (isNonEuroLangSupported()) {
263+ localeStringTokenizer = new
264+ StringTokenizer(supportedLocaleString.substring(0, barIndex) +
265+ supportedLocaleString.substring(barIndex + 1));
266+ } else {
267+ localeStringTokenizer = new
268+ StringTokenizer(supportedLocaleString.substring(0, barIndex));
269+ }
270+
271+ Locale[] locales = new Locale[localeStringTokenizer.countTokens()];
272+ for (int i = 0; i < locales.length; i++) {
273+ String currentToken = localeStringTokenizer.nextToken().replace('_','-');
274+ if (currentToken.equals("ja-JP-JP")) {
275+ currentToken = "ja-JP-u-ca-japanese-x-lvariant-JP";
276+ } else if (currentToken.equals("th-TH-TH")) {
277+ currentToken = "th-TH-u-nu-thai-x-lvariant-TH";
278+ } else if (currentToken.equals("no-NO-NY")) {
279+ currentToken = "no-NO-x-lvariant-NY";
280+ }
281+ locales[i] = Locale.forLanguageTag(currentToken);
282+ }
283+ return locales;
284+ }
285+
286+}