103 */
104 private static LocaleProviderAdapter spiLocaleProviderAdapter = new SPILocaleProviderAdapter();
105
106 /**
107 * CLDR Locale Data Adapter instance, if any.
108 */
109 private static LocaleProviderAdapter cldrLocaleProviderAdapter = null;
110
111 /**
112 * HOST Locale Data Adapter instance, if any.
113 */
114 private static LocaleProviderAdapter hostLocaleProviderAdapter = null;
115
116 /**
117 * FALLBACK Locale Data Adapter instance. It's basically the same with JRE, but only kicks
118 * in for the root locale.
119 */
120 private static LocaleProviderAdapter fallbackLocaleProviderAdapter = null;
121
122 /**
123 * Adapter lookup cache.
124 */
125 private static ConcurrentMap<Class<? extends LocaleServiceProvider>, ConcurrentMap<Locale, LocaleProviderAdapter>>
126 adapterCache = new ConcurrentHashMap<>();
127
128 static {
129 String order = AccessController.doPrivileged(
130 new sun.security.action.GetPropertyAction("java.locale.providers"));
131 List<Type> typeList = new ArrayList<>();
132
133 // Check user specified adapter preference
134 if (order != null && order.length() != 0) {
135 String[] types = order.split(",");
136 for (String type : types) {
137 try {
138 Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT));
139
140 // load adapter if necessary
141 switch (aType) {
142 case CLDR:
143 cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter();
144 break;
145 case HOST:
146 hostLocaleProviderAdapter = new HostLocaleProviderAdapter();
147 break;
148 }
149 typeList.add(aType);
150 } catch (IllegalArgumentException | UnsupportedOperationException e) {
151 // could be caused by the user specifying wrong
152 // provider name or format in the system property
153 LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString());
154 }
155 }
156 }
157
158 if (!typeList.isEmpty()) {
159 if (!typeList.contains(Type.JRE)) {
160 // Append FALLBACK as the last resort.
161 fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
162 typeList.add(Type.FALLBACK);
163 }
164 } else {
165 // Default preference list
166 typeList.add(Type.JRE);
167 typeList.add(Type.SPI);
168 }
169
170 adapterPreference = Collections.unmodifiableList(typeList);
171 }
172
173 /**
174 * Returns the singleton instance for each adapter type
175 */
176 public static LocaleProviderAdapter forType(Type type) {
177 switch (type) {
178 case JRE:
179 return jreLocaleProviderAdapter;
180 case CLDR:
181 return cldrLocaleProviderAdapter;
182 case SPI:
183 return spiLocaleProviderAdapter;
184 case HOST:
185 return hostLocaleProviderAdapter;
186 case FALLBACK:
187 return fallbackLocaleProviderAdapter;
|
103 */
104 private static LocaleProviderAdapter spiLocaleProviderAdapter = new SPILocaleProviderAdapter();
105
106 /**
107 * CLDR Locale Data Adapter instance, if any.
108 */
109 private static LocaleProviderAdapter cldrLocaleProviderAdapter = null;
110
111 /**
112 * HOST Locale Data Adapter instance, if any.
113 */
114 private static LocaleProviderAdapter hostLocaleProviderAdapter = null;
115
116 /**
117 * FALLBACK Locale Data Adapter instance. It's basically the same with JRE, but only kicks
118 * in for the root locale.
119 */
120 private static LocaleProviderAdapter fallbackLocaleProviderAdapter = null;
121
122 /**
123 * Default fallback adapter type, which should return something meaningful in any case.
124 * This is either JRE or FALLBACK.
125 */
126 static LocaleProviderAdapter.Type defaultLocaleProviderAdapter = null;
127
128 /**
129 * Adapter lookup cache.
130 */
131 private static ConcurrentMap<Class<? extends LocaleServiceProvider>, ConcurrentMap<Locale, LocaleProviderAdapter>>
132 adapterCache = new ConcurrentHashMap<>();
133
134 static {
135 String order = AccessController.doPrivileged(
136 new sun.security.action.GetPropertyAction("java.locale.providers"));
137 List<Type> typeList = new ArrayList<>();
138
139 // Check user specified adapter preference
140 if (order != null && order.length() != 0) {
141 String[] types = order.split(",");
142 for (String type : types) {
143 try {
144 Type aType = Type.valueOf(type.trim().toUpperCase(Locale.ROOT));
145
146 // load adapter if necessary
147 switch (aType) {
148 case CLDR:
149 if (cldrLocaleProviderAdapter == null) {
150 cldrLocaleProviderAdapter = new CLDRLocaleProviderAdapter();
151 }
152 break;
153 case HOST:
154 if (hostLocaleProviderAdapter == null) {
155 hostLocaleProviderAdapter = new HostLocaleProviderAdapter();
156 }
157 break;
158 }
159 if (!typeList.contains(aType)) {
160 typeList.add(aType);
161 }
162 } catch (IllegalArgumentException | UnsupportedOperationException e) {
163 // could be caused by the user specifying wrong
164 // provider name or format in the system property
165 LocaleServiceProviderPool.config(LocaleProviderAdapter.class, e.toString());
166 }
167 }
168 }
169
170 if (!typeList.isEmpty()) {
171 if (!typeList.contains(Type.JRE)) {
172 // Append FALLBACK as the last resort.
173 fallbackLocaleProviderAdapter = new FallbackLocaleProviderAdapter();
174 typeList.add(Type.FALLBACK);
175 defaultLocaleProviderAdapter = Type.FALLBACK;
176 } else {
177 defaultLocaleProviderAdapter = Type.JRE;
178 }
179 } else {
180 // Default preference list
181 typeList.add(Type.JRE);
182 typeList.add(Type.SPI);
183 defaultLocaleProviderAdapter = Type.JRE;
184 }
185
186 adapterPreference = Collections.unmodifiableList(typeList);
187 }
188
189 /**
190 * Returns the singleton instance for each adapter type
191 */
192 public static LocaleProviderAdapter forType(Type type) {
193 switch (type) {
194 case JRE:
195 return jreLocaleProviderAdapter;
196 case CLDR:
197 return cldrLocaleProviderAdapter;
198 case SPI:
199 return spiLocaleProviderAdapter;
200 case HOST:
201 return hostLocaleProviderAdapter;
202 case FALLBACK:
203 return fallbackLocaleProviderAdapter;
|