jaxp/src/com/sun/org/apache/xml/internal/serialize/Encodings.java
author joehw
Tue, 29 Jul 2014 20:52:36 -0700
changeset 25834 aba3efbf4ec5
parent 12457 c348e06f0e82
permissions -rw-r--r--
8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer. Reviewed-by: lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6
7f561c08de6b Initial load
duke
parents:
diff changeset
     1
/*
7f561c08de6b Initial load
duke
parents:
diff changeset
     2
 * reserved comment block
7f561c08de6b Initial load
duke
parents:
diff changeset
     3
 * DO NOT REMOVE OR ALTER!
7f561c08de6b Initial load
duke
parents:
diff changeset
     4
 */
7f561c08de6b Initial load
duke
parents:
diff changeset
     5
/*
25834
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
     6
 * Licensed to the Apache Software Foundation (ASF) under one or more
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
     7
 * contributor license agreements.  See the NOTICE file distributed with
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
     8
 * this work for additional information regarding copyright ownership.
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
     9
 * The ASF licenses this file to You under the Apache License, Version 2.0
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
    10
 * (the "License"); you may not use this file except in compliance with
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
    11
 * the License.  You may obtain a copy of the License at
6
7f561c08de6b Initial load
duke
parents:
diff changeset
    12
 *
7f561c08de6b Initial load
duke
parents:
diff changeset
    13
 *      http://www.apache.org/licenses/LICENSE-2.0
7f561c08de6b Initial load
duke
parents:
diff changeset
    14
 *
7f561c08de6b Initial load
duke
parents:
diff changeset
    15
 * Unless required by applicable law or agreed to in writing, software
7f561c08de6b Initial load
duke
parents:
diff changeset
    16
 * distributed under the License is distributed on an "AS IS" BASIS,
7f561c08de6b Initial load
duke
parents:
diff changeset
    17
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7f561c08de6b Initial load
duke
parents:
diff changeset
    18
 * See the License for the specific language governing permissions and
7f561c08de6b Initial load
duke
parents:
diff changeset
    19
 * limitations under the License.
7f561c08de6b Initial load
duke
parents:
diff changeset
    20
 */
7f561c08de6b Initial load
duke
parents:
diff changeset
    21
7f561c08de6b Initial load
duke
parents:
diff changeset
    22
7f561c08de6b Initial load
duke
parents:
diff changeset
    23
package com.sun.org.apache.xml.internal.serialize;
7f561c08de6b Initial load
duke
parents:
diff changeset
    24
7f561c08de6b Initial load
duke
parents:
diff changeset
    25
7f561c08de6b Initial load
duke
parents:
diff changeset
    26
import java.io.UnsupportedEncodingException;
7f561c08de6b Initial load
duke
parents:
diff changeset
    27
import java.util.Hashtable;
7f561c08de6b Initial load
duke
parents:
diff changeset
    28
import java.util.Locale;
7f561c08de6b Initial load
duke
parents:
diff changeset
    29
7f561c08de6b Initial load
duke
parents:
diff changeset
    30
import com.sun.org.apache.xerces.internal.util.EncodingMap;
7f561c08de6b Initial load
duke
parents:
diff changeset
    31
7f561c08de6b Initial load
duke
parents:
diff changeset
    32
7f561c08de6b Initial load
duke
parents:
diff changeset
    33
/**
7f561c08de6b Initial load
duke
parents:
diff changeset
    34
 * Provides information about encodings. Depends on the Java runtime
7f561c08de6b Initial load
duke
parents:
diff changeset
    35
 * to provides writers for the different encodings, but can be used
7f561c08de6b Initial load
duke
parents:
diff changeset
    36
 * to override encoding names and provide the last printable character
7f561c08de6b Initial load
duke
parents:
diff changeset
    37
 * for each encoding.
7f561c08de6b Initial load
duke
parents:
diff changeset
    38
 *
7f561c08de6b Initial load
duke
parents:
diff changeset
    39
 * @author <a href="mailto:arkin@intalio.com">Assaf Arkin</a>
25834
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
    40
 *
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
    41
 * @deprecated As of JDK 1.9, Xerces 2.9.0, Xerces DOM L3 Serializer implementation
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
    42
 * is replaced by that of Xalan. Main class
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
    43
 * {@link com.sun.org.apache.xml.internal.serialize.DOMSerializerImpl} is replaced
aba3efbf4ec5 8035467: Xerces Update: Move to Xalan based DOM L3 serializer. Deprecate Xerces' native serializer.
joehw
parents: 12457
diff changeset
    44
 * by {@link com.sun.org.apache.xml.internal.serializer.dom3.LSSerializerImpl}.
6
7f561c08de6b Initial load
duke
parents:
diff changeset
    45
 */
