jaxp/src/share/classes/com/sun/org/apache/xml/internal/serialize/Encodings.java
changeset 6 7f561c08de6b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/src/share/classes/com/sun/org/apache/xml/internal/serialize/Encodings.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,124 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * Copyright 1999-2002,2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.sun.org.apache.xml.internal.serialize;
+
+
+import java.io.UnsupportedEncodingException;
+import java.util.Hashtable;
+import java.util.Locale;
+
+import com.sun.org.apache.xerces.internal.util.EncodingMap;
+
+
+/**
+ * Provides information about encodings. Depends on the Java runtime
+ * to provides writers for the different encodings, but can be used
+ * to override encoding names and provide the last printable character
+ * for each encoding.
+ *
+ * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a>
+ */
+public class Encodings
+{
+
+
+    /**
+     * The last printable character for unknown encodings.
+     */
+    static final int DEFAULT_LAST_PRINTABLE = 0x7F;
+
+    // last printable character for Unicode-compatible encodings
+    static final int LAST_PRINTABLE_UNICODE = 0xffff;
+    // unicode-compliant encodings; can express plane 0
+    static final String[] UNICODE_ENCODINGS = {
+        "Unicode", "UnicodeBig", "UnicodeLittle", "GB2312", "UTF8", "UTF-16",
+    };
+    // default (Java) encoding if none supplied:
+    static final String DEFAULT_ENCODING = "UTF8";
+
+    // note that the size of this Hashtable
+    // is bounded by the number of encodings recognized by EncodingMap;
+    // therefore it poses no static mutability risk.
+    static Hashtable _encodings = new Hashtable();
+
+    /**
+     * @param encoding a MIME charset name, or null.
+     */
+    static EncodingInfo getEncodingInfo(String encoding, boolean allowJavaNames) throws UnsupportedEncodingException {
+        EncodingInfo eInfo = null;
+        if (encoding == null) {
+            if((eInfo = (EncodingInfo)_encodings.get(DEFAULT_ENCODING)) != null)
+                return eInfo;
+            eInfo = new EncodingInfo(EncodingMap.getJava2IANAMapping(DEFAULT_ENCODING), DEFAULT_ENCODING, LAST_PRINTABLE_UNICODE);
+            _encodings.put(DEFAULT_ENCODING, eInfo);
+            return eInfo;
+        }
+        // need to convert it to upper case:
+        encoding = encoding.toUpperCase(Locale.ENGLISH);
+        String jName = EncodingMap.getIANA2JavaMapping(encoding);
+        if(jName == null) {
+            // see if the encoding passed in is a Java encoding name.
+            if(allowJavaNames ) {
+                EncodingInfo.testJavaEncodingName(encoding);
+                if((eInfo = (EncodingInfo)_encodings.get(encoding)) != null)
+                    return eInfo;
+                // is it known to be unicode-compliant?
+                int i=0;
+                for(; i<UNICODE_ENCODINGS.length; i++) {
+                    if(UNICODE_ENCODINGS[i].equalsIgnoreCase(encoding)) {
+                        eInfo = new EncodingInfo(EncodingMap.getJava2IANAMapping(encoding), encoding, LAST_PRINTABLE_UNICODE);
+                        break;
+                    }
+                }
+                if(i == UNICODE_ENCODINGS.length) {
+                    eInfo = new EncodingInfo(EncodingMap.getJava2IANAMapping(encoding), encoding, DEFAULT_LAST_PRINTABLE);
+                }
+                _encodings.put(encoding, eInfo);
+                return eInfo;
+            } else {
+                throw new UnsupportedEncodingException(encoding);
+            }
+        }
+        if ((eInfo = (EncodingInfo)_encodings.get(jName)) != null)
+            return eInfo;
+        // have to create one...
+        // is it known to be unicode-compliant?
+        int i=0;
+        for(; i<UNICODE_ENCODINGS.length; i++) {
+            if(UNICODE_ENCODINGS[i].equalsIgnoreCase(jName)) {
+                eInfo = new EncodingInfo(encoding, jName, LAST_PRINTABLE_UNICODE);
+                break;
+            }
+        }
+        if(i == UNICODE_ENCODINGS.length) {
+            eInfo = new EncodingInfo(encoding, jName, DEFAULT_LAST_PRINTABLE);
+        }
+        _encodings.put(jName, eInfo);
+        return eInfo;
+    }
+
+    static final String JIS_DANGER_CHARS
+    = "\\\u007e\u007f\u00a2\u00a3\u00a5\u00ac"
+    +"\u2014\u2015\u2016\u2026\u203e\u203e\u2225\u222f\u301c"
+    +"\uff3c\uff5e\uffe0\uffe1\uffe2\uffe3";
+
+}