diff --git a/make/sun/nio/cs/Makefile b/make/sun/nio/cs/Makefile index 73fe55fbd082f7e543d40fe3825a951cff41aa11..3b45c774fe02cc242e5fcfd58ba4959d54edbfca 100644 --- a/make/sun/nio/cs/Makefile +++ b/make/sun/nio/cs/Makefile @@ -87,9 +87,6 @@ build: $(FILES_genout_extcs) $(CHARSETS_JAR) # # Extra rules to build character converters. -SERVICE_DESCRIPTION = java.nio.charset.spi.CharsetProvider -SERVICE_DESCRIPTION_PATH = META-INF/services/$(SERVICE_DESCRIPTION) - GENCSDATASRC = $(BUILDDIR)/tools/CharsetMapping GENCSSRCDIR = $(BUILDDIR)/tools/src/build/tools/charsetmapping GENCSEXT = $(GENSRCDIR)/sun/nio/cs/ext @@ -118,10 +115,6 @@ $(FILES_genout_extcs): \ $(GENCSSRCDIR)/HKSCS.java $(BOOT_JAVA_CMD) -jar $(CHARSETMAPPING_JARFILE) $(GENCSDATASRC) $(GENCSEXT) dbcs -$(CLASSDESTDIR)/$(SERVICE_DESCRIPTION_PATH): \ - $(SHARE_SRC)/classes/sun/nio/cs/ext/$(SERVICE_DESCRIPTION_PATH) - $(install-file) - # no compression unless requested ifndef COMPRESS_JARS CREATE_JAR_OPTS_NOMANIFEST = cf0 @@ -129,10 +122,9 @@ else CREATE_JAR_OPTS_NOMANIFEST = cf endif -$(CHARSETS_JAR): $(FILES_class) $(CLASSDESTDIR)/$(SERVICE_DESCRIPTION_PATH) $(FILES_DAT) +$(CHARSETS_JAR): $(FILES_class) $(FILES_DAT) $(BOOT_JAR_CMD) $(CREATE_JAR_OPTS_NOMANIFEST) $(CHARSETS_JAR) \ -C $(CLASSDESTDIR) sun \ - -C $(CLASSDESTDIR) $(SERVICE_DESCRIPTION_PATH) \ $(BOOT_JAR_JFLAGS) @$(java-vm-cleanup) diff --git a/makefiles/CreateJars.gmk b/makefiles/CreateJars.gmk index 8127b054459e22c55408526be2b221f4c3bb9690..764e63486f5e866b9f96770ca14541904aa8b52b 100644 --- a/makefiles/CreateJars.gmk +++ b/makefiles/CreateJars.gmk @@ -201,7 +201,6 @@ RT_JAR_EXCLUDES += \ META-INF/services/com.sun.jdi.connect.spi.TransportService \ META-INF/services/com.sun.tools.attach.spi.AttachProvider \ META-INF/services/com.sun.tools.xjc.Plugin \ - META-INF/services/java.nio.charset.spi.CharsetProvider \ META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor \ org/relaxng/datatype \ sun/awt/HKSCS.class \ @@ -428,8 +427,7 @@ $(eval $(call SetupArchive,BUILD_CHARSETS_JAR,,\ SUFFIXES:=.class .dat,\ INCLUDES:=sun/nio/cs/ext,\ EXTRA_FILES := sun/awt/HKSCS.class \ - $(CHARSETS_EXTRA_FILES) \ - META-INF/services/java.nio.charset.spi.CharsetProvider, \ + $(CHARSETS_EXTRA_FILES), \ JAR:=$(IMAGES_OUTPUTDIR)/lib/charsets.jar, \ SKIP_METAINF := true, \ CHECK_COMPRESS_JAR:=true)) diff --git a/src/share/classes/java/nio/charset/Charset.java b/src/share/classes/java/nio/charset/Charset.java index 2d3f020bcf6e6ac5588bb9f4791eca70310f9324..9451c537a36fe079e3c2e28bea16a713443d9bd9 100644 --- a/src/share/classes/java/nio/charset/Charset.java +++ b/src/share/classes/java/nio/charset/Charset.java @@ -427,46 +427,38 @@ public abstract class Charset } /* 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() { - public Object run() { - try { - Class epc - = Class.forName("sun.nio.cs.ext.ExtendedCharsets"); - extendedProvider = (CharsetProvider)epc.newInstance(); - } catch (ClassNotFoundException x) { - // Extended charsets not available - // (charsets.jar not present) - } catch (InstantiationException x) { - throw new Error(x); - } catch (IllegalAccessException x) { - throw new Error(x); - } - return null; - } - }); + private static class ExtendedProviderHolder { + static final CharsetProvider extendedProvider = extendedProvider(); + // returns ExtendedProvider, if installed + private static CharsetProvider extendedProvider() { + return AccessController.doPrivileged( + new PrivilegedAction() { + public CharsetProvider run() { + try { + Class epc + = Class.forName("sun.nio.cs.ext.ExtendedCharsets"); + return (CharsetProvider)epc.newInstance(); + } catch (ClassNotFoundException x) { + // Extended charsets not available + // (charsets.jar not present) + } 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]; @@ -483,7 +475,6 @@ public abstract class Charset cache1 = a; return (Charset)a[1]; } - Charset cs; if ((cs = standardProvider.charsetForName(charsetName)) != null || (cs = lookupExtendedCharset(charsetName)) != null || @@ -589,6 +580,9 @@ public abstract class Charset new TreeMap( ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER); put(standardProvider.charsets(), m); + CharsetProvider ecp = ExtendedProviderHolder.extendedProvider; + if (ecp != null) + put(ecp.charsets(), m); for (Iterator i = providers(); i.hasNext();) { CharsetProvider cp = i.next(); put(cp.charsets(), m); diff --git a/src/share/classes/sun/nio/cs/ext/ISO2022_JP_2.java b/src/share/classes/sun/nio/cs/ext/ISO2022_JP_2.java index 12631577807cb329ddcb60e65de614388a0c2769..0389a12b825c2aae4074fc2a2a36402c9bc654ff 100644 --- a/src/share/classes/sun/nio/cs/ext/ISO2022_JP_2.java +++ b/src/share/classes/sun/nio/cs/ext/ISO2022_JP_2.java @@ -47,17 +47,17 @@ public class ISO2022_JP_2 extends ISO2022_JP } public CharsetDecoder newDecoder() { - return new Decoder(this, Decoder.DEC0208, DEC0212); + return new Decoder(this, Decoder.DEC0208, CoderHolder.DEC0212); } public CharsetEncoder newEncoder() { - return new Encoder(this, Encoder.ENC0208, ENC0212, true); + return new Encoder(this, Encoder.ENC0208, CoderHolder.ENC0212, true); } - private final static DoubleByte.Decoder DEC0212 = - (DoubleByte.Decoder)new JIS_X_0212().newDecoder(); - - private final static DoubleByte.Encoder ENC0212 = - (DoubleByte.Encoder)new JIS_X_0212().newEncoder(); - + private static class CoderHolder { + final static DoubleByte.Decoder DEC0212 = + (DoubleByte.Decoder)new JIS_X_0212().newDecoder(); + final static DoubleByte.Encoder ENC0212 = + (DoubleByte.Encoder)new JIS_X_0212().newEncoder(); + } } diff --git a/src/share/classes/sun/nio/cs/ext/META-INF/services/java.nio.charset.spi.CharsetProvider b/src/share/classes/sun/nio/cs/ext/META-INF/services/java.nio.charset.spi.CharsetProvider deleted file mode 100644 index cf0949e4ca8546774a3f50de69b3fe6c62370f04..0000000000000000000000000000000000000000 --- a/src/share/classes/sun/nio/cs/ext/META-INF/services/java.nio.charset.spi.CharsetProvider +++ /dev/null @@ -1,2 +0,0 @@ -# NIO charset SPI extended charset provider -sun.nio.cs.ext.ExtendedCharsets diff --git a/src/share/classes/sun/nio/cs/ext/MSISO2022JP.java b/src/share/classes/sun/nio/cs/ext/MSISO2022JP.java index 2be71a210c714e8d375a2619e1b2a7331d99ada2..761809aa3042c23c7c09a826c99e0753fb9ff19e 100644 --- a/src/share/classes/sun/nio/cs/ext/MSISO2022JP.java +++ b/src/share/classes/sun/nio/cs/ext/MSISO2022JP.java @@ -46,16 +46,17 @@ public class MSISO2022JP extends ISO2022_JP } public CharsetDecoder newDecoder() { - return new Decoder(this, DEC0208, null); + return new Decoder(this, CoderHolder.DEC0208, null); } public CharsetEncoder newEncoder() { - return new Encoder(this, ENC0208, null, true); + return new Encoder(this, CoderHolder.ENC0208, null, true); } - private final static DoubleByte.Decoder DEC0208 = - (DoubleByte.Decoder)new JIS_X_0208_MS932().newDecoder(); - - private final static DoubleByte.Encoder ENC0208 = - (DoubleByte.Encoder)new JIS_X_0208_MS932().newEncoder(); + private static class CoderHolder { + final static DoubleByte.Decoder DEC0208 = + (DoubleByte.Decoder)new JIS_X_0208_MS932().newDecoder(); + final static DoubleByte.Encoder ENC0208 = + (DoubleByte.Encoder)new JIS_X_0208_MS932().newEncoder(); + } }