1 /* 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.xml.internal.bind.marshaller; 27 28 import java.io.IOException; 29 import java.io.Writer; 30 import java.nio.charset.Charset; 31 import java.nio.charset.CharsetEncoder; 32 33 /** 34 * Uses JDK1.4 NIO functionality to escape characters smartly. 35 * 36 * @since 1.0.1 37 * @author 38 * Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com) 39 */ 40 public class NioEscapeHandler implements CharacterEscapeHandler { 41 42 private final CharsetEncoder encoder; 43 44 // exposing those variations upset javac 1.3.1, since it needs to 45 // know about those classes to determine which overloaded version 46 // of the method it wants to use. So comment it out for the compatibility. 47 48 // public NioEscapeHandler(CharsetEncoder _encoder) { 49 // this.encoder = _encoder; 50 // if(encoder==null) 51 // throw new NullPointerException(); 52 // } 53 // 54 // public NioEscapeHandler(Charset charset) { 55 // this(charset.newEncoder()); 56 // } 57 58 public NioEscapeHandler(String charsetName) { 59 // this(Charset.forName(charsetName)); 60 this.encoder = Charset.forName(charsetName).newEncoder(); 61 } 62 63 public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException { 64 int limit = start+length; 65 for (int i = start; i < limit; i++) { 66 switch (ch[i]) { 67 case '&': 68 out.write("&"); 69 break; 70 case '<': 71 out.write("<"); 72 break; 73 case '>': 74 out.write(">"); 75 break; 76 case '\"': 77 if (isAttVal) { 78 out.write("""); 79 } else { 80 out.write('\"'); 81 } 82 break; 83 default: 84 if( encoder.canEncode(ch[i]) ) { 85 out.write(ch[i]); 86 } else { 87 out.write("&#"); 88 out.write(Integer.toString(ch[i])); 89 out.write(';'); 90 } 91 } 92 } 93 } 94 95 }