1 /* 2 * Copyright (c) 2003, 2015, 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 package org.xml.sax.ptests; 24 25 import java.io.BufferedWriter; 26 import java.io.FileInputStream; 27 import java.io.FileWriter; 28 import java.io.IOException; 29 import javax.xml.parsers.SAXParserFactory; 30 import jaxp.library.JAXPFileBaseTest; 31 import static jaxp.library.JAXPTestUtilities.USER_DIR; 32 import static jaxp.library.JAXPTestUtilities.compareWithGold; 33 import static org.testng.Assert.assertTrue; 34 import org.testng.annotations.Test; 35 import org.xml.sax.Attributes; 36 import org.xml.sax.InputSource; 37 import org.xml.sax.Locator; 38 import org.xml.sax.SAXException; 39 import org.xml.sax.XMLReader; 40 import org.xml.sax.helpers.XMLFilterImpl; 41 import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR; 42 import static org.xml.sax.ptests.SAXTestConst.XML_DIR; 43 44 /** 45 * Class registers a content event handler to XMLReader. Content event handler 46 * transverses XML and print all visited node when XMLreader parses XML. Test 47 * verifies output is same as the golden file. 48 */ 49 public class ContentHandlerTest extends JAXPFileBaseTest { 50 /** 51 * Content event handler visit all nodes to print to output file. 52 * 53 * @throws Exception If any errors occur. 54 */ 55 @Test 56 public void testcase01() throws Exception { 57 String outputFile = USER_DIR + "Content.out"; 58 String goldFile = GOLDEN_DIR + "ContentGF.out"; 59 String xmlFile = XML_DIR + "namespace1.xml"; 60 61 try(FileInputStream instream = new FileInputStream(xmlFile); 62 MyContentHandler cHandler = new MyContentHandler(outputFile)) { 63 SAXParserFactory spf = SAXParserFactory.newInstance(); 64 spf.setNamespaceAware(true); 65 XMLReader xmlReader = spf.newSAXParser().getXMLReader(); 66 xmlReader.setContentHandler(cHandler); 67 xmlReader.parse(new InputSource(instream)); 68 } 69 assertTrue(compareWithGold(goldFile, outputFile)); 70 } 71 } 72 73 /** 74 * A content write out handler. 75 */ 76 class MyContentHandler extends XMLFilterImpl implements AutoCloseable { 77 /** 78 * Prefix to every exception. 79 */ 80 private final static String WRITE_ERROR = "bWriter error"; 81 82 /** 83 * FileWriter to write string to output file. 84 */ 85 private final BufferedWriter bWriter; 86 87 /** 88 * Default document locator. 89 */ 90 private Locator locator; 91 92 /** 93 * Initiate FileWriter when construct a MyContentHandler. 94 * @param outputFileName output file name. 95 * @throws SAXException creation of FileWriter failed. 96 */ 97 public MyContentHandler(String outputFileName) throws SAXException { 98 try { 99 bWriter = new BufferedWriter(new FileWriter(outputFileName)); 100 } catch (IOException ex) { 101 throw new SAXException(ex); 102 } 103 } 104 105 /** 106 * Write characters tag along with content of characters when meet 107 * characters event. 108 * @throws IOException error happen when writing file. 109 */ 110 @Override 111 public void characters(char[] ch, int start, int length) throws SAXException { 112 String s = new String(ch, start, length); 113 println("characters...\n" + s); 114 } 115 116 /** 117 * Write endDocument tag then flush the content and close the file when meet 118 * endDocument event. 119 * @throws IOException error happen when writing file or closing file. 120 */ 121 @Override 122 public void endDocument() throws SAXException { 123 try { 124 println("endDocument..."); 125 bWriter.flush(); 126 bWriter.close(); 127 } catch (IOException ex) { 128 throw new SAXException(WRITE_ERROR, ex); 129 } 130 } 131 132 /** 133 * Write endElement tag with namespaceURI, localName, qName to the file when 134 * meet endElement event. 135 * @throws IOException error happen when writing file. 136 */ 137 @Override 138 public void endElement(String namespaceURI,String localName,String qName) throws SAXException{ 139 println("endElement...\n" + "namespaceURI: " + namespaceURI + 140 " localName: "+ localName + " qName: " + qName); 141 } 142 143 /** 144 * Write endPrefixMapping tag along with prefix to the file when meet 145 * endPrefixMapping event. 146 * @throws IOException error happen when writing file. 147 */ 148 @Override 149 public void endPrefixMapping(String prefix) throws SAXException { 150 println("endPrefixMapping...\n" + "prefix: " + prefix); 151 } 152 153 /** 154 * Write ignorableWhitespace tag along with white spaces when meet 155 * ignorableWhitespace event. 156 * @throws IOException error happen when writing file. 157 */ 158 @Override 159 public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { 160 String s = new String(ch, start, length); 161 println("ignorableWhitespace...\n" + s + 162 " ignorable white space string length: " + s.length()); 163 } 164 165 /** 166 * Write processingInstruction tag along with target name and target data 167 * when meet processingInstruction event. 168 * @throws IOException error happen when writing file. 169 */ 170 @Override 171 public void processingInstruction(String target, String data) throws SAXException { 172 println("processingInstruction...target:" + target + 173 " data: " + data); 174 } 175 176 /** 177 * Write setDocumentLocator tag when meet setDocumentLocator event. 178 */ 179 @Override 180 public void setDocumentLocator(Locator locator) { 181 try { 182 this.locator = locator; 183 println("setDocumentLocator..."); 184 } catch (SAXException ex) { 185 System.err.println(WRITE_ERROR + ex); 186 } 187 } 188 189 /** 190 * Write skippedEntity tag along with entity name when meet skippedEntity 191 * event. 192 * @throws IOException error happen when writing file. 193 */ 194 @Override 195 public void skippedEntity(String name) throws SAXException { 196 println("skippedEntity...\n" + "name: " + name); 197 } 198 199 /** 200 * Write startDocument tag when meet startDocument event. 201 * @throws IOException error happen when writing file. 202 */ 203 @Override 204 public void startDocument() throws SAXException { 205 println("startDocument..."); 206 } 207 208 /** 209 * Write startElement tag along with namespaceURI, localName, qName, number 210 * of attributes and line number when meet startElement event. 211 * @throws IOException error happen when writing file. 212 */ 213 @Override 214 public void startElement(String namespaceURI, String localName, 215 String qName, Attributes atts) throws SAXException { 216 println("startElement...\n" + "namespaceURI: " + namespaceURI + 217 " localName: " + localName + " qName: " + qName + 218 " Number of Attributes: " + atts.getLength() + 219 " Line# " + locator.getLineNumber()); 220 } 221 222 /** 223 * Write startPrefixMapping tag along with prefix and uri when meet 224 * startPrefixMapping event. 225 * @throws IOException error happen when writing file. 226 */ 227 @Override 228 public void startPrefixMapping(String prefix, String uri) throws SAXException { 229 println("startPrefixMapping...\n" + "prefix: " + prefix + 230 " uri: " + uri); 231 } 232 233 /** 234 * Write outString to file. 235 * @param outString String to be written to File 236 * @throws SAXException if write file failed 237 */ 238 private void println(String outString) throws SAXException { 239 try { 240 bWriter.write( outString, 0, outString.length()); 241 bWriter.newLine(); 242 } catch (IOException ex) { 243 throw new SAXException(WRITE_ERROR, ex); 244 } 245 } 246 247 /** 248 * Close the writer if it's initiated. 249 * @throws IOException if any IO error when close buffered writer. 250 */ 251 @Override 252 public void close() throws IOException { 253 if (bWriter != null) 254 bWriter.close(); 255 } 256 }