classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] java.nio.charset.Charset should read META-INF/services/java


From: Ito Kazumitsu
Subject: [cp-patches] java.nio.charset.Charset should read META-INF/services/java.nio.charset.spi.CharsetProvider
Date: 7 Jan 2005 16:00:17 -0000
User-agent: SEMI/1.13.7 (Awazu) FLIM/1.13.2 (Kasanui) Emacs/21.3.50 (i386-unknown-freebsd5.3) MULE/5.0 (SAKAKI)

Hi,

I suggest the following patch, which makes
   META-INF/services/java.nio.charset.spi.CharsetProvider
 effective:

ChangeLog enty:
2005-01-07  Ito Kazumitsu  <address@hidden>

        * 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().

#####
--- java/nio/charset/Charset.java.orig  Mon Oct 25 02:20:10 2004
+++ java/nio/charset/Charset.java       Sat Jan  8 00:45:16 2005
@@ -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;
@@ -137,28 +142,74 @@
   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 ()
   {
     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);
   }
 
-  // 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 ()
   {
     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;
+  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 ()
#####




reply via email to

[Prev in Thread] Current Thread [Next in Thread]