/*
* Copyright 2011, 2012 Odysseus Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.synapse.commons.staxon.core.event;
import java.io.StringReader;
import java.util.Iterator;
import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Namespace;
import javax.xml.stream.events.XMLEvent;
import org.junit.Assert;
import org.junit.Test;
import org.apache.synapse.commons.staxon.core.xml.SimpleXMLInputFactory;
public class SimpleXMLFilteredEventReaderTest {
static final EventFilter ACCEPT_ALL = new EventFilter() {
@Override
public boolean accept(XMLEvent event) {
return true;
}
};
static class TypeFilter implements EventFilter {
final int type;
public TypeFilter(int type) {
this.type = type;
}
@Override
public boolean accept(XMLEvent event) {
return event.getEventType() != type;
}
}
;
private static XMLInputFactory factory = new SimpleXMLInputFactory();
private XMLEventReader createXmlEventReader(String xml, EventFilter filter) throws XMLStreamException {
return new SimpleXMLFilteredEventReader(factory.createXMLEventReader(new StringReader(xml)), filter);
}
@Test
public void testStartEndDocument() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<? xml version=\"1.0\" ?>", ACCEPT_ALL);
Assert.assertEquals(XMLStreamConstants.START_DOCUMENT, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.END_DOCUMENT, reader.nextEvent().getEventType());
}
@Test
public void testStartEndElement() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<alice/>", ACCEPT_ALL);
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextEvent().getEventType());
reader = createXmlEventReader("<alice></alice>", ACCEPT_ALL);
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextEvent().getEventType());
}
@Test
public void testStartEndElement2() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<alice/>", new TypeFilter(XMLStreamConstants.START_ELEMENT));
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextEvent().getEventType());
reader = createXmlEventReader("<alice></alice>", new TypeFilter(XMLStreamConstants.END_ELEMENT));
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextEvent().getEventType());
Assert.assertFalse(reader.hasNext());
}
@Test
public void testCharactersCData() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<alice>bob</alice>", ACCEPT_ALL);
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.CHARACTERS, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextEvent().getEventType());
reader = createXmlEventReader("<alice><![CDATA[bob]]></alice>", ACCEPT_ALL);
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.CDATA, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextEvent().getEventType());
}
@Test
public void testCharactersCData2() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<alice>bob</alice>", new TypeFilter(XMLStreamConstants.CHARACTERS));
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextEvent().getEventType());
reader = createXmlEventReader("<alice><![CDATA[bob]]></alice>", new TypeFilter(XMLStreamConstants.CDATA));
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextEvent().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextEvent().getEventType());
}
@Test
public void testAttributeNamespace() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<alice david=\"edgar\" xmlns=\"http://foo\"/>", ACCEPT_ALL);
XMLEvent event = reader.nextEvent();
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, event.getEventType());
Iterator<?> attributes = event.asStartElement().getAttributes();
Assert.assertEquals(XMLStreamConstants.ATTRIBUTE, ((Attribute) attributes.next()).getEventType());
Assert.assertFalse(attributes.hasNext());
Iterator<?> namespaces = event.asStartElement().getNamespaces();
Assert.assertEquals(XMLStreamConstants.NAMESPACE, ((Namespace) namespaces.next()).getEventType());
Assert.assertFalse(attributes.hasNext());
}
@Test
public void testComment() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<!--james-->", ACCEPT_ALL);
Assert.assertEquals(XMLStreamConstants.COMMENT, reader.nextEvent().getEventType());
Assert.assertFalse(reader.hasNext());
}
@Test
public void testComment2() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<!--james-->", new TypeFilter(XMLStreamConstants.COMMENT));
Assert.assertFalse(reader.hasNext());
}
@Test
public void testProcessingInstruction() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<?joe?>", ACCEPT_ALL);
Assert.assertEquals(XMLStreamConstants.PROCESSING_INSTRUCTION, reader.nextEvent().getEventType());
Assert.assertFalse(reader.hasNext());
}
@Test
public void testProcessingInstruction2() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<?joe?>", new TypeFilter(XMLStreamConstants.PROCESSING_INSTRUCTION));
Assert.assertFalse(reader.hasNext());
}
@Test
public void testPeek() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<?xml version=\"1.0\"?><alice david=\"edgar\">bob</alice>", ACCEPT_ALL);
while (reader.hasNext()) {
Assert.assertEquals(reader.peek(), reader.nextEvent());
}
}
@Test
public void testPeek2() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<?xml version=\"1.0\"?><alice david=\"edgar\">bob</alice>", new TypeFilter(XMLStreamConstants.START_ELEMENT));
while (reader.hasNext()) {
Assert.assertEquals(reader.peek(), reader.nextEvent());
}
}
@Test
public void testGetElementText() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<alice david=\"edgar\">bob</alice>", ACCEPT_ALL);
reader.next();
Assert.assertEquals("bob", reader.getElementText());
reader = createXmlEventReader("<alice david=\"edgar\">bob</alice>", ACCEPT_ALL);
reader.next();
reader.peek();
Assert.assertEquals("bob", reader.getElementText());
}
@Test
public void testGetElementText2() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<alice david=\"edgar\">bob</alice>", new TypeFilter(XMLStreamConstants.CHARACTERS));
reader.next();
Assert.assertEquals("", reader.getElementText());
reader = createXmlEventReader("<alice david=\"edgar\">bob</alice>", new TypeFilter(XMLStreamConstants.CHARACTERS));
reader.next();
reader.peek();
Assert.assertEquals("", reader.getElementText());
}
@Test
public void testNextTag() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<?xml version=\"1.0\"?><alice david=\"edgar\"><edgar/></alice>", ACCEPT_ALL);
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextTag().getEventType());
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextTag().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextTag().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextTag().getEventType());
reader = createXmlEventReader("<?xml version=\"1.0\"?><alice david=\"edgar\"><edgar/></alice>", ACCEPT_ALL);
reader.peek();
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextTag().getEventType());
reader.peek();
Assert.assertEquals(XMLStreamConstants.START_ELEMENT, reader.nextTag().getEventType());
reader.peek();
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextTag().getEventType());
reader.peek();
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextTag().getEventType());
}
@Test
public void testNextTag2() throws XMLStreamException {
XMLEventReader reader = createXmlEventReader("<?xml version=\"1.0\"?><alice david=\"edgar\"><edgar/></alice>", new TypeFilter(XMLStreamConstants.START_ELEMENT));
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextTag().getEventType());
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextTag().getEventType());
reader = createXmlEventReader("<?xml version=\"1.0\"?><alice david=\"edgar\"><edgar/></alice>", new TypeFilter(XMLStreamConstants.START_ELEMENT));
reader.peek();
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextTag().getEventType());
reader.peek();
Assert.assertEquals(XMLStreamConstants.END_ELEMENT, reader.nextTag().getEventType());
}
}