1/* 2 * Copyright (c) 2008, 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. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* 25 * @test 26 * @bug 4864117 27 * @summary Tests XMLDecoder within another DefaultHandler for SAX parser 28 * @author Sergey Malenkov 29 */ 30 31import java.beans.XMLDecoder; 32import java.beans.ExceptionListener; 33 34import java.io.ByteArrayInputStream; 35import java.io.InputStream; 36import java.io.IOException; 37 38import javax.xml.parsers.ParserConfigurationException; 39import javax.xml.parsers.SAXParserFactory; 40 41import org.xml.sax.Attributes; 42import org.xml.sax.SAXException; 43import org.xml.sax.helpers.DefaultHandler; 44 45public final class Test4864117 extends DefaultHandler implements ExceptionListener { 46 private static final String TEST = "test"; 47 private static final String DATA 48 = "<test>\n" 49 + " <void property=\"message\">\n" 50 + " <string>Hello, world!</string>\n" 51 + " </void>\n" 52 + "</test>"; 53 54 public static void main(String[] args) { 55 Test4864117 test = new Test4864117(); 56 InputStream input = new ByteArrayInputStream(DATA.getBytes()); 57 Exception error = null; 58 try { 59 SAXParserFactory.newInstance().newSAXParser().parse(input, test); 60 } 61 catch (ParserConfigurationException exception) { 62 error = exception; 63 } 64 catch (SAXException exception) { 65 error = exception.getException(); 66 if (error == null) { 67 error = exception; 68 } 69 } 70 catch (IOException exception) { 71 error = exception; 72 } 73 if (error != null) { 74 throw new Error("unexpected error", error); 75 } 76 test.print('?', test.getMessage()); 77 } 78 79 private String message; 80 81 public String getMessage() { 82 if (this.message == null) { 83 throw new Error("owner's method is not called"); 84 } 85 return this.message; 86 } 87 88 public void setMessage(String message) { 89 this.message = message; 90 print(':', this.message); 91 } 92 93 // DefaultHandler implementation 94 95 private DefaultHandler handler; 96 private int depth; 97 98 @Override 99 public void startDocument() throws SAXException { 100 this.handler = XMLDecoder.createHandler(this, this, null); 101 this.handler.startDocument(); 102 } 103 104 @Override 105 public void endDocument() { 106 this.handler = null; 107 } 108 109 @Override 110 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 111 print('>', qName); 112 if (this.depth > 0) { 113 this.handler.startElement(uri, localName, qName, attributes); 114 } else if (!TEST.equals(qName)) { 115 throw new SAXException("unexpected element name: " + qName); 116 } 117 this.depth++; 118 } 119 120 @Override 121 public void endElement(String uri, String localName, String qName) throws SAXException { 122 this.depth--; 123 print('<', qName); 124 if (this.depth > 0) { 125 this.handler.endElement(uri, localName, qName); 126 } else if (!TEST.equals(qName)) { 127 throw new SAXException("unexpected element name: " + qName); 128 } 129 } 130 131 @Override 132 public void characters(char[] ch, int start, int length) throws SAXException { 133 this.handler.characters(ch, start, length); 134 } 135 136 public void exceptionThrown(Exception exception) { 137 throw new Error("unexpected exception", exception); 138 } 139 140 private void print(char ch, String name) { 141 StringBuilder sb = new StringBuilder(); 142 for (int i = 0; i < this.depth; i++) sb.append(' '); 143 sb.append(ch).append(' ').append(name); 144 System.out.println(sb.toString()); 145 } 146} 147