View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.module.xml.stax;
8   
9   import org.mule.tck.junit4.AbstractMuleTestCase;
10  
11  import javax.xml.namespace.QName;
12  import javax.xml.stream.XMLInputFactory;
13  import javax.xml.stream.XMLStreamConstants;
14  import javax.xml.stream.XMLStreamException;
15  import javax.xml.stream.XMLStreamReader;
16  
17  import org.junit.Before;
18  import org.junit.Test;
19  
20  import static org.junit.Assert.assertEquals;
21  import static org.junit.Assert.fail;
22  
23  public class ReversibleXMLStreamReaderTest extends AbstractMuleTestCase
24  {
25  
26      private JaxpStreamReaderAsserter asserter = null;
27      
28      @Before
29      public void setUp() throws Exception
30      {
31          String factoryName = XMLInputFactory.newInstance().getClass().getName();
32          if (factoryName.equals("com.sun.xml.internal.stream.XMLInputFactoryImpl"))
33          {
34              asserter = new JaxpStreamReaderAsserter();
35          }
36          else if (factoryName.equals("com.ctc.wstx.stax.WstxInputFactory"))
37          {
38              asserter = new StaxStreamReaderAsserter();
39          }
40          else
41          {
42              fail("Don't know how to handle XMLInputFactory \"" + factoryName + "\"");
43          }
44      }
45  
46      @Test
47      public void testReverse() throws Exception
48      {        
49          ReversibleXMLStreamReader xsr = createReader();
50  
51          asserter.assertDocumentStart(xsr);
52          QName start = xsr.getName();
53          assertEquals(XMLStreamConstants.CHARACTERS, xsr.next());
54          String text = xsr.getText();
55  
56          xsr.reset();
57  
58          assertEquals(XMLStreamConstants.START_ELEMENT, xsr.next());
59          assertEquals(start, xsr.getName());
60          assertEquals(start.getPrefix(), xsr.getPrefix());
61          assertEquals(start.getLocalPart(), xsr.getLocalName());
62          assertEquals(start.getNamespaceURI(), xsr.getNamespaceURI());
63          assertEquals(XMLStreamConstants.CHARACTERS, xsr.next()); // this is the last event we saved
64          assertEquals(text, xsr.getText());
65          assertEquals(XMLStreamConstants.END_ELEMENT, xsr.next());  
66          asserter.assertDocumentEnd(xsr);
67          
68          xsr.reset();
69  
70          assertEquals(XMLStreamConstants.START_ELEMENT, xsr.next());
71          assertEquals(start, xsr.getName());
72          assertEquals(XMLStreamConstants.CHARACTERS, xsr.next()); // this is the last event we saved
73          assertEquals(text, xsr.getText());
74          assertEquals(XMLStreamConstants.END_ELEMENT, xsr.next());  
75          assertEquals(XMLStreamConstants.END_DOCUMENT, xsr.next());
76      }
77      
78      @Test
79      public void testFullReverse() throws Exception
80      {
81          ReversibleXMLStreamReader xsr = createReader();
82          
83          asserter.assertDocumentStart(xsr);
84          assertEquals(XMLStreamConstants.CHARACTERS, xsr.next());
85          assertEquals(XMLStreamConstants.END_ELEMENT, xsr.next());
86          asserter.assertDocumentEnd(xsr);
87          
88          xsr.reset();
89  
90          assertEquals(XMLStreamConstants.START_ELEMENT, xsr.next());
91          assertEquals(XMLStreamConstants.CHARACTERS, xsr.next());
92          assertEquals(XMLStreamConstants.END_ELEMENT, xsr.next());  
93          assertEquals(XMLStreamConstants.END_DOCUMENT, xsr.next());
94      }
95      
96      private ReversibleXMLStreamReader createReader() throws Exception
97      {
98          XMLInputFactory xif = XMLInputFactory.newInstance();
99          XMLStreamReader coreReader = xif.createXMLStreamReader(getClass().getResourceAsStream("/simple.xml"));
100         
101         //com.ctc.wstx.sr.ValidatingStreamReader
102         //com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl
103         ReversibleXMLStreamReader xsr = new ReversibleXMLStreamReader(coreReader);
104         xsr.setTracking(true);
105         return xsr;
106     }
107     
108     private static class JaxpStreamReaderAsserter
109     {
110         public void assertDocumentStart(XMLStreamReader xsr) throws XMLStreamException
111         {
112             assertEquals(XMLStreamConstants.START_ELEMENT, xsr.next());
113         }
114         
115         public void assertDocumentEnd(XMLStreamReader xsr) throws XMLStreamException
116         {
117             assertEquals(XMLStreamConstants.END_DOCUMENT, xsr.next());
118         }
119     }
120     
121     private static class StaxStreamReaderAsserter extends JaxpStreamReaderAsserter
122     {
123         @Override
124         public void assertDocumentStart(XMLStreamReader xsr) throws XMLStreamException
125         {
126             assertEquals(XMLStreamConstants.START_ELEMENT, xsr.next());
127         }
128 
129         @Override
130         public void assertDocumentEnd(XMLStreamReader xsr) throws XMLStreamException
131         {
132             assertEquals(XMLStreamConstants.END_DOCUMENT, xsr.next());
133         }
134     }
135 }
136 
137