[Top][All Lists]
[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 ()
#####
- [cp-patches] java.nio.charset.Charset should read META-INF/services/java.nio.charset.spi.CharsetProvider,
Ito Kazumitsu <=