Index: java/nio/charset/Charset.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/nio/charset/Charset.java,v retrieving revision 1.13 diff -u -r1.13 Charset.java --- java/nio/charset/Charset.java 22 Oct 2004 17:15:56 -0000 1.13 +++ java/nio/charset/Charset.java 8 Jan 2005 11:46:46 -0000 @@ -40,12 +40,17 @@ import gnu.java.nio.charset.Provider; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.spi.CharsetProvider; import java.util.Collections; +import java.util.Enumeration; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.Locale; import java.util.Set; import java.util.SortedMap; @@ -60,6 +65,11 @@ private static CharsetEncoder cachedEncoder; private static CharsetDecoder cachedDecoder; + /** + * Charset providers. + */ + private static CharsetProvider[] providers; + static { synchronized (Charset.class) @@ -130,35 +140,85 @@ * Retrieves a charset for the given charset name. * * @return A charset object for the charset with the specified name, or - * null if no such charset exists. + * null if no such charset exists. * * @throws IllegalCharsetNameException if the name is illegal */ - private static Charset charsetForName (String charsetName) + private static Charset charsetForName(String charsetName) { checkName (charsetName); - return provider ().charsetForName (charsetName); + Charset cs = null; + CharsetProvider[] providers = providers(); + for (int i = 0; i < providers.length; i++) + { + cs = providers[i].charsetForName(charsetName); + if (cs != null) + break; + } + return cs; } - public static SortedMap availableCharsets () + public static SortedMap availableCharsets() { - TreeMap charsets = new TreeMap (String.CASE_INSENSITIVE_ORDER); + TreeMap charsets = new TreeMap(String.CASE_INSENSITIVE_ORDER); - for (Iterator i = provider ().charsets (); i.hasNext (); ) + CharsetProvider[] providers = providers(); + for (int j = 0; j < providers.length; j++) { - Charset cs = (Charset) i.next (); - charsets.put (cs.name (), cs); + for (Iterator i = providers[j].charsets(); i.hasNext(); ) + { + Charset cs = (Charset) i.next(); + charsets.put(cs.name(), cs); + } } - return Collections.unmodifiableSortedMap (charsets); + return Collections.unmodifiableSortedMap(charsets); } - // XXX: we need to support multiple providers, reading them from - // java.nio.charset.spi.CharsetProvider in the resource directory - // META-INF/services - private static CharsetProvider provider () + private static CharsetProvider provider() { - return Provider.provider (); + return Provider.provider(); + } + + /** + * We need to support multiple providers, reading them from + * java.nio.charset.spi.CharsetProvider in the resource directory + * META-INF/services. + */ + private static CharsetProvider[] providers() + { + if (providers == null) + { + try + { + Enumeration en = ClassLoader.getSystemResources + ("META-INF/services/java.nio.charset.spi.CharsetProvider"); + LinkedHashSet set = new LinkedHashSet(); + set.add(provider()); + while (en.hasMoreElements()) + { + BufferedReader rdr = new BufferedReader(new InputStreamReader + (((URL) (en.nextElement())).openStream())); + while (true) + { + String s = rdr.readLine(); + if (s == null) + break; + CharsetProvider p = + (CharsetProvider) ((Class.forName(s)).newInstance()); + set.add(p); + } + } + + providers = new CharsetProvider[set.size()]; + set.toArray(providers); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + return providers; } public final String name ()