1 /*
   2  * Copyright (c) 2014, 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 package stream.XMLStreamFilterTest;
  25 
  26 import javax.xml.stream.StreamFilter;
  27 import javax.xml.stream.XMLInputFactory;
  28 import javax.xml.stream.XMLStreamException;
  29 import javax.xml.stream.XMLStreamReader;
  30 import javax.xml.stream.events.XMLEvent;
  31 
  32 import org.testng.Assert;
  33 import org.testng.annotations.Test;
  34 
  35 /*
  36  * @summary Test Filtered XMLStreamReader hasNext() always return the correct value if repeat to call it.
  37  */
  38 public class HasNextTest {
  39 
  40     private static String INPUT_FILE = "HasNextTest.xml";
  41 
  42     private HasNextTypeFilter createFilter() {
  43 
  44         HasNextTypeFilter f = new HasNextTypeFilter();
  45 
  46         f.addType(XMLEvent.START_ELEMENT);
  47         f.addType(XMLEvent.END_ELEMENT);
  48         f.addType(XMLEvent.PROCESSING_INSTRUCTION);
  49         f.addType(XMLEvent.CHARACTERS);
  50         f.addType(XMLEvent.COMMENT);
  51         f.addType(XMLEvent.SPACE);
  52         f.addType(XMLEvent.START_DOCUMENT);
  53         f.addType(XMLEvent.END_DOCUMENT);
  54         return f;
  55     }
  56 
  57     private XMLStreamReader createStreamReader(HasNextTypeFilter f) {
  58 
  59         try {
  60             XMLInputFactory factory = XMLInputFactory.newInstance();
  61             factory = XMLInputFactory.newInstance();
  62             return factory.createFilteredReader(factory.createXMLStreamReader(this.getClass().getResourceAsStream(INPUT_FILE)), (StreamFilter) f);
  63         } catch (Exception e) {
  64             e.printStackTrace();
  65             Assert.fail("Unexpected Exception: " + e.getMessage());
  66             return null;
  67         }
  68     }
  69 
  70     private void checkHasNext(XMLStreamReader r1) throws XMLStreamException {
  71 
  72         // try asking 3 times, insure all results are the same
  73         boolean hasNext_1 = r1.hasNext();
  74         boolean hasNext_2 = r1.hasNext();
  75         boolean hasNext_3 = r1.hasNext();
  76 
  77         System.out.println("XMLStreamReader.hasNext() (1): " + hasNext_1);
  78         System.out.println("XMLStreamReader.hasNext() (2): " + hasNext_2);
  79         System.out.println("XMLStreamReader.hasNext() (3): " + hasNext_3);
  80 
  81         Assert.assertTrue((hasNext_1 == hasNext_2) && (hasNext_1 == hasNext_3),
  82                 "XMLStreamReader.hasNext() returns inconsistent values for each subsequent call: " + hasNext_1 + ", " + hasNext_2 + ", " + hasNext_3);
  83     }
  84 
  85     @Test
  86     public void testFilterUsingNextTag() {
  87 
  88         try {
  89             HasNextTypeFilter f = createFilter();
  90             XMLStreamReader r1 = createStreamReader(f);
  91 
  92             while (r1.hasNext()) {
  93                 try {
  94                     r1.nextTag();
  95                 } catch (Exception e) {
  96                     System.err.println("Expected Exception: " + e.getMessage());
  97                     e.printStackTrace();
  98                 }
  99 
 100                 checkHasNext(r1);
 101             }
 102 
 103         } catch (XMLStreamException e) {
 104             System.err.println("Unexpected Exception: " + e.getMessage());
 105             e.printStackTrace();
 106             Assert.fail("Unexpected Exception: " + e.toString());
 107         } catch (Exception e) {
 108             // if this is END_DOCUMENT, it is expected
 109             if (e.toString().indexOf("END_DOCUMENT") != -1) {
 110                 // expected
 111                 System.err.println("Expected Exception:");
 112                 e.printStackTrace();
 113             } else {
 114                 // unexpected
 115                 System.err.println("Unexpected Exception: " + e.getMessage());
 116                 e.printStackTrace();
 117                 Assert.fail("Unexpected Exception: " + e.toString());
 118             }
 119         }
 120     }
 121 
 122     @Test
 123     public void testFilterUsingNext() {
 124 
 125         try {
 126             HasNextTypeFilter f = createFilter();
 127             XMLStreamReader r1 = createStreamReader(f);
 128 
 129             while (r1.hasNext()) {
 130                 r1.next();
 131                 checkHasNext(r1);
 132             }
 133 
 134         } catch (Exception e) {
 135             // unexpected
 136             System.err.println("Unexpected Exception: " + e.getMessage());
 137             e.printStackTrace();
 138             Assert.fail("Unexpected Exception: " + e.toString());
 139         }
 140     }
 141 }