src/share/classes/java/nio/charset/Charset.java
Print this page
@@ -425,50 +425,42 @@
gate.set(null);
}
}
/* The extended set of charsets */
- private static Object extendedProviderLock = new Object();
- private static boolean extendedProviderProbed = false;
- private static CharsetProvider extendedProvider = null;
-
- private static void probeExtendedProvider() {
- AccessController.doPrivileged(new PrivilegedAction<Object>() {
- public Object run() {
+ private static class ExtendedProviderHolder {
+ static final CharsetProvider extendedProvider = extendedProvider();
+ // returns ExtendedProvider, if installed
+ private static CharsetProvider extendedProvider() {
+ return AccessController.doPrivileged(
+ new PrivilegedAction<CharsetProvider>() {
+ public CharsetProvider run() {
try {
Class<?> epc
= Class.forName("sun.nio.cs.ext.ExtendedCharsets");
- extendedProvider = (CharsetProvider)epc.newInstance();
+ return (CharsetProvider)epc.newInstance();
} catch (ClassNotFoundException x) {
// Extended charsets not available
// (charsets.jar not present)
- } catch (InstantiationException x) {
- throw new Error(x);
- } catch (IllegalAccessException x) {
+ } catch (InstantiationException |
+ IllegalAccessException x) {
throw new Error(x);
}
return null;
}
});
}
+ }
private static Charset lookupExtendedCharset(String charsetName) {
- CharsetProvider ecp = null;
- synchronized (extendedProviderLock) {
- if (!extendedProviderProbed) {
- probeExtendedProvider();
- extendedProviderProbed = true;
- }
- ecp = extendedProvider;
- }
+ CharsetProvider ecp = ExtendedProviderHolder.extendedProvider;
return (ecp != null) ? ecp.charsetForName(charsetName) : null;
}
private static Charset lookup(String charsetName) {
if (charsetName == null)
throw new IllegalArgumentException("Null charset name");
-
Object[] a;
if ((a = cache1) != null && charsetName.equals(a[0]))
return (Charset)a[1];
// We expect most programs to use one Charset repeatedly.
// We convey a hint to this effect to the VM by putting the
@@ -481,11 +473,10 @@
if ((a = cache2) != null && charsetName.equals(a[0])) {
cache2 = cache1;
cache1 = a;
return (Charset)a[1];
}
-
Charset cs;
if ((cs = standardProvider.charsetForName(charsetName)) != null ||
(cs = lookupExtendedCharset(charsetName)) != null ||
(cs = lookupViaProviders(charsetName)) != null)
{
@@ -587,10 +578,13 @@
public SortedMap<String,Charset> run() {
TreeMap<String,Charset> m =
new TreeMap<String,Charset>(
ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER);
put(standardProvider.charsets(), m);
+ CharsetProvider ecp = ExtendedProviderHolder.extendedProvider;
+ if (ecp != null)
+ put(ecp.charsets(), m);
for (Iterator<CharsetProvider> i = providers(); i.hasNext();) {
CharsetProvider cp = i.next();
put(cp.charsets(), m);
}
return Collections.unmodifiableSortedMap(m);