Home » openjdk-7 » sun » util » resources » [javadoc | source]

    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   }

Home » openjdk-7 » sun » util » resources » [javadoc | source]