diff options
| author | Michael Koch <konqueror@gmx.de> | 2005-01-08 11:48:26 +0000 |
|---|---|---|
| committer | Michael Koch <konqueror@gmx.de> | 2005-01-08 11:48:26 +0000 |
| commit | 2cf6928c4ea532d337a4e9ea37e6c2e429bcf85f (patch) | |
| tree | 624c06599022432fc25e09677fdf7a4cf4e48bd3 /java | |
| parent | 14b67c5f537128d254ba6c842437892a51be750e (diff) | |
| download | classpath-2cf6928c4ea532d337a4e9ea37e6c2e429bcf85f.tar.gz | |
2005-01-08 Ito Kazumitsu <kaz@maczuka.gcd.org>
* java/nio/charset/Charset.java (providers):
New method to make an array of CharsetProviders defined in
META-INF/services/java.nio.charset.spi.CharsetProvider.
(charsetForName, availableCharsets): Use the
new method providers().
Diffstat (limited to 'java')
| -rw-r--r-- | java/nio/charset/Charset.java | 88 |
1 files changed, 74 insertions, 14 deletions
diff --git a/java/nio/charset/Charset.java b/java/nio/charset/Charset.java index db2386c72..4ec28683e 100644 --- a/java/nio/charset/Charset.java +++ b/java/nio/charset/Charset.java @@ -40,12 +40,17 @@ package java.nio.charset; 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 @@ public abstract class Charset implements Comparable private static CharsetEncoder cachedEncoder; private static CharsetDecoder cachedDecoder; + /** + * Charset providers. + */ + private static CharsetProvider[] providers; + static { synchronized (Charset.class) @@ -130,35 +140,85 @@ public abstract class Charset implements Comparable * Retrieves a charset for the given charset name. * * @return A charset object for the charset with the specified name, or - * <code>null</code> if no such charset exists. + * <code>null</code> 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); + } + + private static CharsetProvider provider() + { + return Provider.provider(); } - // 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 () + /** + * 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() { - return Provider.provider (); + 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 () |
