summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorMichael Koch <konqueror@gmx.de>2005-01-08 11:48:26 +0000
committerMichael Koch <konqueror@gmx.de>2005-01-08 11:48:26 +0000
commit2cf6928c4ea532d337a4e9ea37e6c2e429bcf85f (patch)
tree624c06599022432fc25e09677fdf7a4cf4e48bd3 /java
parent14b67c5f537128d254ba6c842437892a51be750e (diff)
downloadclasspath-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.java88
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 ()