📄 reversiblexmlstreamreader.java
字号:
/*
* $Id$
* --------------------------------------------------------------------------------------
* Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com
*
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.module.xml.stax;
import java.util.ArrayList;
import java.util.List;
import javanet.staxutils.events.AttributeEvent;
import javanet.staxutils.events.CDataEvent;
import javanet.staxutils.events.CharactersEvent;
import javanet.staxutils.events.CommentEvent;
import javanet.staxutils.events.EndDocumentEvent;
import javanet.staxutils.events.EndElementEvent;
import javanet.staxutils.events.NamespaceEvent;
import javanet.staxutils.events.StartDocumentEvent;
import javanet.staxutils.events.StartElementEvent;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import javax.xml.stream.Location;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Namespace;
import javax.xml.stream.events.XMLEvent;
public class ReversibleXMLStreamReader extends DelegateXMLStreamReader
{
private List events;
private XMLEvent current;
private int replayIndex;
private boolean tracking = false;
private boolean replay = false;
public ReversibleXMLStreamReader(XMLStreamReader reader)
{
super(reader);
}
public int nextTag() throws XMLStreamException
{
int eventType = next();
while ((eventType == XMLStreamConstants.CHARACTERS && isWhiteSpace())
|| (eventType == XMLStreamConstants.CDATA && isWhiteSpace())
|| eventType == XMLStreamConstants.SPACE
|| eventType == XMLStreamConstants.PROCESSING_INSTRUCTION
|| eventType == XMLStreamConstants.COMMENT)
{
eventType = next();
}
if (eventType != XMLStreamConstants.START_ELEMENT && eventType != XMLStreamConstants.END_ELEMENT)
{
throw new XMLStreamException("expected start or end tag", getLocation());
}
return eventType;
}
public void reset()
{
replay = true;
replayIndex = 0;
current = null;
}
public boolean isTracking()
{
return tracking;
}
public void setTracking(boolean tracking)
{
this.tracking = tracking;
if (tracking)
{
replayIndex = 0;
if (events == null)
{
events = new ArrayList();
}
}
}
public int next() throws XMLStreamException
{
int event;
if (replay)
{
if (replayIndex == events.size())
{
replay = false;
event = super.next();
}
else
{
event = getReplayEvent();
}
}
else
{
event = super.next();
}
if (tracking && !replay)
{
capture(event);
}
return event;
}
private int getReplayEvent()
{
current = (XMLEvent) events.get(replayIndex);
replayIndex++;
return current.getEventType();
}
/**
* Capture the current event;
*
* @param event
*/
private void capture(int event)
{
switch (event)
{
case XMLStreamConstants.START_DOCUMENT :
events.add(new StartDocumentEvent(getEncoding(), new Boolean(isStandalone()), getVersion(),
getLocation()));
break;
case XMLStreamConstants.END_DOCUMENT :
events.add(new EndDocumentEvent(getLocation()));
break;
case XMLStreamConstants.START_ELEMENT :
events.add(createStartElementEvent());
break;
case XMLStreamConstants.END_ELEMENT :
events.add(new EndElementEvent(getName(), getNamespaces().iterator(), getLocation()));
break;
case XMLStreamConstants.CDATA :
events.add(new CDataEvent(getText(), getLocation()));
break;
case XMLStreamConstants.CHARACTERS :
events.add(new CharactersEvent(getText(), getLocation()));
break;
case XMLStreamConstants.COMMENT :
events.add(new CommentEvent(getText(), getLocation()));
break;
case XMLStreamConstants.DTD :
break;
case XMLStreamConstants.ENTITY_DECLARATION :
break;
case XMLStreamConstants.ENTITY_REFERENCE :
break;
case XMLStreamConstants.NOTATION_DECLARATION :
break;
case XMLStreamConstants.PROCESSING_INSTRUCTION :
break;
case XMLStreamConstants.SPACE :
break;
}
}
private StartElementEvent createStartElementEvent()
{
List attributes = new ArrayList();
for (int i = 0; i < getAttributeCount(); i++)
{
attributes.add(new AttributeEvent(getAttributeName(i), getAttributeValue(i)));
}
return new StartElementEventX(getName(), attributes, getNamespaces(),
createContext(), getLocation(), null);
}
private NamespaceContext createContext()
{
MapNamespaceContext ctx = new MapNamespaceContext();
for (int i = 0; i < getNamespaceCount(); i++)
{
ctx.addNamespace(getNamespacePrefix(i), getNamespaceURI(i));
}
return ctx;
}
private List getNamespaces()
{
List namespaces = new ArrayList();
for (int i = 0; i < getNamespaceCount(); i++)
{
namespaces.add(new NamespaceEvent(getNamespacePrefix(i), getNamespaceURI(i), getLocation()));
}
return namespaces;
}
public String getElementText() throws XMLStreamException
{
if (getEventType() != XMLStreamConstants.START_ELEMENT)
{
throw new XMLStreamException("parser must be on START_ELEMENT to read next text", getLocation());
}
int eventType = next();
StringBuffer buf = new StringBuffer();
while (eventType != XMLStreamConstants.END_ELEMENT)
{
if (eventType == XMLStreamConstants.CHARACTERS || eventType == XMLStreamConstants.CDATA
|| eventType == XMLStreamConstants.SPACE || eventType == XMLStreamConstants.ENTITY_REFERENCE)
{
buf.append(getText());
}
else if (eventType == XMLStreamConstants.PROCESSING_INSTRUCTION
|| eventType == XMLStreamConstants.COMMENT)
{
// skipping
}
else if (eventType == XMLStreamConstants.END_DOCUMENT)
{
throw new XMLStreamException("unexpected end of document when reading element text content");
}
else if (eventType == XMLStreamConstants.START_ELEMENT)
{
throw new XMLStreamException("element text content may not contain START_ELEMENT",
getLocation());
}
else
{
throw new XMLStreamException("Unexpected event type " + eventType, getLocation());
}
eventType = next();
}
return buf.toString();
}
public int getAttributeCount()
{
if (replay)
{
return ((StartElementEventX) current).getAttributeList().size();
}
else
{
return super.getAttributeCount();
}
}
public String getAttributeLocalName(int i)
{
if (replay)
{
Attribute att = (Attribute) ((StartElementEventX) current).getAttributeList().get(i);
return att.getName().getLocalPart();
}
else
{
return super.getAttributeLocalName(i);
}
}
public QName getAttributeName(int i)
{
if (replay)
{
Attribute att = (Attribute) ((StartElementEventX) current).getAttributeList().get(i);
return att.getName();
}
else
{
return super.getAttributeName(i);
}
}
public String getAttributeNamespace(int i)
{
if (replay)
{
Attribute att = (Attribute) ((StartElementEventX) current).getAttributeList().get(i);
return att.getName().getNamespaceURI();
}
else
{
return super.getAttributeNamespace(i);
}
}
public String getAttributePrefix(int i)
{
if (replay)
{
Attribute att = (Attribute) ((StartElementEventX) current).getAttributeList().get(i);
return att.getName().getPrefix();
}
else
{
return super.getAttributePrefix(i);
}
}
public String getAttributeType(int i)
{
if (replay)
{
Attribute att = (Attribute) ((StartElementEventX) current).getAttributeList().get(i);
return att.getDTDType();
}
else
{
return super.getAttributeType(i);
}
}
public String getAttributeValue(int i)
{
if (replay)
{
Attribute att = (Attribute) ((StartElementEventX) current).getAttributeList().get(i);
return att.getValue();
}
else
{
return super.getAttributeValue(i);
}
}
public String getAttributeValue(String ns, String local)
{
if (replay)
{
Attribute att = ((StartElementEventX) current).getAttributeByName(new QName(ns, local));
if (att != null)
{
return att.getValue();
}
else
{
return null;
}
}
else
{
return super.getAttributeValue(ns, local);
}
}
public int getEventType()
{
if (replay)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -