001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.xml.xdm.nodes;
043:
044: import java.io.Reader;
045: import java.io.StringReader;
046: import java.io.BufferedReader;
047: import java.io.IOException;
048: import java.io.EOFException;
049: import java.util.Iterator;
050: import javax.swing.text.Document;
051: import org.xml.sax.InputSource;
052: import org.openide.ErrorManager;
053: import org.openide.util.Lookup;
054: import java.net.URL;
055: import java.util.Map;
056: import java.util.TreeMap;
057: import org.openide.filesystems.FileObject;
058: import org.openide.loaders.DataObject;
059: import org.openide.util.NbBundle;
060:
061: /**
062: * Set of static methods converting misc data representations.
063: *
064: * @author Petr Kuzel
065: * @version 0.9
066: */
067: public final class Convertors {
068: /**
069: * Swings document property added by this support.
070: */
071: public static final String PROP_DOCUMENT_URL = "doc-url";
072:
073: /**
074: * @return current state of Document as string
075: */
076: public static String documentToString(final Document doc) {
077:
078: if (doc == null)
079: throw new NullPointerException();
080:
081: final String[] str = new String[1];
082:
083: // safely take the text from the document
084: Runnable run = new Runnable() {
085: public void run() {
086: try {
087: str[0] = doc.getText(0, doc.getLength());
088: } catch (javax.swing.text.BadLocationException e) {
089: // impossible
090: e.printStackTrace();
091: }
092: }
093: };
094:
095: doc.render(run);
096: return str[0];
097:
098: }
099:
100: /**
101: * @return InputSource, a callie SHOULD set systemId if available
102: */
103: public static InputSource documentToInputSource(Document doc) {
104:
105: if (doc == null)
106: throw new NullPointerException();
107:
108: String text = documentToString(doc);
109: Reader reader = new StringReader(text);
110:
111: // our specifics property
112: String system = (String) doc.getProperty(PROP_DOCUMENT_URL);
113:
114: // try Swing general property
115: if (system == null) {
116: Object obj = doc
117: .getProperty(Document.StreamDescriptionProperty);
118: if (obj instanceof DataObject) {
119: try {
120: DataObject dobj = (DataObject) obj;
121: FileObject fo = dobj.getPrimaryFile();
122: URL url = fo.getURL();
123: system = url.toExternalForm();
124: } catch (IOException io) {
125: ErrorManager emgr = (ErrorManager) Lookup
126: .getDefault().lookup(ErrorManager.class);
127: emgr.notify(io);
128: }
129: } else {
130: ErrorManager emgr = (ErrorManager) Lookup.getDefault()
131: .lookup(ErrorManager.class);
132: emgr.log("XML:Convertors:Unknown stream description:"
133: + obj);
134: }
135: }
136:
137: // set something, some parsers are nervous if no system id
138: if (system == null) {
139: system = "XML/Core/Convertors/documentToInputSource()"; //NOI18N
140: }
141:
142: InputSource in = new InputSource(system); // NOI18N
143: in.setCharacterStream(reader);
144: return in;
145: }
146:
147: /**
148: * Wrap reader into buffered one and start reading returning
149: * String as a EOF is reached.
150: */
151: public static String readerToString(Reader reader)
152: throws IOException {
153:
154: BufferedReader fastReader = new BufferedReader(reader);
155: StringBuffer buf = new StringBuffer(1024);
156: try {
157: for (int i = fastReader.read(); i >= 0; i = fastReader
158: .read()) {
159: buf.append((char) i);
160: }
161: } catch (EOFException eof) {
162: //expected
163: }
164:
165: return buf.toString();
166: }
167:
168: /**
169: */
170: public static final String iana2java(String iana) {
171: String java = (String) Convertors.EncodingUtil
172: .getIANA2JavaMap().get(iana.toUpperCase());
173: return java == null ? iana : java;
174: }
175:
176: public static final String java2iana(String java) {
177: String iana = (String) Convertors.EncodingUtil
178: .getJava2IANAMap().get(java);
179: return iana == null ? java : iana;
180: }
181:
182: //!!! this code is copy pasted from TAX library TreeUtilities
183:
184: /**
185: *
186: */
187: static class EncodingUtil {
188:
189: /** IANA to Java encoding mappings */
190: protected final static Map<String, String> encodingIANA2JavaMap = new TreeMap<String, String>();
191:
192: /** */
193: protected final static Map<String, String> encodingIANADescriptionMap = new TreeMap<String, String>();
194:
195: /** */
196: protected final static Map<String, String> encodingIANAAliasesMap = new TreeMap<String, String>();
197:
198: protected final static Map<String, String> encodingJava2IANAMap = new TreeMap<String, String>();
199:
200: //
201: // Static initialization
202: //
203:
204: static {
205: encodingIANA2JavaMap.put("BIG5", "Big5"); // NOI18N
206: encodingIANADescriptionMap.put("BIG5", NbBundle.getMessage(
207: Convertors.class, "NAME_BIG5")); // NOI18N
208: encodingIANAAliasesMap.put("BIG5", "BIG5"); // NOI18N
209:
210: encodingIANA2JavaMap.put("IBM037", "CP037"); // NOI18N
211: encodingIANADescriptionMap.put("IBM037", NbBundle
212: .getMessage(Convertors.class, "NAME_IBM037")); // NOI18N
213: encodingIANAAliasesMap.put("IBM037", "IBM037"); // NOI18N
214: encodingIANAAliasesMap.put("EBCDIC-CP-US", "IBM037"); // NOI18N
215: encodingIANAAliasesMap.put("EBCDIC-CP-CA", "IBM037"); // NOI18N
216: encodingIANAAliasesMap.put("EBCDIC-CP-NL", "IBM037"); // NOI18N
217: encodingIANAAliasesMap.put("EBCDIC-CP-WT", "IBM037"); // NOI18N
218:
219: encodingIANA2JavaMap.put("IBM277", "CP277"); // NOI18N
220: encodingIANADescriptionMap.put("IBM277", NbBundle
221: .getMessage(Convertors.class, "NAME_IBM277")); // NOI18N
222: encodingIANAAliasesMap.put("IBM277", "IBM277"); // NOI18N
223: encodingIANAAliasesMap.put("EBCDIC-CP-DK", "IBM277"); // NOI18N
224: encodingIANAAliasesMap.put("EBCDIC-CP-NO", "IBM277"); // NOI18N
225:
226: encodingIANA2JavaMap.put("IBM278", "CP278"); // NOI18N
227: encodingIANADescriptionMap.put("IBM278", NbBundle
228: .getMessage(Convertors.class, "NAME_IBM277")); // NOI18N
229: encodingIANAAliasesMap.put("IBM278", "IBM278"); // NOI18N
230: encodingIANAAliasesMap.put("EBCDIC-CP-FI", "IBM278"); // NOI18N
231: encodingIANAAliasesMap.put("EBCDIC-CP-SE", "IBM278"); // NOI18N
232:
233: encodingIANA2JavaMap.put("IBM280", "CP280"); // NOI18N
234: encodingIANADescriptionMap.put("IBM280", NbBundle
235: .getMessage(Convertors.class, "NAME_IBM280")); // NOI18N
236: encodingIANAAliasesMap.put("IBM280", "IBM280"); // NOI18N
237: encodingIANAAliasesMap.put("EBCDIC-CP-IT", "IBM280"); // NOI18N
238:
239: encodingIANA2JavaMap.put("IBM284", "CP284"); // NOI18N
240: encodingIANADescriptionMap.put("IBM284", NbBundle
241: .getMessage(Convertors.class, "NAME_IBM284")); // NOI18N
242: encodingIANAAliasesMap.put("IBM284", "IBM284"); // NOI18N
243: encodingIANAAliasesMap.put("EBCDIC-CP-ES", "IBM284"); // NOI18N
244:
245: encodingIANA2JavaMap.put("IBM285", "CP285"); // NOI18N
246: encodingIANADescriptionMap.put("IBM285", NbBundle
247: .getMessage(Convertors.class, "NAME_IBM285")); // NOI18N
248: encodingIANAAliasesMap.put("IBM285", "IBM285"); // NOI18N
249: encodingIANAAliasesMap.put("EBCDIC-CP-GB", "IBM285"); // NOI18N
250:
251: encodingIANA2JavaMap.put("IBM297", "CP297"); // NOI18N
252: encodingIANADescriptionMap.put("IBM297", NbBundle
253: .getMessage(Convertors.class, "NAME_IBM297")); // NOI18N
254: encodingIANAAliasesMap.put("IBM297", "IBM297"); // NOI18N
255: encodingIANAAliasesMap.put("EBCDIC-CP-FR", "IBM297"); // NOI18N
256:
257: encodingIANA2JavaMap.put("IBM424", "CP424"); // NOI18N
258: encodingIANADescriptionMap.put("IBM424", NbBundle
259: .getMessage(Convertors.class, "NAME_IBM424")); // NOI18N
260: encodingIANAAliasesMap.put("IBM424", "IBM424"); // NOI18N
261: encodingIANAAliasesMap.put("EBCDIC-CP-HE", "IBM424"); // NOI18N
262:
263: encodingIANA2JavaMap.put("IBM500", "CP500"); // NOI18N
264: encodingIANADescriptionMap.put("IBM500", NbBundle
265: .getMessage(Convertors.class, "NAME_IBM500")); // NOI18N
266: encodingIANAAliasesMap.put("IBM500", "IBM500"); // NOI18N
267: encodingIANAAliasesMap.put("EBCDIC-CP-CH", "IBM500"); // NOI18N
268: encodingIANAAliasesMap.put("EBCDIC-CP-BE", "IBM500"); // NOI18N
269:
270: encodingIANA2JavaMap.put("IBM870", "CP870"); // NOI18N
271: encodingIANADescriptionMap.put("IBM870", NbBundle
272: .getMessage(Convertors.class, "NAME_IBM870")); // NOI18N
273: encodingIANAAliasesMap.put("IBM870", "IBM870"); // NOI18N
274: encodingIANAAliasesMap.put("EBCDIC-CP-ROECE", "IBM870"); // NOI18N
275: encodingIANAAliasesMap.put("EBCDIC-CP-YU", "IBM870"); // NOI18N
276:
277: encodingIANA2JavaMap.put("IBM871", "CP871"); // NOI18N
278: encodingIANADescriptionMap.put("IBM871", NbBundle
279: .getMessage(Convertors.class, "NAME_IBM871")); // NOI18N
280: encodingIANAAliasesMap.put("IBM871", "IBM871"); // NOI18N
281: encodingIANAAliasesMap.put("EBCDIC-CP-IS", "IBM871"); // NOI18N
282:
283: encodingIANA2JavaMap.put("IBM918", "CP918"); // NOI18N
284: encodingIANADescriptionMap.put("IBM918", NbBundle
285: .getMessage(Convertors.class, "NAME_IBM918")); // NOI18N
286: encodingIANAAliasesMap.put("IBM918", "IBM918"); // NOI18N
287: encodingIANAAliasesMap.put("EBCDIC-CP-AR2", "IBM918"); // NOI18N
288:
289: encodingIANA2JavaMap.put("EUC-JP", "EUCJIS"); // NOI18N
290: encodingIANADescriptionMap.put("EUC-JP", NbBundle
291: .getMessage(Convertors.class, "NAME_EUC-JP")); // NOI18N
292: encodingIANAAliasesMap.put("EUC-JP", "EUC-JP"); // NOI18N
293:
294: encodingIANA2JavaMap.put("EUC-KR", "KSC5601"); // NOI18N
295: encodingIANADescriptionMap.put("EUC-KR", NbBundle
296: .getMessage(Convertors.class, "NAME_EUC-KR")); // NOI18N
297: encodingIANAAliasesMap.put("EUC-KR", "EUC-KR"); // NOI18N
298:
299: encodingIANA2JavaMap.put("GB2312", "GB2312"); // NOI18N
300: encodingIANADescriptionMap.put("GB2312", NbBundle
301: .getMessage(Convertors.class, "NAME_GB2312")); // NOI18N
302: encodingIANAAliasesMap.put("GB2312", "GB2312"); // NOI18N
303:
304: encodingIANA2JavaMap.put("ISO-2022-JP", "JIS"); // NOI18N
305: encodingIANADescriptionMap.put("ISO-2022-JP", NbBundle
306: .getMessage(Convertors.class, "NAME_ISO-2022-JP")); // NOI18N
307: encodingIANAAliasesMap.put("ISO-2022-JP", "ISO-2022-JP"); // NOI18N
308:
309: encodingIANA2JavaMap.put("ISO-2022-KR", "ISO2022KR"); // NOI18N
310: encodingIANADescriptionMap.put("ISO-2022-KR", NbBundle
311: .getMessage(Convertors.class, "NAME_ISO-2022-KR")); // NOI18N
312: encodingIANAAliasesMap.put("ISO-2022-KR", "ISO-2022-KR"); // NOI18N
313:
314: encodingIANA2JavaMap.put("ISO-8859-1", "8859_1"); // NOI18N
315: encodingIANADescriptionMap.put("ISO-8859-1", NbBundle
316: .getMessage(Convertors.class, "NAME_ISO-8859-1")); // NOI18N
317: encodingIANAAliasesMap.put("ISO-8859-1", "ISO-8859-1"); // NOI18N
318: encodingIANAAliasesMap.put("LATIN1", "ISO-8859-1"); // NOI18N
319: encodingIANAAliasesMap.put("L1", "ISO-8859-1"); // NOI18N
320: encodingIANAAliasesMap.put("IBM819", "ISO-8859-1"); // NOI18N
321: encodingIANAAliasesMap.put("CP819", "ISO-8859-1"); // NOI18N
322:
323: encodingIANA2JavaMap.put("ISO-8859-2", "8859_2"); // NOI18N
324: encodingIANADescriptionMap.put("ISO-8859-2", NbBundle
325: .getMessage(Convertors.class, "NAME_ISO-8859-2")); // NOI18N
326: encodingIANAAliasesMap.put("ISO-8859-2", "ISO-8859-2"); // NOI18N
327: encodingIANAAliasesMap.put("LATIN2", "ISO-8859-2"); // NOI18N
328: encodingIANAAliasesMap.put("L2", "ISO-8859-2"); // NOI18N
329:
330: encodingIANA2JavaMap.put("ISO-8859-3", "8859_3"); // NOI18N
331: encodingIANADescriptionMap.put("ISO-8859-3", NbBundle
332: .getMessage(Convertors.class, "NAME_ISO-8859-3")); // NOI18N
333: encodingIANAAliasesMap.put("ISO-8859-3", "ISO-8859-3"); // NOI18N
334: encodingIANAAliasesMap.put("LATIN3", "ISO-8859-3"); // NOI18N
335: encodingIANAAliasesMap.put("L3", "ISO-8859-3"); // NOI18N
336:
337: encodingIANA2JavaMap.put("ISO-8859-4", "8859_4"); // NOI18N
338: encodingIANADescriptionMap.put("ISO-8859-4", NbBundle
339: .getMessage(Convertors.class, "NAME_ISO-8859-4")); // NOI18N
340: encodingIANAAliasesMap.put("ISO-8859-4", "ISO-8859-4"); // NOI18N
341: encodingIANAAliasesMap.put("LATIN4", "ISO-8859-4"); // NOI18N
342: encodingIANAAliasesMap.put("L4", "ISO-8859-4"); // NOI18N
343:
344: encodingIANA2JavaMap.put("ISO-8859-5", "8859_5"); // NOI18N
345: encodingIANADescriptionMap.put("ISO-8859-5", NbBundle
346: .getMessage(Convertors.class, "NAME_ISO-8859-5")); // NOI18N
347: encodingIANAAliasesMap.put("ISO-8859-5", "ISO-8859-5"); // NOI18N
348: encodingIANAAliasesMap.put("CYRILLIC", "ISO-8859-5"); // NOI18N
349:
350: encodingIANA2JavaMap.put("ISO-8859-6", "8859_6"); // NOI18N
351: encodingIANADescriptionMap.put("ISO-8859-6", NbBundle
352: .getMessage(Convertors.class, "NAME_ISO-8859-6")); // NOI18N
353: encodingIANAAliasesMap.put("ISO-8859-6", "ISO-8859-6"); // NOI18N
354:
355: encodingIANA2JavaMap.put("ISO-8859-7", "8859_7"); // NOI18N
356: encodingIANADescriptionMap.put("ISO-8859-7", NbBundle
357: .getMessage(Convertors.class, "NAME_ISO-8859-7")); // NOI18N
358: encodingIANAAliasesMap.put("ISO-8859-7", "ISO-8859-7"); // NOI18N
359: encodingIANAAliasesMap.put("GREEK", "ISO-8859-7"); // NOI18N
360: encodingIANAAliasesMap.put("GREEK8", "ISO-8859-7"); // NOI18N
361:
362: encodingIANA2JavaMap.put("ISO-8859-8", "8859_8"); // NOI18N
363: encodingIANADescriptionMap.put("ISO-8859-8", NbBundle
364: .getMessage(Convertors.class, "NAME_ISO-8859-8")); // NOI18N
365: encodingIANAAliasesMap.put("ISO-8859-8", "ISO-8859-8"); // NOI18N
366: encodingIANAAliasesMap.put("HEBREW", "ISO-8859-8"); // NOI18N
367:
368: encodingIANA2JavaMap.put("ISO-8859-9", "8859_9"); // NOI18N
369: encodingIANADescriptionMap.put("ISO-8859-9", NbBundle
370: .getMessage(Convertors.class, "NAME_ISO-8859-9")); // NOI18N
371: encodingIANAAliasesMap.put("ISO-8859-9", "ISO-8859-9"); // NOI18N
372: encodingIANAAliasesMap.put("LATIN5", "ISO-8859-9"); // NOI18N
373: encodingIANAAliasesMap.put("L5", "ISO-8859-9"); // NOI18N
374:
375: encodingIANA2JavaMap.put("KOI8-R", "KOI8_R"); // NOI18N
376: encodingIANADescriptionMap.put("KOI8-R", NbBundle
377: .getMessage(Convertors.class, "NAME_KOI8-R")); // NOI18N
378: encodingIANAAliasesMap.put("KOI8-R", "KOI8-R"); // NOI18N
379:
380: encodingIANADescriptionMap.put("US-ASCII", NbBundle
381: .getMessage(Convertors.class, "NAME_ASCII")); // NOI18N
382: encodingIANAAliasesMap.put("ASCII", "US-ASCII"); // NOI18N
383: encodingIANAAliasesMap.put("US-ASCII", "US-ASCII"); // NOI18N
384: encodingIANAAliasesMap.put("ISO646-US", "US-ASCII"); // NOI18N
385: encodingIANAAliasesMap.put("IBM367", "US-ASCII"); // NOI18N
386: encodingIANAAliasesMap.put("CP367", "US-ASCII"); // NOI18N
387:
388: encodingIANA2JavaMap.put("UTF-8", "UTF8"); // NOI18N
389: encodingIANADescriptionMap.put("UTF-8", NbBundle
390: .getMessage(Convertors.class, "NAME_UTF-8")); // NOI18N
391: encodingIANAAliasesMap.put("UTF-8", "UTF-8"); // NOI18N
392:
393: encodingIANA2JavaMap.put("UTF-16", "Unicode"); // NOI18N
394: encodingIANADescriptionMap.put("UTF-16", NbBundle
395: .getMessage(Convertors.class, "NAME_UTF-16")); // NOI18N
396: encodingIANAAliasesMap.put("UTF-16", "UTF-16"); // NOI18N
397:
398: Iterator<String> iter = encodingIANA2JavaMap.keySet()
399: .iterator();
400: String key;
401: while (iter.hasNext()) {
402: key = iter.next();
403: encodingJava2IANAMap.put(encodingIANA2JavaMap.get(key),
404: key);
405: }
406:
407: encodingIANA2JavaMap.put("US-ASCII", "8859_1"); // NOI18N
408: }
409:
410: /**
411: */
412: public static Map getIANA2JavaMap() {
413: return encodingIANA2JavaMap;
414: }
415:
416: public static Map getJava2IANAMap() {
417: return encodingJava2IANAMap;
418: }
419: }
420: }
|