package java.nio.charset;
import gnu.java.nio.charset.Provider;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.spi.CharsetProvider;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
public abstract class Charset implements Comparable
{
private static CharsetEncoder cachedEncoder;
private static CharsetDecoder cachedDecoder;
static
{
synchronized (Charset.class)
{
cachedEncoder = null;
cachedDecoder = null;
}
}
private final String canonicalName;
private final String[] aliases;
protected Charset (String canonicalName, String[] aliases)
{
checkName (canonicalName);
if (aliases != null)
{
int n = aliases.length;
for (int i = 0; i < n; ++i)
checkName (aliases[i]);
}
this.canonicalName = canonicalName;
this.aliases = aliases;
}
private static void checkName (String name)
{
int n = name.length ();
if (n == 0)
throw new IllegalCharsetNameException (name);
char ch = name.charAt (0);
if (!(('A' <= ch && ch <= 'Z')
|| ('a' <= ch && ch <= 'z')
|| ('0' <= ch && ch <= '9')))
throw new IllegalCharsetNameException (name);
for (int i = 1; i < n; ++i)
{
ch = name.charAt (i);
if (!(('A' <= ch && ch <= 'Z')
|| ('a' <= ch && ch <= 'z')
|| ('0' <= ch && ch <= '9')
|| ch == '-' || ch == '.' || ch == ':' || ch == '_'))
throw new IllegalCharsetNameException (name);
}
}
public static boolean isSupported (String charsetName)
{
return charsetForName (charsetName) != null;
}
public static Charset forName (String charsetName)
{
if(charsetName == null)
throw new IllegalArgumentException("Charset name must not be null.");
Charset cs = charsetForName (charsetName);
if (cs == null)
throw new UnsupportedCharsetException (charsetName);
cachedDecoder = null;
cachedEncoder = null;
return cs;
}
private static Charset charsetForName(String charsetName)
{
checkName (charsetName);
return provider ().charsetForName (charsetName);
}
public static SortedMap availableCharsets()
{
TreeMap charsets = new TreeMap(String.CASE_INSENSITIVE_ORDER);
for (Iterator i = provider ().charsets (); i.hasNext (); )
{
Charset cs = (Charset) i.next ();
charsets.put (cs.name (), cs);
}
return Collections.unmodifiableSortedMap(charsets);
}
private static CharsetProvider provider()
{
return Provider.provider();
}
public final String name ()
{
return canonicalName;
}
public final Set aliases ()
{
if (aliases == null)
return Collections.EMPTY_SET;
int n = aliases.length;
HashSet aliasSet = new HashSet (n);
for (int i = 0; i < n; ++i)
aliasSet.add (aliases[i]);
return Collections.unmodifiableSet (aliasSet);
}
public String displayName ()
{
return canonicalName;
}
public String displayName (Locale locale)
{
return canonicalName;
}
public final boolean isRegistered ()
{
return (!canonicalName.startsWith ("x-")
&& !canonicalName.startsWith ("X-"));
}
public abstract boolean contains (Charset cs);
public abstract CharsetDecoder newDecoder ();
public abstract CharsetEncoder newEncoder ();
public boolean canEncode ()
{
return true;
}
public final ByteBuffer encode (CharBuffer cb)
{
try
{
CharsetEncoder enc = newEncoder ()
.onMalformedInput (CodingErrorAction.REPLACE)
.onUnmappableCharacter (CodingErrorAction.REPLACE);
return enc.encode (cb);
}
catch (CharacterCodingException e)
{
throw new AssertionError (e);
}
}
public final ByteBuffer encode (String str)
{
return encode (CharBuffer.wrap (str));
}
public final CharBuffer decode (ByteBuffer bb)
{
try
{
CharsetDecoder dec = newDecoder ()
.onMalformedInput (CodingErrorAction.REPLACE)
.onUnmappableCharacter (CodingErrorAction.REPLACE);
return dec.decode (bb);
}
catch (CharacterCodingException e)
{
throw new AssertionError (e);
}
}
public final int compareTo (Object ob)
{
return canonicalName.compareToIgnoreCase (((Charset) ob).canonicalName);
}
public final int hashCode ()
{
return canonicalName.hashCode ();
}
public final boolean equals (Object ob)
{
if (ob instanceof Charset)
return canonicalName.equalsIgnoreCase (((Charset) ob).canonicalName);
else
return false;
}
public final String toString ()
{
return canonicalName;
}
}