115 String order = AccessController.doPrivileged( 116 new sun.security.action.GetPropertyAction("java.locale.providers")); 117 // Override adapterPreference with the properties one 118 if (order != null && order.length() != 0) { 119 String[] types = order.split(","); 120 List<Type> typeList = new ArrayList<>(); 121 for (String type : types) { 122 try { 123 Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT)); 124 125 // load adapter if necessary 126 switch (aType) { 127 case CLDR: 128 cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter(); 129 break; 130 case HOST: 131 hostLocaleProviderAdapter = new HostLocaleProviderAdapter(); 132 break; 133 } 134 typeList.add(aType); 135 } catch (// could be caused by the user specifying wrong 136 // provider name or format in the system property 137 IllegalArgumentException | 138 UnsupportedOperationException e) { 139 LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString()); 140 } 141 } 142 143 if (!typeList.contains(Type.JRE)) { 144 // Append JRE as the last resort. 145 typeList.add(Type.JRE); 146 } 147 adapterPreference = typeList.toArray(new Type[0]); 148 } 149 } 150 151 152 /** 153 * Returns the singleton instance for each adapter type 154 */ 155 public static LocaleProviderAdapter forType(Type type) { 156 switch (type) { 157 case JRE: 158 return jreLocaleProviderAdapter; 159 case CLDR: 160 return cldrLocaleProviderAdapter; 161 case SPI: 162 return spiLocaleProviderAdapter; 163 case HOST: 164 return hostLocaleProviderAdapter; 165 default: 166 throw new InternalError("unknown locale data adapter type"); 167 } 168 } 169 170 public static LocaleProviderAdapter forJRE() { 171 return jreLocaleProviderAdapter; 172 } 173 174 public static LocaleProviderAdapter getResourceBundleBased() { 175 for (Type type : getAdapterPreference()) { 176 if (type == Type.JRE || type == Type.CLDR) { 177 return forType(type); 178 } 179 } 180 // Shouldn't happen. 181 throw new InternalError(); 182 } 183 /** 184 * Returns the preference order of LocaleProviderAdapter.Type 185 */ 186 public static Type[] getAdapterPreference() { 187 return adapterPreference; 188 } 189 190 /** 191 * Returns a LocaleProviderAdapter for the given locale service provider that 192 * best matches the given locale. This method returns the LocaleProviderAdapter 193 * for JRE if none is found for the given locale. 194 * 195 * @param providerClass the class for the locale service provider 196 * @param locale the desired locale. 197 * @return a LocaleProviderAdapter 198 */ 199 public static LocaleProviderAdapter getAdapter(Class<? extends LocaleServiceProvider> providerClass, 200 Locale locale) { 201 // Fast look-up for the given locale 202 LocaleProviderAdapter adapter = findAdapter(providerClass, locale); 203 if (adapter != null) { 204 return adapter; 205 } 206 207 // Try finding an adapter in the normal candidate locales path of the given locale. 208 List<Locale> lookupLocales = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT) 209 .getCandidateLocales("", locale); 210 for (Locale loc : lookupLocales) { 211 if (loc.equals(locale)) { 212 // We've already done with this loc. 213 continue; | 115 String order = AccessController.doPrivileged( 116 new sun.security.action.GetPropertyAction("java.locale.providers")); 117 // Override adapterPreference with the properties one 118 if (order != null && order.length() != 0) { 119 String[] types = order.split(","); 120 List<Type> typeList = new ArrayList<>(); 121 for (String type : types) { 122 try { 123 Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT)); 124 125 // load adapter if necessary 126 switch (aType) { 127 case CLDR: 128 cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter(); 129 break; 130 case HOST: 131 hostLocaleProviderAdapter = new HostLocaleProviderAdapter(); 132 break; 133 } 134 typeList.add(aType); 135 } catch (IllegalArgumentException | 136 UnsupportedOperationException e) { 137 // could be caused by the user specifying wrong 138 // provider name or format in the system property 139 LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString()); 140 } 141 } 142 adapterPreference = typeList.toArray(new Type[0]); 143 } 144 } 145 146 147 /** 148 * Returns the singleton instance for each adapter type 149 */ 150 public static LocaleProviderAdapter forType(Type type) { 151 switch (type) { 152 case JRE: 153 return jreLocaleProviderAdapter; 154 case CLDR: 155 return cldrLocaleProviderAdapter; 156 case SPI: 157 return spiLocaleProviderAdapter; 158 case HOST: 159 return hostLocaleProviderAdapter; 160 default: 161 throw new InternalError("unknown locale data adapter type"); 162 } 163 } 164 165 public static LocaleProviderAdapter forJRE() { 166 return jreLocaleProviderAdapter; 167 } 168 169 public static LocaleProviderAdapter getResourceBundleBased() { 170 for (Type type : getAdapterPreference()) { 171 if (type == Type.JRE || type == Type.CLDR) { 172 return forType(type); 173 } 174 } 175 176 // for the last resort JRE adapter 177 return forType(Type.JRE); 178 } 179 /** 180 * Returns the preference order of LocaleProviderAdapter.Type 181 */ 182 public static Type[] getAdapterPreference() { 183 return adapterPreference; 184 } 185 186 /** 187 * Returns a LocaleProviderAdapter for the given locale service provider that 188 * best matches the given locale. This method returns the LocaleProviderAdapter 189 * for JRE if none is found for the ROOT locale. 190 * 191 * @param providerClass the class for the locale service provider 192 * @param locale the desired locale. 193 * @return a LocaleProviderAdapter 194 */ 195 public static LocaleProviderAdapter getAdapter(Class<? extends LocaleServiceProvider> providerClass, 196 Locale locale) { 197 // Fast look-up for the given locale 198 LocaleProviderAdapter adapter = findAdapter(providerClass, locale); 199 if (adapter != null) { 200 return adapter; 201 } 202 203 // Try finding an adapter in the normal candidate locales path of the given locale. 204 List<Locale> lookupLocales = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT) 205 .getCandidateLocales("", locale); 206 for (Locale loc : lookupLocales) { 207 if (loc.equals(locale)) { 208 // We've already done with this loc. 209 continue; |