aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorMichael Koch <mkoch@gcc.gnu.org>2005-04-27 07:30:36 +0000
committerMichael Koch <mkoch@gcc.gnu.org>2005-04-27 07:30:36 +0000
commit5984f989561b06f42c2b9cd311caad8d7dd68400 (patch)
tree2230e265e2fee37824170f078c70e23e4b6b2340 /libjava
parentfbf5558065bc2bd017d5d44864bacdaa68686081 (diff)
downloadgcc-5984f989561b06f42c2b9cd311caad8d7dd68400.zip
gcc-5984f989561b06f42c2b9cd311caad8d7dd68400.tar.gz
gcc-5984f989561b06f42c2b9cd311caad8d7dd68400.tar.bz2
[multiple changes]
2005-04-27 Michael Koch <konqueror@gmx.de> * java/nio/charset/Charset.java (providers2): Renamed from 'providers' to work around CNI limitation. 2005-04-27 Sven de Marothy <sven@physto.se> * java/nio/charset/Charset.java: (defaultCharset()): New method. Status updated to 1.5 2005-04-27 Sven de Marothy <sven@physto.se> * java/nio/charset/Charset.java: Cached encoders shouldn't be static. 2005-04-27 Sven de Marothy <sven@physto.se> * java/nio/charset/Charset.java: Reset cached de/encoders. 2005-04-27 Robert Schuster <thebohemian@gmx.net> * java/nio/charset/Charset.java (forName): Throws IllegalArgumentException when argument is null and added documentation. 2005-04-27 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(). From-SVN: r98816
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog33
-rw-r--r--libjava/java/nio/charset/Charset.java106
2 files changed, 116 insertions, 23 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 8c3ab9b..871eae9 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,36 @@
+2005-04-27 Michael Koch <konqueror@gmx.de>
+
+ * java/nio/charset/Charset.java (providers2): Renamed from 'providers'
+ to work around CNI limitation.
+
+2005-04-27 Sven de Marothy <sven@physto.se>
+
+ * java/nio/charset/Charset.java:
+ (defaultCharset()): New method.
+ Status updated to 1.5
+
+2005-04-27 Sven de Marothy <sven@physto.se>
+
+ * java/nio/charset/Charset.java: Cached encoders shouldn't be static.
+
+2005-04-27 Sven de Marothy <sven@physto.se>
+
+ * java/nio/charset/Charset.java: Reset cached de/encoders.
+
+2005-04-27 Robert Schuster <thebohemian@gmx.net>
+
+ * java/nio/charset/Charset.java (forName): Throws
+ IllegalArgumentException when argument is null
+ and added documentation.
+
+2005-04-27 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().
+
2005-04-26 Michael Koch <konqueror@gmx.de>
* java/net/InetAddress.java: Made all hexadecimal numbers lowercase.
diff --git a/libjava/java/nio/charset/Charset.java b/libjava/java/nio/charset/Charset.java
index c7672c1..703d023 100644
--- a/libjava/java/nio/charset/Charset.java
+++ b/libjava/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;
@@ -57,18 +62,14 @@ import java.util.TreeMap;
*/
public abstract class Charset implements Comparable
{
- private static CharsetEncoder cachedEncoder;
- private static CharsetDecoder cachedDecoder;
+ private CharsetEncoder cachedEncoder;
+ private CharsetDecoder cachedDecoder;
- static
- {
- synchronized (Charset.class)
- {
- cachedEncoder = null;
- cachedDecoder = null;
- }
- }
-
+ /**
+ * Charset providers.
+ */
+ private static CharsetProvider[] providers;
+
private final String canonicalName;
private final String[] aliases;
@@ -82,6 +83,8 @@ public abstract class Charset implements Comparable
checkName (aliases[i]);
}
+ cachedEncoder = null;
+ cachedDecoder = null;
this.canonicalName = canonicalName;
this.aliases = aliases;
}
@@ -138,8 +141,6 @@ public abstract class Charset implements Comparable
Charset cs = charsetForName (charsetName);
if (cs == null)
throw new UnsupportedCharsetException (charsetName);
- cachedDecoder = null;
- cachedEncoder = null;
return cs;
}
@@ -154,30 +155,88 @@ public abstract class Charset implements Comparable
private static Charset charsetForName(String charsetName)
{
checkName (charsetName);
- return provider ().charsetForName (charsetName);
+ Charset cs = null;
+ CharsetProvider[] providers = providers2();
+ 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 = providers2();
+ 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()
{
+ try {
+ String s = System.getProperty("charset.provider");
+ if(s != null){
+ CharsetProvider p =
+ (CharsetProvider) ((Class.forName(s)).newInstance());
+ return p;
+ }
+ } catch(Exception e){}
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[] providers2()
+ {
+ 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 ()
{
return canonicalName;
@@ -238,8 +297,8 @@ public abstract class Charset implements Comparable
cachedEncoder = newEncoder ()
.onMalformedInput (CodingErrorAction.REPLACE)
.onUnmappableCharacter (CodingErrorAction.REPLACE);
- }
-
+ } else
+ cachedEncoder.reset();
return cachedEncoder.encode (cb);
}
}
@@ -269,7 +328,8 @@ public abstract class Charset implements Comparable
cachedDecoder = newDecoder ()
.onMalformedInput (CodingErrorAction.REPLACE)
.onUnmappableCharacter (CodingErrorAction.REPLACE);
- }
+ } else
+ cachedDecoder.reset();
return cachedDecoder.decode (bb);
}