7f561c08de6b Initial load
duke
parents:
diff changeset
    46
public class Encodings
7f561c08de6b Initial load
duke
parents:
diff changeset
    47
{
7f561c08de6b Initial load
duke
parents:
diff changeset
    48
7f561c08de6b Initial load
duke
parents:
diff changeset
    49
7f561c08de6b Initial load
duke
parents:
diff changeset
    50
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
    51
     * The last printable character for unknown encodings.
7f561c08de6b Initial load
duke
parents:
diff changeset
    52
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
    53
    static final int DEFAULT_LAST_PRINTABLE = 0x7F;
7f561c08de6b Initial load
duke
parents:
diff changeset
    54
7f561c08de6b Initial load
duke
parents:
diff changeset
    55
    // last printable character for Unicode-compatible encodings
7f561c08de6b Initial load
duke
parents:
diff changeset
    56
    static final int LAST_PRINTABLE_UNICODE = 0xffff;
7f561c08de6b Initial load
duke
parents:
diff changeset
    57
    // unicode-compliant encodings; can express plane 0
7f561c08de6b Initial load
duke
parents:
diff changeset
    58
    static final String[] UNICODE_ENCODINGS = {
7f561c08de6b Initial load
duke
parents:
diff changeset
    59
        "Unicode", "UnicodeBig", "UnicodeLittle", "GB2312", "UTF8", "UTF-16",
7f561c08de6b Initial load
duke
parents:
diff changeset
    60
    };
7f561c08de6b Initial load
duke
parents:
diff changeset
    61
    // default (Java) encoding if none supplied:
7f561c08de6b Initial load
duke
parents:
diff changeset
    62
    static final String DEFAULT_ENCODING = "UTF8";
7f561c08de6b Initial load
duke
parents:
diff changeset
    63
7f561c08de6b Initial load
duke
parents:
diff changeset
    64
    // note that the size of this Hashtable
7f561c08de6b Initial load
duke
parents:
diff changeset
    65
    // is bounded by the number of encodings recognized by EncodingMap;
7f561c08de6b Initial load
duke
parents:
diff changeset
    66
    // therefore it poses no static mutability risk.
7f561c08de6b Initial load
duke
parents:
diff changeset
    67
    static Hashtable _encodings = new Hashtable();
7f561c08de6b Initial load
duke
parents:
diff changeset
    68
7f561c08de6b Initial load
duke
parents:
diff changeset
    69
    /**
7f561c08de6b Initial load
duke
parents:
diff changeset
    70
     * @param encoding a MIME charset name, or null.
7f561c08de6b Initial load
duke
parents:
diff changeset
    71
     */
7f561c08de6b Initial load
duke
parents:
diff changeset
    72
    static EncodingInfo getEncodingInfo(String encoding, boolean allowJavaNames) throws UnsupportedEncodingException {
7f561c08de6b Initial load
duke
parents:
diff changeset
    73
        EncodingInfo eInfo = null;
7f561c08de6b Initial load
duke
parents:
diff changeset
    74
        if (encoding == null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
    75
            if((eInfo = (EncodingInfo)_encodings.get(DEFAULT_ENCODING)) != null)
7f561c08de6b Initial load
duke
parents:
diff changeset
    76
                return eInfo;
7f561c08de6b Initial load
duke
parents:
diff changeset
    77
            eInfo = new EncodingInfo(EncodingMap.getJava2IANAMapping(DEFAULT_ENCODING), DEFAULT_ENCODING, LAST_PRINTABLE_UNICODE);
7f561c08de6b Initial load
duke
parents:
diff changeset
    78
            _encodings.put(DEFAULT_ENCODING, eInfo);
7f561c08de6b Initial load
duke
parents:
diff changeset
    79
            return eInfo;
7f561c08de6b Initial load
duke
parents:
diff changeset
    80
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
    81
        // need to convert it to upper case:
7f561c08de6b Initial load
duke
parents:
diff changeset
    82
        encoding = encoding.toUpperCase(Locale.ENGLISH);
7f561c08de6b Initial load
duke
parents:
diff changeset
    83
        String jName = EncodingMap.getIANA2JavaMapping(encoding);
7f561c08de6b Initial load
duke
parents:
diff changeset
    84
        if(jName == null) {
7f561c08de6b Initial load
duke
parents:
diff changeset
    85
            // see if the encoding passed in is a Java encoding name.
7f561c08de6b Initial load
duke
parents:
diff changeset
    86
            if(allowJavaNames ) {
7f561c08de6b Initial load
duke
parents:
diff changeset
    87
                EncodingInfo.testJavaEncodingName(encoding);
7f561c08de6b Initial load
duke
parents:
diff changeset
    88
                if((eInfo = (EncodingInfo)_encodings.get(encoding)) != null)
7f561c08de6b Initial load
duke
parents:
diff changeset
    89
                    return eInfo;
7f561c08de6b Initial load
duke
parents:
diff changeset
    90
                // is it known to be unicode-compliant?
7f561c08de6b Initial load
duke
parents:
diff changeset
    91
                int i=0;
7f561c08de6b Initial load
duke
parents:
diff changeset
    92
                for(; i<UNICODE_ENCODINGS.length; i++) {
7f561c08de6b Initial load
duke
parents:
diff changeset
    93
                    if(UNICODE_ENCODINGS[i].equalsIgnoreCase(encoding)) {
7f561c08de6b Initial load
duke
parents:
diff changeset
    94
                        eInfo = new EncodingInfo(EncodingMap.getJava2IANAMapping(encoding), encoding, LAST_PRINTABLE_UNICODE);
7f561c08de6b Initial load
duke
parents:
diff changeset
    95
                        break;
7f561c08de6b Initial load
duke
parents:
diff changeset
    96
                    }
7f561c08de6b Initial load
duke
parents:
diff changeset
    97
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
    98
                if(i == UNICODE_ENCODINGS.length) {
7f561c08de6b Initial load
duke
parents:
diff changeset
    99
                    eInfo = new EncodingInfo(EncodingMap.getJava2IANAMapping(encoding), encoding, DEFAULT_LAST_PRINTABLE);
7f561c08de6b Initial load
duke
parents:
diff changeset
   100
                }
7f561c08de6b Initial load
duke
parents:
diff changeset
   101
                _encodings.put(encoding, eInfo);
7f561c08de6b Initial load
duke
parents:
diff changeset
   102
                return eInfo;
7f561c08de6b Initial load
duke
parents:
diff changeset
   103
            } else {
7f561c08de6b Initial load
duke
parents:
diff changeset
   104
                throw new UnsupportedEncodingException(encoding);
7f561c08de6b Initial load
duke
parents:
diff changeset
   105
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
   106
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   107
        if ((eInfo = (EncodingInfo)_encodings.get(jName)) != null)
7f561c08de6b Initial load
duke
parents:
diff changeset
   108
            return eInfo;
7f561c08de6b Initial load
duke
parents:
diff changeset
   109
        // have to create one...
7f561c08de6b Initial load
duke
parents:
diff changeset
   110
        // is it known to be unicode-compliant?
7f561c08de6b Initial load
duke
parents:
diff changeset
   111
        int i=0;
7f561c08de6b Initial load
duke
parents:
diff changeset
   112
        for(; i<UNICODE_ENCODINGS.length; i++) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   113
            if(UNICODE_ENCODINGS[i].equalsIgnoreCase(jName)) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   114
                eInfo = new EncodingInfo(encoding, jName, LAST_PRINTABLE_UNICODE);
7f561c08de6b Initial load
duke
parents:
diff changeset
   115
                break;
7f561c08de6b Initial load
duke
parents:
diff changeset
   116
            }
7f561c08de6b Initial load
duke
parents:
diff changeset
   117
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   118
        if(i == UNICODE_ENCODINGS.length) {
7f561c08de6b Initial load
duke
parents:
diff changeset
   119
            eInfo = new EncodingInfo(encoding, jName, DEFAULT_LAST_PRINTABLE);
7f561c08de6b Initial load
duke
parents:
diff changeset
   120
        }
7f561c08de6b Initial load
duke
parents:
diff changeset
   121
        _encodings.put(jName, eInfo);
7f561c08de6b Initial load
duke
parents:
diff changeset
   122
        return eInfo;
7f561c08de6b Initial load
duke
parents:
diff changeset
   123
    }
7f561c08de6b Initial load
duke
parents:
diff changeset
   124
7f561c08de6b Initial load
duke
parents:
diff changeset
   125
    static final String JIS_DANGER_CHARS
7f561c08de6b Initial load
duke
parents:
diff changeset
   126
    = "\\\u007e\u007f\u00a2\u00a3\u00a5\u00ac"
7f561c08de6b Initial load
duke
parents:
diff changeset
   127
    +"\u2014\u2015\u2016\u2026\u203e\u203e\u2225\u222f\u301c"
7f561c08de6b Initial load
duke
parents:
diff changeset
   128
    +"\uff3c\uff5e\uffe0\uffe1\uffe2\uffe3";
7f561c08de6b Initial load
duke
parents:
diff changeset
   129
7f561c08de6b Initial load
duke
parents:
diff changeset
   130
}