You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mu...@apache.org on 2009/09/28 02:43:39 UTC
svn commit: r819435 [21/23] - in
/struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper:
./ compiler/ compiler/tagplugin/ el/ runtime/ security/ servlet/
tagplugins/ tagplugins/jstl/ tagplugins/jstl/core/ util/ xmlparser/
Added: struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/EncodingMap.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/EncodingMap.java?rev=819435&view=auto
==============================================================================
--- struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/EncodingMap.java (added)
+++ struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/EncodingMap.java Mon Sep 28 00:43:34 2009
@@ -0,0 +1,1020 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.apache.org. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.jasper.xmlparser;
+
+import java.util.Hashtable;
+
+/**
+ * EncodingMap is a convenience class which handles conversions between
+ * IANA encoding names and Java encoding names, and vice versa. The
+ * encoding names used in XML instance documents <strong>must</strong>
+ * be the IANA encoding names specified or one of the aliases for those names
+ * which IANA defines.
+ * <p>
+ * <TABLE BORDER="0" WIDTH="100%">
+ * <TR>
+ * <TD WIDTH="33%">
+ * <P ALIGN="CENTER"><B>Common Name</B>
+ * </TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER"><B>Use this name in XML files</B>
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER"><B>Name Type</B>
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER"><B>Xerces converts to this Java Encoder Name</B>
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">8 bit Unicode</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">UTF-8
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">UTF8
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 1</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-1
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-1
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 2</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-2
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-2
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 3</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-3
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-3
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 4</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-4
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-4
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin Cyrillic</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-5
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-5
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin Arabic</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-6
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-6
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin Greek</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-7
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-7
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin Hebrew</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-8
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-8
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">ISO Latin 5</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ISO-8859-9
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">ISO-8859-9
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: US</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-us
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp037
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Canada</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-ca
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp037
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Netherlands</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-nl
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp037
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Denmark</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-dk
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp277
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Norway</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-no
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp277
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Finland</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-fi
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp278
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Sweden</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-se
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp278
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Italy</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-it
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp280
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Spain, Latin America</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-es
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp284
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Great Britain</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-gb
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp285
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: France</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-fr
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp297
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Arabic</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-ar1
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp420
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Hebrew</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-he
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp424
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Switzerland</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-ch
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp500
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Roece</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-roece
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp870
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Yugoslavia</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-yu
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp870
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Iceland</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-is
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp871
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">EBCDIC: Urdu</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">ebcdic-cp-ar2
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">IANA
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">cp918
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Chinese for PRC, mixed 1/2 byte</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">gb2312
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">GB2312
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Extended Unix Code, packed for Japanese</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">euc-jp
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">eucjis
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Japanese: iso-2022-jp</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">iso-2020-jp
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">JIS
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Japanese: Shift JIS</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">Shift_JIS
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">SJIS
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Chinese: Big5</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">Big5
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">Big5
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Extended Unix Code, packed for Korean</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">euc-kr
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">iso2022kr
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD WIDTH="33%">Cyrillic</TD>
+ * <TD WIDTH="15%">
+ * <P ALIGN="CENTER">koi8-r
+ * </TD>
+ * <TD WIDTH="12%">
+ * <P ALIGN="CENTER">MIME
+ * </TD>
+ * <TD WIDTH="31%">
+ * <P ALIGN="CENTER">koi8-r
+ * </TD>
+ * </TR>
+ * </TABLE>
+ *
+ * @author TAMURA Kent, IBM
+ * @author Andy Clark, IBM
+ *
+ * @version $Id: EncodingMap.java 467222 2006-10-24 03:17:11Z markt $
+ */
+public class EncodingMap {
+
+ //
+ // Data
+ //
+
+ /** fIANA2JavaMap */
+ protected final static Hashtable fIANA2JavaMap = new Hashtable();
+
+ /** fJava2IANAMap */
+ protected final static Hashtable fJava2IANAMap = new Hashtable();
+
+ //
+ // Static initialization
+ //
+
+ static {
+
+ // add IANA to Java encoding mappings.
+ fIANA2JavaMap.put("BIG5", "Big5");
+ fIANA2JavaMap.put("CSBIG5", "Big5");
+ fIANA2JavaMap.put("CP037", "CP037");
+ fIANA2JavaMap.put("IBM037", "CP037");
+ fIANA2JavaMap.put("CSIBM037", "CP037");
+ fIANA2JavaMap.put("EBCDIC-CP-US", "CP037");
+ fIANA2JavaMap.put("EBCDIC-CP-CA", "CP037");
+ fIANA2JavaMap.put("EBCDIC-CP-NL", "CP037");
+ fIANA2JavaMap.put("EBCDIC-CP-WT", "CP037");
+ fIANA2JavaMap.put("IBM273", "CP273");
+ fIANA2JavaMap.put("CP273", "CP273");
+ fIANA2JavaMap.put("CSIBM273", "CP273");
+ fIANA2JavaMap.put("IBM277", "CP277");
+ fIANA2JavaMap.put("CP277", "CP277");
+ fIANA2JavaMap.put("CSIBM277", "CP277");
+ fIANA2JavaMap.put("EBCDIC-CP-DK", "CP277");
+ fIANA2JavaMap.put("EBCDIC-CP-NO", "CP277");
+ fIANA2JavaMap.put("IBM278", "CP278");
+ fIANA2JavaMap.put("CP278", "CP278");
+ fIANA2JavaMap.put("CSIBM278", "CP278");
+ fIANA2JavaMap.put("EBCDIC-CP-FI", "CP278");
+ fIANA2JavaMap.put("EBCDIC-CP-SE", "CP278");
+ fIANA2JavaMap.put("IBM280", "CP280");
+ fIANA2JavaMap.put("CP280", "CP280");
+ fIANA2JavaMap.put("CSIBM280", "CP280");
+ fIANA2JavaMap.put("EBCDIC-CP-IT", "CP280");
+ fIANA2JavaMap.put("IBM284", "CP284");
+ fIANA2JavaMap.put("CP284", "CP284");
+ fIANA2JavaMap.put("CSIBM284", "CP284");
+ fIANA2JavaMap.put("EBCDIC-CP-ES", "CP284");
+ fIANA2JavaMap.put("EBCDIC-CP-GB", "CP285");
+ fIANA2JavaMap.put("IBM285", "CP285");
+ fIANA2JavaMap.put("CP285", "CP285");
+ fIANA2JavaMap.put("CSIBM285", "CP285");
+ fIANA2JavaMap.put("EBCDIC-JP-KANA", "CP290");
+ fIANA2JavaMap.put("IBM290", "CP290");
+ fIANA2JavaMap.put("CP290", "CP290");
+ fIANA2JavaMap.put("CSIBM290", "CP290");
+ fIANA2JavaMap.put("EBCDIC-CP-FR", "CP297");
+ fIANA2JavaMap.put("IBM297", "CP297");
+ fIANA2JavaMap.put("CP297", "CP297");
+ fIANA2JavaMap.put("CSIBM297", "CP297");
+ fIANA2JavaMap.put("EBCDIC-CP-AR1", "CP420");
+ fIANA2JavaMap.put("IBM420", "CP420");
+ fIANA2JavaMap.put("CP420", "CP420");
+ fIANA2JavaMap.put("CSIBM420", "CP420");
+ fIANA2JavaMap.put("EBCDIC-CP-HE", "CP424");
+ fIANA2JavaMap.put("IBM424", "CP424");
+ fIANA2JavaMap.put("CP424", "CP424");
+ fIANA2JavaMap.put("CSIBM424", "CP424");
+ fIANA2JavaMap.put("IBM437", "CP437");
+ fIANA2JavaMap.put("437", "CP437");
+ fIANA2JavaMap.put("CP437", "CP437");
+ fIANA2JavaMap.put("CSPC8CODEPAGE437", "CP437");
+ fIANA2JavaMap.put("EBCDIC-CP-CH", "CP500");
+ fIANA2JavaMap.put("IBM500", "CP500");
+ fIANA2JavaMap.put("CP500", "CP500");
+ fIANA2JavaMap.put("CSIBM500", "CP500");
+ fIANA2JavaMap.put("EBCDIC-CP-CH", "CP500");
+ fIANA2JavaMap.put("EBCDIC-CP-BE", "CP500");
+ fIANA2JavaMap.put("IBM775", "CP775");
+ fIANA2JavaMap.put("CP775", "CP775");
+ fIANA2JavaMap.put("CSPC775BALTIC", "CP775");
+ fIANA2JavaMap.put("IBM850", "CP850");
+ fIANA2JavaMap.put("850", "CP850");
+ fIANA2JavaMap.put("CP850", "CP850");
+ fIANA2JavaMap.put("CSPC850MULTILINGUAL", "CP850");
+ fIANA2JavaMap.put("IBM852", "CP852");
+ fIANA2JavaMap.put("852", "CP852");
+ fIANA2JavaMap.put("CP852", "CP852");
+ fIANA2JavaMap.put("CSPCP852", "CP852");
+ fIANA2JavaMap.put("IBM855", "CP855");
+ fIANA2JavaMap.put("855", "CP855");
+ fIANA2JavaMap.put("CP855", "CP855");
+ fIANA2JavaMap.put("CSIBM855", "CP855");
+ fIANA2JavaMap.put("IBM857", "CP857");
+ fIANA2JavaMap.put("857", "CP857");
+ fIANA2JavaMap.put("CP857", "CP857");
+ fIANA2JavaMap.put("CSIBM857", "CP857");
+ fIANA2JavaMap.put("IBM00858", "CP858");
+ fIANA2JavaMap.put("CP00858", "CP858");
+ fIANA2JavaMap.put("CCSID00858", "CP858");
+ fIANA2JavaMap.put("IBM860", "CP860");
+ fIANA2JavaMap.put("860", "CP860");
+ fIANA2JavaMap.put("CP860", "CP860");
+ fIANA2JavaMap.put("CSIBM860", "CP860");
+ fIANA2JavaMap.put("IBM861", "CP861");
+ fIANA2JavaMap.put("861", "CP861");
+ fIANA2JavaMap.put("CP861", "CP861");
+ fIANA2JavaMap.put("CP-IS", "CP861");
+ fIANA2JavaMap.put("CSIBM861", "CP861");
+ fIANA2JavaMap.put("IBM862", "CP862");
+ fIANA2JavaMap.put("862", "CP862");
+ fIANA2JavaMap.put("CP862", "CP862");
+ fIANA2JavaMap.put("CSPC862LATINHEBREW", "CP862");
+ fIANA2JavaMap.put("IBM863", "CP863");
+ fIANA2JavaMap.put("863", "CP863");
+ fIANA2JavaMap.put("CP863", "CP863");
+ fIANA2JavaMap.put("CSIBM863", "CP863");
+ fIANA2JavaMap.put("IBM864", "CP864");
+ fIANA2JavaMap.put("CP864", "CP864");
+ fIANA2JavaMap.put("CSIBM864", "CP864");
+ fIANA2JavaMap.put("IBM865", "CP865");
+ fIANA2JavaMap.put("865", "CP865");
+ fIANA2JavaMap.put("CP865", "CP865");
+ fIANA2JavaMap.put("CSIBM865", "CP865");
+ fIANA2JavaMap.put("IBM866", "CP866");
+ fIANA2JavaMap.put("866", "CP866");
+ fIANA2JavaMap.put("CP866", "CP866");
+ fIANA2JavaMap.put("CSIBM866", "CP866");
+ fIANA2JavaMap.put("IBM868", "CP868");
+ fIANA2JavaMap.put("CP868", "CP868");
+ fIANA2JavaMap.put("CSIBM868", "CP868");
+ fIANA2JavaMap.put("CP-AR", "CP868");
+ fIANA2JavaMap.put("IBM869", "CP869");
+ fIANA2JavaMap.put("CP869", "CP869");
+ fIANA2JavaMap.put("CSIBM869", "CP869");
+ fIANA2JavaMap.put("CP-GR", "CP869");
+ fIANA2JavaMap.put("IBM870", "CP870");
+ fIANA2JavaMap.put("CP870", "CP870");
+ fIANA2JavaMap.put("CSIBM870", "CP870");
+ fIANA2JavaMap.put("EBCDIC-CP-ROECE", "CP870");
+ fIANA2JavaMap.put("EBCDIC-CP-YU", "CP870");
+ fIANA2JavaMap.put("IBM871", "CP871");
+ fIANA2JavaMap.put("CP871", "CP871");
+ fIANA2JavaMap.put("CSIBM871", "CP871");
+ fIANA2JavaMap.put("EBCDIC-CP-IS", "CP871");
+ fIANA2JavaMap.put("IBM918", "CP918");
+ fIANA2JavaMap.put("CP918", "CP918");
+ fIANA2JavaMap.put("CSIBM918", "CP918");
+ fIANA2JavaMap.put("EBCDIC-CP-AR2", "CP918");
+ fIANA2JavaMap.put("IBM00924", "CP924");
+ fIANA2JavaMap.put("CP00924", "CP924");
+ fIANA2JavaMap.put("CCSID00924", "CP924");
+ // is this an error???
+ fIANA2JavaMap.put("EBCDIC-LATIN9--EURO", "CP924");
+ fIANA2JavaMap.put("IBM1026", "CP1026");
+ fIANA2JavaMap.put("CP1026", "CP1026");
+ fIANA2JavaMap.put("CSIBM1026", "CP1026");
+ fIANA2JavaMap.put("IBM01140", "Cp1140");
+ fIANA2JavaMap.put("CP01140", "Cp1140");
+ fIANA2JavaMap.put("CCSID01140", "Cp1140");
+ fIANA2JavaMap.put("IBM01141", "Cp1141");
+ fIANA2JavaMap.put("CP01141", "Cp1141");
+ fIANA2JavaMap.put("CCSID01141", "Cp1141");
+ fIANA2JavaMap.put("IBM01142", "Cp1142");
+ fIANA2JavaMap.put("CP01142", "Cp1142");
+ fIANA2JavaMap.put("CCSID01142", "Cp1142");
+ fIANA2JavaMap.put("IBM01143", "Cp1143");
+ fIANA2JavaMap.put("CP01143", "Cp1143");
+ fIANA2JavaMap.put("CCSID01143", "Cp1143");
+ fIANA2JavaMap.put("IBM01144", "Cp1144");
+ fIANA2JavaMap.put("CP01144", "Cp1144");
+ fIANA2JavaMap.put("CCSID01144", "Cp1144");
+ fIANA2JavaMap.put("IBM01145", "Cp1145");
+ fIANA2JavaMap.put("CP01145", "Cp1145");
+ fIANA2JavaMap.put("CCSID01145", "Cp1145");
+ fIANA2JavaMap.put("IBM01146", "Cp1146");
+ fIANA2JavaMap.put("CP01146", "Cp1146");
+ fIANA2JavaMap.put("CCSID01146", "Cp1146");
+ fIANA2JavaMap.put("IBM01147", "Cp1147");
+ fIANA2JavaMap.put("CP01147", "Cp1147");
+ fIANA2JavaMap.put("CCSID01147", "Cp1147");
+ fIANA2JavaMap.put("IBM01148", "Cp1148");
+ fIANA2JavaMap.put("CP01148", "Cp1148");
+ fIANA2JavaMap.put("CCSID01148", "Cp1148");
+ fIANA2JavaMap.put("IBM01149", "Cp1149");
+ fIANA2JavaMap.put("CP01149", "Cp1149");
+ fIANA2JavaMap.put("CCSID01149", "Cp1149");
+ fIANA2JavaMap.put("EUC-JP", "EUCJIS");
+ fIANA2JavaMap.put("CSEUCPKDFMTJAPANESE", "EUCJIS");
+ fIANA2JavaMap.put("EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", "EUCJIS");
+ fIANA2JavaMap.put("EUC-KR", "KSC5601");
+ fIANA2JavaMap.put("CSEUCKR", "KSC5601");
+ fIANA2JavaMap.put("KS_C_5601-1987", "KS_C_5601-1987");
+ fIANA2JavaMap.put("ISO-IR-149", "KS_C_5601-1987");
+ fIANA2JavaMap.put("KS_C_5601-1989", "KS_C_5601-1987");
+ fIANA2JavaMap.put("KSC_5601", "KS_C_5601-1987");
+ fIANA2JavaMap.put("KOREAN", "KS_C_5601-1987");
+ fIANA2JavaMap.put("CSKSC56011987", "KS_C_5601-1987");
+ fIANA2JavaMap.put("GB2312", "GB2312");
+ fIANA2JavaMap.put("CSGB2312", "GB2312");
+ fIANA2JavaMap.put("ISO-2022-JP", "JIS");
+ fIANA2JavaMap.put("CSISO2022JP", "JIS");
+ fIANA2JavaMap.put("ISO-2022-KR", "ISO2022KR");
+ fIANA2JavaMap.put("CSISO2022KR", "ISO2022KR");
+ fIANA2JavaMap.put("ISO-2022-CN", "ISO2022CN");
+
+ fIANA2JavaMap.put("X0201", "JIS0201");
+ fIANA2JavaMap.put("CSISO13JISC6220JP", "JIS0201");
+ fIANA2JavaMap.put("X0208", "JIS0208");
+ fIANA2JavaMap.put("ISO-IR-87", "JIS0208");
+ fIANA2JavaMap.put("X0208dbiJIS_X0208-1983", "JIS0208");
+ fIANA2JavaMap.put("CSISO87JISX0208", "JIS0208");
+ fIANA2JavaMap.put("X0212", "JIS0212");
+ fIANA2JavaMap.put("ISO-IR-159", "JIS0212");
+ fIANA2JavaMap.put("CSISO159JISX02121990", "JIS0212");
+ fIANA2JavaMap.put("GB18030", "GB18030");
+ fIANA2JavaMap.put("GBK", "GBK");
+ fIANA2JavaMap.put("CP936", "GBK");
+ fIANA2JavaMap.put("MS936", "GBK");
+ fIANA2JavaMap.put("WINDOWS-936", "GBK");
+ fIANA2JavaMap.put("SHIFT_JIS", "SJIS");
+ fIANA2JavaMap.put("CSSHIFTJIS", "SJIS");
+ fIANA2JavaMap.put("MS_KANJI", "SJIS");
+ fIANA2JavaMap.put("WINDOWS-31J", "MS932");
+ fIANA2JavaMap.put("CSWINDOWS31J", "MS932");
+
+ // Add support for Cp1252 and its friends
+ fIANA2JavaMap.put("WINDOWS-1250", "Cp1250");
+ fIANA2JavaMap.put("WINDOWS-1251", "Cp1251");
+ fIANA2JavaMap.put("WINDOWS-1252", "Cp1252");
+ fIANA2JavaMap.put("WINDOWS-1253", "Cp1253");
+ fIANA2JavaMap.put("WINDOWS-1254", "Cp1254");
+ fIANA2JavaMap.put("WINDOWS-1255", "Cp1255");
+ fIANA2JavaMap.put("WINDOWS-1256", "Cp1256");
+ fIANA2JavaMap.put("WINDOWS-1257", "Cp1257");
+ fIANA2JavaMap.put("WINDOWS-1258", "Cp1258");
+ fIANA2JavaMap.put("TIS-620", "TIS620");
+
+ fIANA2JavaMap.put("ISO-8859-1", "ISO8859_1");
+ fIANA2JavaMap.put("ISO-IR-100", "ISO8859_1");
+ fIANA2JavaMap.put("ISO_8859-1", "ISO8859_1");
+ fIANA2JavaMap.put("LATIN1", "ISO8859_1");
+ fIANA2JavaMap.put("CSISOLATIN1", "ISO8859_1");
+ fIANA2JavaMap.put("L1", "ISO8859_1");
+ fIANA2JavaMap.put("IBM819", "ISO8859_1");
+ fIANA2JavaMap.put("CP819", "ISO8859_1");
+
+ fIANA2JavaMap.put("ISO-8859-2", "ISO8859_2");
+ fIANA2JavaMap.put("ISO-IR-101", "ISO8859_2");
+ fIANA2JavaMap.put("ISO_8859-2", "ISO8859_2");
+ fIANA2JavaMap.put("LATIN2", "ISO8859_2");
+ fIANA2JavaMap.put("CSISOLATIN2", "ISO8859_2");
+ fIANA2JavaMap.put("L2", "ISO8859_2");
+
+ fIANA2JavaMap.put("ISO-8859-3", "ISO8859_3");
+ fIANA2JavaMap.put("ISO-IR-109", "ISO8859_3");
+ fIANA2JavaMap.put("ISO_8859-3", "ISO8859_3");
+ fIANA2JavaMap.put("LATIN3", "ISO8859_3");
+ fIANA2JavaMap.put("CSISOLATIN3", "ISO8859_3");
+ fIANA2JavaMap.put("L3", "ISO8859_3");
+
+ fIANA2JavaMap.put("ISO-8859-4", "ISO8859_4");
+ fIANA2JavaMap.put("ISO-IR-110", "ISO8859_4");
+ fIANA2JavaMap.put("ISO_8859-4", "ISO8859_4");
+ fIANA2JavaMap.put("LATIN4", "ISO8859_4");
+ fIANA2JavaMap.put("CSISOLATIN4", "ISO8859_4");
+ fIANA2JavaMap.put("L4", "ISO8859_4");
+
+ fIANA2JavaMap.put("ISO-8859-5", "ISO8859_5");
+ fIANA2JavaMap.put("ISO-IR-144", "ISO8859_5");
+ fIANA2JavaMap.put("ISO_8859-5", "ISO8859_5");
+ fIANA2JavaMap.put("CYRILLIC", "ISO8859_5");
+ fIANA2JavaMap.put("CSISOLATINCYRILLIC", "ISO8859_5");
+
+ fIANA2JavaMap.put("ISO-8859-6", "ISO8859_6");
+ fIANA2JavaMap.put("ISO-IR-127", "ISO8859_6");
+ fIANA2JavaMap.put("ISO_8859-6", "ISO8859_6");
+ fIANA2JavaMap.put("ECMA-114", "ISO8859_6");
+ fIANA2JavaMap.put("ASMO-708", "ISO8859_6");
+ fIANA2JavaMap.put("ARABIC", "ISO8859_6");
+ fIANA2JavaMap.put("CSISOLATINARABIC", "ISO8859_6");
+
+ fIANA2JavaMap.put("ISO-8859-7", "ISO8859_7");
+ fIANA2JavaMap.put("ISO-IR-126", "ISO8859_7");
+ fIANA2JavaMap.put("ISO_8859-7", "ISO8859_7");
+ fIANA2JavaMap.put("ELOT_928", "ISO8859_7");
+ fIANA2JavaMap.put("ECMA-118", "ISO8859_7");
+ fIANA2JavaMap.put("GREEK", "ISO8859_7");
+ fIANA2JavaMap.put("CSISOLATINGREEK", "ISO8859_7");
+ fIANA2JavaMap.put("GREEK8", "ISO8859_7");
+
+ fIANA2JavaMap.put("ISO-8859-8", "ISO8859_8");
+ fIANA2JavaMap.put("ISO-8859-8-I", "ISO8859_8"); // added since this encoding only differs w.r.t. presentation
+ fIANA2JavaMap.put("ISO-IR-138", "ISO8859_8");
+ fIANA2JavaMap.put("ISO_8859-8", "ISO8859_8");
+ fIANA2JavaMap.put("HEBREW", "ISO8859_8");
+ fIANA2JavaMap.put("CSISOLATINHEBREW", "ISO8859_8");
+
+ fIANA2JavaMap.put("ISO-8859-9", "ISO8859_9");
+ fIANA2JavaMap.put("ISO-IR-148", "ISO8859_9");
+ fIANA2JavaMap.put("ISO_8859-9", "ISO8859_9");
+ fIANA2JavaMap.put("LATIN5", "ISO8859_9");
+ fIANA2JavaMap.put("CSISOLATIN5", "ISO8859_9");
+ fIANA2JavaMap.put("L5", "ISO8859_9");
+
+ fIANA2JavaMap.put("ISO-8859-13", "ISO8859_13");
+
+ fIANA2JavaMap.put("ISO-8859-15", "ISO8859_15_FDIS");
+ fIANA2JavaMap.put("ISO_8859-15", "ISO8859_15_FDIS");
+ fIANA2JavaMap.put("LATIN-9", "ISO8859_15_FDIS");
+
+ fIANA2JavaMap.put("KOI8-R", "KOI8_R");
+ fIANA2JavaMap.put("CSKOI8R", "KOI8_R");
+ fIANA2JavaMap.put("US-ASCII", "ASCII");
+ fIANA2JavaMap.put("ISO-IR-6", "ASCII");
+ fIANA2JavaMap.put("ANSI_X3.4-1968", "ASCII");
+ fIANA2JavaMap.put("ANSI_X3.4-1986", "ASCII");
+ fIANA2JavaMap.put("ISO_646.IRV:1991", "ASCII");
+ fIANA2JavaMap.put("ASCII", "ASCII");
+ fIANA2JavaMap.put("CSASCII", "ASCII");
+ fIANA2JavaMap.put("ISO646-US", "ASCII");
+ fIANA2JavaMap.put("US", "ASCII");
+ fIANA2JavaMap.put("IBM367", "ASCII");
+ fIANA2JavaMap.put("CP367", "ASCII");
+ fIANA2JavaMap.put("UTF-8", "UTF8");
+ fIANA2JavaMap.put("UTF-16", "UTF-16");
+ fIANA2JavaMap.put("UTF-16BE", "UnicodeBig");
+ fIANA2JavaMap.put("UTF-16LE", "UnicodeLittle");
+
+ // support for 1047, as proposed to be added to the
+ // IANA registry in
+ // http://lists.w3.org/Archives/Public/ietf-charset/2002JulSep/0049.html
+ fIANA2JavaMap.put("IBM-1047", "Cp1047");
+ fIANA2JavaMap.put("IBM1047", "Cp1047");
+ fIANA2JavaMap.put("CP1047", "Cp1047");
+
+ // Adding new aliases as proposed in
+ // http://lists.w3.org/Archives/Public/ietf-charset/2002JulSep/0058.html
+ fIANA2JavaMap.put("IBM-37", "CP037");
+ fIANA2JavaMap.put("IBM-273", "CP273");
+ fIANA2JavaMap.put("IBM-277", "CP277");
+ fIANA2JavaMap.put("IBM-278", "CP278");
+ fIANA2JavaMap.put("IBM-280", "CP280");
+ fIANA2JavaMap.put("IBM-284", "CP284");
+ fIANA2JavaMap.put("IBM-285", "CP285");
+ fIANA2JavaMap.put("IBM-290", "CP290");
+ fIANA2JavaMap.put("IBM-297", "CP297");
+ fIANA2JavaMap.put("IBM-420", "CP420");
+ fIANA2JavaMap.put("IBM-424", "CP424");
+ fIANA2JavaMap.put("IBM-437", "CP437");
+ fIANA2JavaMap.put("IBM-500", "CP500");
+ fIANA2JavaMap.put("IBM-775", "CP775");
+ fIANA2JavaMap.put("IBM-850", "CP850");
+ fIANA2JavaMap.put("IBM-852", "CP852");
+ fIANA2JavaMap.put("IBM-855", "CP855");
+ fIANA2JavaMap.put("IBM-857", "CP857");
+ fIANA2JavaMap.put("IBM-858", "CP858");
+ fIANA2JavaMap.put("IBM-860", "CP860");
+ fIANA2JavaMap.put("IBM-861", "CP861");
+ fIANA2JavaMap.put("IBM-862", "CP862");
+ fIANA2JavaMap.put("IBM-863", "CP863");
+ fIANA2JavaMap.put("IBM-864", "CP864");
+ fIANA2JavaMap.put("IBM-865", "CP865");
+ fIANA2JavaMap.put("IBM-866", "CP866");
+ fIANA2JavaMap.put("IBM-868", "CP868");
+ fIANA2JavaMap.put("IBM-869", "CP869");
+ fIANA2JavaMap.put("IBM-870", "CP870");
+ fIANA2JavaMap.put("IBM-871", "CP871");
+ fIANA2JavaMap.put("IBM-918", "CP918");
+ fIANA2JavaMap.put("IBM-924", "CP924");
+ fIANA2JavaMap.put("IBM-1026", "CP1026");
+ fIANA2JavaMap.put("IBM-1140", "Cp1140");
+ fIANA2JavaMap.put("IBM-1141", "Cp1141");
+ fIANA2JavaMap.put("IBM-1142", "Cp1142");
+ fIANA2JavaMap.put("IBM-1143", "Cp1143");
+ fIANA2JavaMap.put("IBM-1144", "Cp1144");
+ fIANA2JavaMap.put("IBM-1145", "Cp1145");
+ fIANA2JavaMap.put("IBM-1146", "Cp1146");
+ fIANA2JavaMap.put("IBM-1147", "Cp1147");
+ fIANA2JavaMap.put("IBM-1148", "Cp1148");
+ fIANA2JavaMap.put("IBM-1149", "Cp1149");
+ fIANA2JavaMap.put("IBM-819", "ISO8859_1");
+ fIANA2JavaMap.put("IBM-367", "ASCII");
+
+ // REVISIT:
+ // j:CNS11643 -> EUC-TW?
+ // ISO-2022-CN? ISO-2022-CN-EXT?
+
+ // add Java to IANA encoding mappings
+ //fJava2IANAMap.put("8859_1", "US-ASCII"); // ?
+ fJava2IANAMap.put("ISO8859_1", "ISO-8859-1");
+ fJava2IANAMap.put("ISO8859_2", "ISO-8859-2");
+ fJava2IANAMap.put("ISO8859_3", "ISO-8859-3");
+ fJava2IANAMap.put("ISO8859_4", "ISO-8859-4");
+ fJava2IANAMap.put("ISO8859_5", "ISO-8859-5");
+ fJava2IANAMap.put("ISO8859_6", "ISO-8859-6");
+ fJava2IANAMap.put("ISO8859_7", "ISO-8859-7");
+ fJava2IANAMap.put("ISO8859_8", "ISO-8859-8");
+ fJava2IANAMap.put("ISO8859_9", "ISO-8859-9");
+ fJava2IANAMap.put("ISO8859_13", "ISO-8859-13");
+ fJava2IANAMap.put("ISO8859_15", "ISO-8859-15");
+ fJava2IANAMap.put("ISO8859_15_FDIS", "ISO-8859-15");
+ fJava2IANAMap.put("Big5", "BIG5");
+ fJava2IANAMap.put("CP037", "EBCDIC-CP-US");
+ fJava2IANAMap.put("CP273", "IBM273");
+ fJava2IANAMap.put("CP277", "EBCDIC-CP-DK");
+ fJava2IANAMap.put("CP278", "EBCDIC-CP-FI");
+ fJava2IANAMap.put("CP280", "EBCDIC-CP-IT");
+ fJava2IANAMap.put("CP284", "EBCDIC-CP-ES");
+ fJava2IANAMap.put("CP285", "EBCDIC-CP-GB");
+ fJava2IANAMap.put("CP290", "EBCDIC-JP-KANA");
+ fJava2IANAMap.put("CP297", "EBCDIC-CP-FR");
+ fJava2IANAMap.put("CP420", "EBCDIC-CP-AR1");
+ fJava2IANAMap.put("CP424", "EBCDIC-CP-HE");
+ fJava2IANAMap.put("CP437", "IBM437");
+ fJava2IANAMap.put("CP500", "EBCDIC-CP-CH");
+ fJava2IANAMap.put("CP775", "IBM775");
+ fJava2IANAMap.put("CP850", "IBM850");
+ fJava2IANAMap.put("CP852", "IBM852");
+ fJava2IANAMap.put("CP855", "IBM855");
+ fJava2IANAMap.put("CP857", "IBM857");
+ fJava2IANAMap.put("CP858", "IBM00858");
+ fJava2IANAMap.put("CP860", "IBM860");
+ fJava2IANAMap.put("CP861", "IBM861");
+ fJava2IANAMap.put("CP862", "IBM862");
+ fJava2IANAMap.put("CP863", "IBM863");
+ fJava2IANAMap.put("CP864", "IBM864");
+ fJava2IANAMap.put("CP865", "IBM865");
+ fJava2IANAMap.put("CP866", "IBM866");
+ fJava2IANAMap.put("CP868", "IBM868");
+ fJava2IANAMap.put("CP869", "IBM869");
+ fJava2IANAMap.put("CP870", "EBCDIC-CP-ROECE");
+ fJava2IANAMap.put("CP871", "EBCDIC-CP-IS");
+ fJava2IANAMap.put("CP918", "EBCDIC-CP-AR2");
+ fJava2IANAMap.put("CP924", "IBM00924");
+ fJava2IANAMap.put("CP1026", "IBM1026");
+ fJava2IANAMap.put("Cp01140", "IBM01140");
+ fJava2IANAMap.put("Cp01141", "IBM01141");
+ fJava2IANAMap.put("Cp01142", "IBM01142");
+ fJava2IANAMap.put("Cp01143", "IBM01143");
+ fJava2IANAMap.put("Cp01144", "IBM01144");
+ fJava2IANAMap.put("Cp01145", "IBM01145");
+ fJava2IANAMap.put("Cp01146", "IBM01146");
+ fJava2IANAMap.put("Cp01147", "IBM01147");
+ fJava2IANAMap.put("Cp01148", "IBM01148");
+ fJava2IANAMap.put("Cp01149", "IBM01149");
+ fJava2IANAMap.put("EUCJIS", "EUC-JP");
+ fJava2IANAMap.put("KS_C_5601-1987", "KS_C_5601-1987");
+ fJava2IANAMap.put("GB2312", "GB2312");
+ fJava2IANAMap.put("ISO2022KR", "ISO-2022-KR");
+ fJava2IANAMap.put("ISO2022CN", "ISO-2022-CN");
+ fJava2IANAMap.put("JIS", "ISO-2022-JP");
+ fJava2IANAMap.put("KOI8_R", "KOI8-R");
+ fJava2IANAMap.put("KSC5601", "EUC-KR");
+ fJava2IANAMap.put("GB18030", "GB18030");
+ fJava2IANAMap.put("GBK", "GBK");
+ fJava2IANAMap.put("SJIS", "SHIFT_JIS");
+ fJava2IANAMap.put("MS932", "WINDOWS-31J");
+ fJava2IANAMap.put("UTF8", "UTF-8");
+ fJava2IANAMap.put("Unicode", "UTF-16");
+ fJava2IANAMap.put("UnicodeBig", "UTF-16BE");
+ fJava2IANAMap.put("UnicodeLittle", "UTF-16LE");
+ fJava2IANAMap.put("JIS0201", "X0201");
+ fJava2IANAMap.put("JIS0208", "X0208");
+ fJava2IANAMap.put("JIS0212", "ISO-IR-159");
+
+ // proposed addition (see above for details):
+ fJava2IANAMap.put("CP1047", "IBM1047");
+
+ } // <clinit>()
+
+ //
+ // Constructors
+ //
+
+ /** Default constructor. */
+ public EncodingMap() {}
+
+ //
+ // Public static methods
+ //
+
+ /**
+ * Adds an IANA to Java encoding name mapping.
+ *
+ * @param ianaEncoding The IANA encoding name.
+ * @param javaEncoding The Java encoding name.
+ */
+ public static void putIANA2JavaMapping(String ianaEncoding,
+ String javaEncoding) {
+ fIANA2JavaMap.put(ianaEncoding, javaEncoding);
+ } // putIANA2JavaMapping(String,String)
+
+ /**
+ * Returns the Java encoding name for the specified IANA encoding name.
+ *
+ * @param ianaEncoding The IANA encoding name.
+ */
+ public static String getIANA2JavaMapping(String ianaEncoding) {
+ return (String)fIANA2JavaMap.get(ianaEncoding);
+ } // getIANA2JavaMapping(String):String
+
+ /**
+ * Removes an IANA to Java encoding name mapping.
+ *
+ * @param ianaEncoding The IANA encoding name.
+ */
+ public static String removeIANA2JavaMapping(String ianaEncoding) {
+ return (String)fIANA2JavaMap.remove(ianaEncoding);
+ } // removeIANA2JavaMapping(String):String
+
+ /**
+ * Adds a Java to IANA encoding name mapping.
+ *
+ * @param javaEncoding The Java encoding name.
+ * @param ianaEncoding The IANA encoding name.
+ */
+ public static void putJava2IANAMapping(String javaEncoding,
+ String ianaEncoding) {
+ fJava2IANAMap.put(javaEncoding, ianaEncoding);
+ } // putJava2IANAMapping(String,String)
+
+ /**
+ * Returns the IANA encoding name for the specified Java encoding name.
+ *
+ * @param javaEncoding The Java encoding name.
+ */
+ public static String getJava2IANAMapping(String javaEncoding) {
+ return (String)fJava2IANAMap.get(javaEncoding);
+ } // getJava2IANAMapping(String):String
+
+ /**
+ * Removes a Java to IANA encoding name mapping.
+ *
+ * @param javaEncoding The Java encoding name.
+ */
+ public static String removeJava2IANAMapping(String javaEncoding) {
+ return (String)fJava2IANAMap.remove(javaEncoding);
+ } // removeJava2IANAMapping
+
+} // class EncodingMap
Added: struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/ParserUtils.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/ParserUtils.java?rev=819435&view=auto
==============================================================================
--- struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/ParserUtils.java (added)
+++ struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/ParserUtils.java Mon Sep 28 00:43:34 2009
@@ -0,0 +1,235 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.jasper.xmlparser;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.jasper.Constants;
+import org.apache.jasper.JasperException;
+import org.apache.jasper.compiler.Localizer;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+
+/**
+ * XML parsing utilities for processing web application deployment
+ * descriptor and tag library descriptor files. FIXME - make these
+ * use a separate class loader for the parser to be used.
+ *
+ * @author Craig R. McClanahan
+ * @version $Revision: 595799 $ $Date: 2007-11-16 21:02:12 +0100 (Fri, 16 Nov 2007) $
+ */
+
+public class ParserUtils {
+
+ /**
+ * An error handler for use when parsing XML documents.
+ */
+ static ErrorHandler errorHandler = new MyErrorHandler();
+
+ /**
+ * An entity resolver for use when parsing XML documents.
+ */
+ static EntityResolver entityResolver = new MyEntityResolver();
+
+ // Turn off for JSP 2.0 until switch over to using xschema.
+ public static boolean validating = false;
+
+
+ // --------------------------------------------------------- Public Methods
+
+ /**
+ * Parse the specified XML document, and return a <code>TreeNode</code>
+ * that corresponds to the root node of the document tree.
+ *
+ * @param uri URI of the XML document being parsed
+ * @param is Input source containing the deployment descriptor
+ *
+ * @exception JasperException if an input/output error occurs
+ * @exception JasperException if a parsing error occurs
+ */
+ public TreeNode parseXMLDocument(String uri, InputSource is)
+ throws JasperException {
+
+ Document document = null;
+
+ // Perform an XML parse of this document, via JAXP
+ try {
+ DocumentBuilderFactory factory =
+ DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ factory.setValidating(validating);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ builder.setEntityResolver(entityResolver);
+ builder.setErrorHandler(errorHandler);
+ document = builder.parse(is);
+ } catch (ParserConfigurationException ex) {
+ throw new JasperException
+ (Localizer.getMessage("jsp.error.parse.xml", uri), ex);
+ } catch (SAXParseException ex) {
+ throw new JasperException
+ (Localizer.getMessage("jsp.error.parse.xml.line",
+ uri,
+ Integer.toString(ex.getLineNumber()),
+ Integer.toString(ex.getColumnNumber())),
+ ex);
+ } catch (SAXException sx) {
+ throw new JasperException
+ (Localizer.getMessage("jsp.error.parse.xml", uri), sx);
+ } catch (IOException io) {
+ throw new JasperException
+ (Localizer.getMessage("jsp.error.parse.xml", uri), io);
+ }
+
+ // Convert the resulting document to a graph of TreeNodes
+ return (convert(null, document.getDocumentElement()));
+ }
+
+
+ /**
+ * Parse the specified XML document, and return a <code>TreeNode</code>
+ * that corresponds to the root node of the document tree.
+ *
+ * @param uri URI of the XML document being parsed
+ * @param is Input stream containing the deployment descriptor
+ *
+ * @exception JasperException if an input/output error occurs
+ * @exception JasperException if a parsing error occurs
+ */
+ public TreeNode parseXMLDocument(String uri, InputStream is)
+ throws JasperException {
+
+ return (parseXMLDocument(uri, new InputSource(is)));
+ }
+
+
+ // ------------------------------------------------------ Protected Methods
+
+
+ /**
+ * Create and return a TreeNode that corresponds to the specified Node,
+ * including processing all of the attributes and children nodes.
+ *
+ * @param parent The parent TreeNode (if any) for the new TreeNode
+ * @param node The XML document Node to be converted
+ */
+ protected TreeNode convert(TreeNode parent, Node node) {
+
+ // Construct a new TreeNode for this node
+ TreeNode treeNode = new TreeNode(node.getNodeName(), parent);
+
+ // Convert all attributes of this node
+ NamedNodeMap attributes = node.getAttributes();
+ if (attributes != null) {
+ int n = attributes.getLength();
+ for (int i = 0; i < n; i++) {
+ Node attribute = attributes.item(i);
+ treeNode.addAttribute(attribute.getNodeName(),
+ attribute.getNodeValue());
+ }
+ }
+
+ // Create and attach all children of this node
+ NodeList children = node.getChildNodes();
+ if (children != null) {
+ int n = children.getLength();
+ for (int i = 0; i < n; i++) {
+ Node child = children.item(i);
+ if (child instanceof Comment)
+ continue;
+ if (child instanceof Text) {
+ String body = ((Text) child).getData();
+ if (body != null) {
+ body = body.trim();
+ if (body.length() > 0)
+ treeNode.setBody(body);
+ }
+ } else {
+ TreeNode treeChild = convert(treeNode, child);
+ }
+ }
+ }
+
+ // Return the completed TreeNode graph
+ return (treeNode);
+ }
+}
+
+
+// ------------------------------------------------------------ Private Classes
+
+class MyEntityResolver implements EntityResolver {
+
+ public InputSource resolveEntity(String publicId, String systemId)
+ throws SAXException {
+ for (int i = 0; i < Constants.CACHED_DTD_PUBLIC_IDS.length; i++) {
+ String cachedDtdPublicId = Constants.CACHED_DTD_PUBLIC_IDS[i];
+ if (cachedDtdPublicId.equals(publicId)) {
+ String resourcePath = Constants.CACHED_DTD_RESOURCE_PATHS[i];
+ InputStream input = this.getClass().getResourceAsStream(
+ resourcePath);
+ if (input == null) {
+ throw new SAXException(Localizer.getMessage(
+ "jsp.error.internal.filenotfound", resourcePath));
+ }
+ InputSource isrc = new InputSource(input);
+ return isrc;
+ }
+ }
+ Log log = LogFactory.getLog(MyEntityResolver.class);
+ if (log.isDebugEnabled())
+ log.debug("Resolve entity failed" + publicId + " " + systemId);
+ log.error(Localizer.getMessage("jsp.error.parse.xml.invalidPublicId",
+ publicId));
+ return null;
+ }
+}
+
+class MyErrorHandler implements ErrorHandler {
+
+ public void warning(SAXParseException ex) throws SAXException {
+ Log log = LogFactory.getLog(MyErrorHandler.class);
+ if (log.isDebugEnabled())
+ log.debug("ParserUtils: warning ", ex);
+ // We ignore warnings
+ }
+
+ public void error(SAXParseException ex) throws SAXException {
+ throw ex;
+ }
+
+ public void fatalError(SAXParseException ex) throws SAXException {
+ throw ex;
+ }
+}
\ No newline at end of file
Added: struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/SymbolTable.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/SymbolTable.java?rev=819435&view=auto
==============================================================================
--- struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/SymbolTable.java (added)
+++ struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/SymbolTable.java Mon Sep 28 00:43:34 2009
@@ -0,0 +1,302 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation and was
+ * originally based on software copyright (c) 1999, International
+ * Business Machines, Inc., http://www.apache.org. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+package org.apache.jasper.xmlparser;
+
+/**
+ * This class is a symbol table implementation that guarantees that
+ * strings used as identifiers are unique references. Multiple calls
+ * to <code>addSymbol</code> will always return the same string
+ * reference.
+ * <p>
+ * The symbol table performs the same task as <code>String.intern()</code>
+ * with the following differences:
+ * <ul>
+ * <li>
+ * A new string object does not need to be created in order to
+ * retrieve a unique reference. Symbols can be added by using
+ * a series of characters in a character array.
+ * </li>
+ * <li>
+ * Users of the symbol table can provide their own symbol hashing
+ * implementation. For example, a simple string hashing algorithm
+ * may fail to produce a balanced set of hashcodes for symbols
+ * that are <em>mostly</em> unique. Strings with similar leading
+ * characters are especially prone to this poor hashing behavior.
+ * </li>
+ * </ul>
+ *
+ * @author Andy Clark
+ * @version $Id: SymbolTable.java 467222 2006-10-24 03:17:11Z markt $
+ */
+public class SymbolTable {
+
+ //
+ // Constants
+ //
+
+ /** Default table size. */
+ protected static final int TABLE_SIZE = 101;
+
+ //
+ // Data
+ //
+
+ /** Buckets. */
+ protected Entry[] fBuckets = null;
+
+ // actual table size
+ protected int fTableSize;
+
+ //
+ // Constructors
+ //
+
+ /** Constructs a symbol table with a default number of buckets. */
+ public SymbolTable() {
+ this(TABLE_SIZE);
+ }
+
+ /** Constructs a symbol table with a specified number of buckets. */
+ public SymbolTable(int tableSize) {
+ fTableSize = tableSize;
+ fBuckets = new Entry[fTableSize];
+ }
+
+ //
+ // Public methods
+ //
+
+ /**
+ * Adds the specified symbol to the symbol table and returns a
+ * reference to the unique symbol. If the symbol already exists,
+ * the previous symbol reference is returned instead, in order
+ * guarantee that symbol references remain unique.
+ *
+ * @param symbol The new symbol.
+ */
+ public String addSymbol(String symbol) {
+
+ // search for identical symbol
+ int bucket = hash(symbol) % fTableSize;
+ int length = symbol.length();
+ OUTER: for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
+ if (length == entry.characters.length) {
+ for (int i = 0; i < length; i++) {
+ if (symbol.charAt(i) != entry.characters[i]) {
+ continue OUTER;
+ }
+ }
+ return entry.symbol;
+ }
+ }
+
+ // create new entry
+ Entry entry = new Entry(symbol, fBuckets[bucket]);
+ fBuckets[bucket] = entry;
+ return entry.symbol;
+
+ } // addSymbol(String):String
+
+ /**
+ * Adds the specified symbol to the symbol table and returns a
+ * reference to the unique symbol. If the symbol already exists,
+ * the previous symbol reference is returned instead, in order
+ * guarantee that symbol references remain unique.
+ *
+ * @param buffer The buffer containing the new symbol.
+ * @param offset The offset into the buffer of the new symbol.
+ * @param length The length of the new symbol in the buffer.
+ */
+ public String addSymbol(char[] buffer, int offset, int length) {
+
+ // search for identical symbol
+ int bucket = hash(buffer, offset, length) % fTableSize;
+ OUTER: for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
+ if (length == entry.characters.length) {
+ for (int i = 0; i < length; i++) {
+ if (buffer[offset + i] != entry.characters[i]) {
+ continue OUTER;
+ }
+ }
+ return entry.symbol;
+ }
+ }
+
+ // add new entry
+ Entry entry = new Entry(buffer, offset, length, fBuckets[bucket]);
+ fBuckets[bucket] = entry;
+ return entry.symbol;
+
+ } // addSymbol(char[],int,int):String
+
+ /**
+ * Returns a hashcode value for the specified symbol. The value
+ * returned by this method must be identical to the value returned
+ * by the <code>hash(char[],int,int)</code> method when called
+ * with the character array that comprises the symbol string.
+ *
+ * @param symbol The symbol to hash.
+ */
+ public int hash(String symbol) {
+
+ int code = 0;
+ int length = symbol.length();
+ for (int i = 0; i < length; i++) {
+ code = code * 37 + symbol.charAt(i);
+ }
+ return code & 0x7FFFFFF;
+
+ } // hash(String):int
+
+ /**
+ * Returns a hashcode value for the specified symbol information.
+ * The value returned by this method must be identical to the value
+ * returned by the <code>hash(String)</code> method when called
+ * with the string object created from the symbol information.
+ *
+ * @param buffer The character buffer containing the symbol.
+ * @param offset The offset into the character buffer of the start
+ * of the symbol.
+ * @param length The length of the symbol.
+ */
+ public int hash(char[] buffer, int offset, int length) {
+
+ int code = 0;
+ for (int i = 0; i < length; i++) {
+ code = code * 37 + buffer[offset + i];
+ }
+ return code & 0x7FFFFFF;
+
+ } // hash(char[],int,int):int
+
+ /**
+ * Returns true if the symbol table already contains the specified
+ * symbol.
+ *
+ * @param symbol The symbol to look for.
+ */
+ public boolean containsSymbol(String symbol) {
+
+ // search for identical symbol
+ int bucket = hash(symbol) % fTableSize;
+ int length = symbol.length();
+ OUTER: for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
+ if (length == entry.characters.length) {
+ for (int i = 0; i < length; i++) {
+ if (symbol.charAt(i) != entry.characters[i]) {
+ continue OUTER;
+ }
+ }
+ return true;
+ }
+ }
+
+ return false;
+
+ } // containsSymbol(String):boolean
+
+ /**
+ * Returns true if the symbol table already contains the specified
+ * symbol.
+ *
+ * @param buffer The buffer containing the symbol to look for.
+ * @param offset The offset into the buffer.
+ * @param length The length of the symbol in the buffer.
+ */
+ public boolean containsSymbol(char[] buffer, int offset, int length) {
+
+ // search for identical symbol
+ int bucket = hash(buffer, offset, length) % fTableSize;
+ OUTER: for (Entry entry = fBuckets[bucket]; entry != null; entry = entry.next) {
+ if (length == entry.characters.length) {
+ for (int i = 0; i < length; i++) {
+ if (buffer[offset + i] != entry.characters[i]) {
+ continue OUTER;
+ }
+ }
+ return true;
+ }
+ }
+
+ return false;
+
+ } // containsSymbol(char[],int,int):boolean
+
+ //
+ // Classes
+ //
+
+ /**
+ * This class is a symbol table entry. Each entry acts as a node
+ * in a linked list.
+ */
+ protected static final class Entry {
+
+ //
+ // Data
+ //
+
+ /** Symbol. */
+ public String symbol;
+
+ /**
+ * Symbol characters. This information is duplicated here for
+ * comparison performance.
+ */
+ public char[] characters;
+
+ /** The next entry. */
+ public Entry next;
+
+ //
+ // Constructors
+ //
+
+ /**
+ * Constructs a new entry from the specified symbol and next entry
+ * reference.
+ */
+ public Entry(String symbol, Entry next) {
+ this.symbol = symbol.intern();
+ characters = new char[symbol.length()];
+ symbol.getChars(0, characters.length, characters, 0);
+ this.next = next;
+ }
+
+ /**
+ * Constructs a new entry from the specified symbol information and
+ * next entry reference.
+ */
+ public Entry(char[] ch, int offset, int length, Entry next) {
+ characters = new char[length];
+ System.arraycopy(ch, offset, characters, 0, length);
+ symbol = new String(characters).intern();
+ this.next = next;
+ }
+
+ } // class Entry
+
+} // class SymbolTable
Added: struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/TreeNode.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/TreeNode.java?rev=819435&view=auto
==============================================================================
--- struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/TreeNode.java (added)
+++ struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/TreeNode.java Mon Sep 28 00:43:34 2009
@@ -0,0 +1,360 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.jasper.xmlparser;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+
+
+/**
+ * Simplified implementation of a Node from a Document Object Model (DOM)
+ * parse of an XML document. This class is used to represent a DOM tree
+ * so that the XML parser's implementation of <code>org.w3c.dom</code> need
+ * not be visible to the remainder of Jasper.
+ * <p>
+ * <strong>WARNING</strong> - Construction of a new tree, or modifications
+ * to an existing one, are not thread-safe and such accesses must be
+ * synchronized.
+ *
+ * @author Craig R. McClanahan
+ * @version $Revision: 467222 $ $Date: 2006-10-24 05:17:11 +0200 (Tue, 24 Oct 2006) $
+ */
+
+public class TreeNode {
+
+
+ // ----------------------------------------------------------- Constructors
+
+
+ /**
+ * Construct a new node with no parent.
+ *
+ * @param name The name of this node
+ */
+ public TreeNode(String name) {
+
+ this(name, null);
+
+ }
+
+
+ /**
+ * Construct a new node with the specified parent.
+ *
+ * @param name The name of this node
+ * @param parent The node that is the parent of this node
+ */
+ public TreeNode(String name, TreeNode parent) {
+
+ super();
+ this.name = name;
+ this.parent = parent;
+ if (this.parent != null)
+ this.parent.addChild(this);
+
+ }
+
+
+ // ----------------------------------------------------- Instance Variables
+
+
+ /**
+ * The attributes of this node, keyed by attribute name,
+ * Instantiated only if required.
+ */
+ protected HashMap attributes = null;
+
+
+ /**
+ * The body text associated with this node (if any).
+ */
+ protected String body = null;
+
+
+ /**
+ * The children of this node, instantiated only if required.
+ */
+ protected ArrayList children = null;
+
+
+ /**
+ * The name of this node.
+ */
+ protected String name = null;
+
+
+ /**
+ * The parent node of this node.
+ */
+ protected TreeNode parent = null;
+
+
+ // --------------------------------------------------------- Public Methods
+
+
+ /**
+ * Add an attribute to this node, replacing any existing attribute
+ * with the same name.
+ *
+ * @param name The attribute name to add
+ * @param value The new attribute value
+ */
+ public void addAttribute(String name, String value) {
+
+ if (attributes == null)
+ attributes = new HashMap();
+ attributes.put(name, value);
+
+ }
+
+
+ /**
+ * Add a new child node to this node.
+ *
+ * @param node The new child node
+ */
+ public void addChild(TreeNode node) {
+
+ if (children == null)
+ children = new ArrayList();
+ children.add(node);
+
+ }
+
+
+ /**
+ * Return the value of the specified node attribute if it exists, or
+ * <code>null</code> otherwise.
+ *
+ * @param name Name of the requested attribute
+ */
+ public String findAttribute(String name) {
+
+ if (attributes == null)
+ return (null);
+ else
+ return ((String) attributes.get(name));
+
+ }
+
+
+ /**
+ * Return an Iterator of the attribute names of this node. If there are
+ * no attributes, an empty Iterator is returned.
+ */
+ public Iterator findAttributes() {
+
+ if (attributes == null)
+ return (Collections.EMPTY_LIST.iterator());
+ else
+ return (attributes.keySet().iterator());
+
+ }
+
+
+ /**
+ * Return the first child node of this node with the specified name,
+ * if there is one; otherwise, return <code>null</code>.
+ *
+ * @param name Name of the desired child element
+ */
+ public TreeNode findChild(String name) {
+
+ if (children == null)
+ return (null);
+ Iterator items = children.iterator();
+ while (items.hasNext()) {
+ TreeNode item = (TreeNode) items.next();
+ if (name.equals(item.getName()))
+ return (item);
+ }
+ return (null);
+
+ }
+
+
+ /**
+ * Return an Iterator of all children of this node. If there are no
+ * children, an empty Iterator is returned.
+ */
+ public Iterator findChildren() {
+
+ if (children == null)
+ return (Collections.EMPTY_LIST.iterator());
+ else
+ return (children.iterator());
+
+ }
+
+
+ /**
+ * Return an Iterator over all children of this node that have the
+ * specified name. If there are no such children, an empty Iterator
+ * is returned.
+ *
+ * @param name Name used to select children
+ */
+ public Iterator findChildren(String name) {
+
+ if (children == null)
+ return (Collections.EMPTY_LIST.iterator());
+
+ ArrayList results = new ArrayList();
+ Iterator items = children.iterator();
+ while (items.hasNext()) {
+ TreeNode item = (TreeNode) items.next();
+ if (name.equals(item.getName()))
+ results.add(item);
+ }
+ return (results.iterator());
+
+ }
+
+
+ /**
+ * Return the body text associated with this node (if any).
+ */
+ public String getBody() {
+
+ return (this.body);
+
+ }
+
+
+ /**
+ * Return the name of this node.
+ */
+ public String getName() {
+
+ return (this.name);
+
+ }
+
+
+ /**
+ * Remove any existing value for the specified attribute name.
+ *
+ * @param name The attribute name to remove
+ */
+ public void removeAttribute(String name) {
+
+ if (attributes != null)
+ attributes.remove(name);
+
+ }
+
+
+ /**
+ * Remove a child node from this node, if it is one.
+ *
+ * @param node The child node to remove
+ */
+ public void removeNode(TreeNode node) {
+
+ if (children != null)
+ children.remove(node);
+
+ }
+
+
+ /**
+ * Set the body text associated with this node (if any).
+ *
+ * @param body The body text (if any)
+ */
+ public void setBody(String body) {
+
+ this.body = body;
+
+ }
+
+
+ /**
+ * Return a String representation of this TreeNode.
+ */
+ public String toString() {
+
+ StringBuffer sb = new StringBuffer();
+ toString(sb, 0, this);
+ return (sb.toString());
+
+ }
+
+
+ // ------------------------------------------------------ Protected Methods
+
+
+ /**
+ * Append to the specified StringBuffer a character representation of
+ * this node, with the specified amount of indentation.
+ *
+ * @param sb The StringBuffer to append to
+ * @param indent Number of characters of indentation
+ * @param node The TreeNode to be printed
+ */
+ protected void toString(StringBuffer sb, int indent,
+ TreeNode node) {
+
+ int indent2 = indent + 2;
+
+ // Reconstruct an opening node
+ for (int i = 0; i < indent; i++)
+ sb.append(' ');
+ sb.append('<');
+ sb.append(node.getName());
+ Iterator names = node.findAttributes();
+ while (names.hasNext()) {
+ sb.append(' ');
+ String name = (String) names.next();
+ sb.append(name);
+ sb.append("=\"");
+ String value = node.findAttribute(name);
+ sb.append(value);
+ sb.append("\"");
+ }
+ sb.append(">\n");
+
+ // Reconstruct the body text of this node (if any)
+ String body = node.getBody();
+ if ((body != null) && (body.length() > 0)) {
+ for (int i = 0; i < indent2; i++)
+ sb.append(' ');
+ sb.append(body);
+ sb.append("\n");
+ }
+
+ // Reconstruct child nodes with extra indentation
+ Iterator children = node.findChildren();
+ while (children.hasNext()) {
+ TreeNode child = (TreeNode) children.next();
+ toString(sb, indent2, child);
+ }
+
+ // Reconstruct a closing node marker
+ for (int i = 0; i < indent; i++)
+ sb.append(' ');
+ sb.append("</");
+ sb.append(node.getName());
+ sb.append(">\n");
+
+ }
+
+
+}
Added: struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/UCSReader.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/UCSReader.java?rev=819435&view=auto
==============================================================================
--- struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/UCSReader.java (added)
+++ struts/struts2/trunk/plugins/embeddedjsp/src/main/java/org/apache/struts2/jasper/xmlparser/UCSReader.java Mon Sep 28 00:43:34 2009
@@ -0,0 +1,301 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.jasper.xmlparser;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * Reader for UCS-2 and UCS-4 encodings.
+ * (i.e., encodings from ISO-10646-UCS-(2|4)).
+ *
+ * @author Neil Graham, IBM
+ *
+ * @version $Id: UCSReader.java 467222 2006-10-24 03:17:11Z markt $
+ */
+public class UCSReader extends Reader {
+
+ private org.apache.juli.logging.Log log=
+ org.apache.juli.logging.LogFactory.getLog( UCSReader.class );
+
+ //
+ // Constants
+ //
+
+ /** Default byte buffer size (8192, larger than that of ASCIIReader
+ * since it's reasonable to surmise that the average UCS-4-encoded
+ * file should be 4 times as large as the average ASCII-encoded file).
+ */
+ public static final int DEFAULT_BUFFER_SIZE = 8192;
+
+ public static final short UCS2LE = 1;
+ public static final short UCS2BE = 2;
+ public static final short UCS4LE = 4;
+ public static final short UCS4BE = 8;
+
+ //
+ // Data
+ //
+
+ /** Input stream. */
+ protected InputStream fInputStream;
+
+ /** Byte buffer. */
+ protected byte[] fBuffer;
+
+ // what kind of data we're dealing with
+ protected short fEncoding;
+
+ //
+ // Constructors
+ //
+
+ /**
+ * Constructs an ASCII reader from the specified input stream
+ * using the default buffer size. The Endian-ness and whether this is
+ * UCS-2 or UCS-4 needs also to be known in advance.
+ *
+ * @param inputStream The input stream.
+ * @param encoding One of UCS2LE, UCS2BE, UCS4LE or UCS4BE.
+ */
+ public UCSReader(InputStream inputStream, short encoding) {
+ this(inputStream, DEFAULT_BUFFER_SIZE, encoding);
+ } // <init>(InputStream, short)
+
+ /**
+ * Constructs an ASCII reader from the specified input stream
+ * and buffer size. The Endian-ness and whether this is
+ * UCS-2 or UCS-4 needs also to be known in advance.
+ *
+ * @param inputStream The input stream.
+ * @param size The initial buffer size.
+ * @param encoding One of UCS2LE, UCS2BE, UCS4LE or UCS4BE.
+ */
+ public UCSReader(InputStream inputStream, int size, short encoding) {
+ fInputStream = inputStream;
+ fBuffer = new byte[size];
+ fEncoding = encoding;
+ } // <init>(InputStream,int,short)
+
+ //
+ // Reader methods
+ //
+
+ /**
+ * Read a single character. This method will block until a character is
+ * available, an I/O error occurs, or the end of the stream is reached.
+ *
+ * <p> Subclasses that intend to support efficient single-character input
+ * should override this method.
+ *
+ * @return The character read, as an integer in the range 0 to 127
+ * (<tt>0x00-0x7f</tt>), or -1 if the end of the stream has
+ * been reached
+ *
+ * @exception IOException If an I/O error occurs
+ */
+ public int read() throws IOException {
+ int b0 = fInputStream.read() & 0xff;
+ if (b0 == 0xff)
+ return -1;
+ int b1 = fInputStream.read() & 0xff;
+ if (b1 == 0xff)
+ return -1;
+ if(fEncoding >=4) {
+ int b2 = fInputStream.read() & 0xff;
+ if (b2 == 0xff)
+ return -1;
+ int b3 = fInputStream.read() & 0xff;
+ if (b3 == 0xff)
+ return -1;
+ if (log.isDebugEnabled())
+ log.debug("b0 is " + (b0 & 0xff) + " b1 " + (b1 & 0xff) + " b2 " + (b2 & 0xff) + " b3 " + (b3 & 0xff));
+ if (fEncoding == UCS4BE)
+ return (b0<<24)+(b1<<16)+(b2<<8)+b3;
+ else
+ return (b3<<24)+(b2<<16)+(b1<<8)+b0;
+ } else { // UCS-2
+ if (fEncoding == UCS2BE)
+ return (b0<<8)+b1;
+ else
+ return (b1<<8)+b0;
+ }
+ } // read():int
+
+ /**
+ * Read characters into a portion of an array. This method will block
+ * until some input is available, an I/O error occurs, or the end of the
+ * stream is reached.
+ *
+ * @param ch Destination buffer
+ * @param offset Offset at which to start storing characters
+ * @param length Maximum number of characters to read
+ *
+ * @return The number of characters read, or -1 if the end of the
+ * stream has been reached
+ *
+ * @exception IOException If an I/O error occurs
+ */
+ public int read(char ch[], int offset, int length) throws IOException {
+ int byteLength = length << ((fEncoding >= 4)?2:1);
+ if (byteLength > fBuffer.length) {
+ byteLength = fBuffer.length;
+ }
+ int count = fInputStream.read(fBuffer, 0, byteLength);
+ if(count == -1) return -1;
+ // try and make count be a multiple of the number of bytes we're looking for
+ if(fEncoding >= 4) { // BigEndian
+ // this looks ugly, but it avoids an if at any rate...
+ int numToRead = (4 - (count & 3) & 3);
+ for(int i=0; i<numToRead; i++) {
+ int charRead = fInputStream.read();
+ if(charRead == -1) { // end of input; something likely went wrong!A Pad buffer with nulls.
+ for (int j = i;j<numToRead; j++)
+ fBuffer[count+j] = 0;
+ break;
+ } else {
+ fBuffer[count+i] = (byte)charRead;
+ }
+ }
+ count += numToRead;
+ } else {
+ int numToRead = count & 1;
+ if(numToRead != 0) {
+ count++;
+ int charRead = fInputStream.read();
+ if(charRead == -1) { // end of input; something likely went wrong!A Pad buffer with nulls.
+ fBuffer[count] = 0;
+ } else {
+ fBuffer[count] = (byte)charRead;
+ }
+ }
+ }
+
+ // now count is a multiple of the right number of bytes
+ int numChars = count >> ((fEncoding >= 4)?2:1);
+ int curPos = 0;
+ for (int i = 0; i < numChars; i++) {
+ int b0 = fBuffer[curPos++] & 0xff;
+ int b1 = fBuffer[curPos++] & 0xff;
+ if(fEncoding >=4) {
+ int b2 = fBuffer[curPos++] & 0xff;
+ int b3 = fBuffer[curPos++] & 0xff;
+ if (fEncoding == UCS4BE)
+ ch[offset+i] = (char)((b0<<24)+(b1<<16)+(b2<<8)+b3);
+ else
+ ch[offset+i] = (char)((b3<<24)+(b2<<16)+(b1<<8)+b0);
+ } else { // UCS-2
+ if (fEncoding == UCS2BE)
+ ch[offset+i] = (char)((b0<<8)+b1);
+ else
+ ch[offset+i] = (char)((b1<<8)+b0);
+ }
+ }
+ return numChars;
+ } // read(char[],int,int)
+
+ /**
+ * Skip characters. This method will block until some characters are
+ * available, an I/O error occurs, or the end of the stream is reached.
+ *
+ * @param n The number of characters to skip
+ *
+ * @return The number of characters actually skipped
+ *
+ * @exception IOException If an I/O error occurs
+ */
+ public long skip(long n) throws IOException {
+ // charWidth will represent the number of bits to move
+ // n leftward to get num of bytes to skip, and then move the result rightward
+ // to get num of chars effectively skipped.
+ // The trick with &'ing, as with elsewhere in this dcode, is
+ // intended to avoid an expensive use of / that might not be optimized
+ // away.
+ int charWidth = (fEncoding >=4)?2:1;
+ long bytesSkipped = fInputStream.skip(n<<charWidth);
+ if((bytesSkipped & (charWidth | 1)) == 0) return bytesSkipped >> charWidth;
+ return (bytesSkipped >> charWidth) + 1;
+ } // skip(long):long
+
+ /**
+ * Tell whether this stream is ready to be read.
+ *
+ * @return True if the next read() is guaranteed not to block for input,
+ * false otherwise. Note that returning false does not guarantee that the
+ * next read will block.
+ *
+ * @exception IOException If an I/O error occurs
+ */
+ public boolean ready() throws IOException {
+ return false;
+ } // ready()
+
+ /**
+ * Tell whether this stream supports the mark() operation.
+ */
+ public boolean markSupported() {
+ return fInputStream.markSupported();
+ } // markSupported()
+
+ /**
+ * Mark the present position in the stream. Subsequent calls to reset()
+ * will attempt to reposition the stream to this point. Not all
+ * character-input streams support the mark() operation.
+ *
+ * @param readAheadLimit Limit on the number of characters that may be
+ * read while still preserving the mark. After
+ * reading this many characters, attempting to
+ * reset the stream may fail.
+ *
+ * @exception IOException If the stream does not support mark(),
+ * or if some other I/O error occurs
+ */
+ public void mark(int readAheadLimit) throws IOException {
+ fInputStream.mark(readAheadLimit);
+ } // mark(int)
+
+ /**
+ * Reset the stream. If the stream has been marked, then attempt to
+ * reposition it at the mark. If the stream has not been marked, then
+ * attempt to reset it in some way appropriate to the particular stream,
+ * for example by repositioning it to its starting point. Not all
+ * character-input streams support the reset() operation, and some support
+ * reset() without supporting mark().
+ *
+ * @exception IOException If the stream has not been marked,
+ * or if the mark has been invalidated,
+ * or if the stream does not support reset(),
+ * or if some other I/O error occurs
+ */
+ public void reset() throws IOException {
+ fInputStream.reset();
+ } // reset()
+
+ /**
+ * Close the stream. Once a stream has been closed, further read(),
+ * ready(), mark(), or reset() invocations will throw an IOException.
+ * Closing a previously-closed stream, however, has no effect.
+ *
+ * @exception IOException If an I/O error occurs
+ */
+ public void close() throws IOException {
+ fInputStream.close();
+ } // close()
+
+} // class UCSReader