📄 xmpppacketreader.java
字号:
/*
* Copyright 2001-2004 (C) MetaStuff, Ltd. All Rights Reserved.
*
* This software is open source.
* See the bottom of this file for the licence.
*
* $Id: XMPPPacketReader.java 3190 2005-12-12 15:00:46Z gato $
*/
package org.dom4j.io;
import org.dom4j.*;
import org.jivesoftware.openfire.net.MXParser;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.*;
import java.net.URL;
/**
* <p><code>XMPPPacketReader</code> is a Reader of DOM4J documents that
* uses the fast
* <a href="http://www.extreme.indiana.edu/soap/xpp/">XML Pull Parser 3.x</a>.
* It is very fast for use in SOAP style environments.</p>
*
* @author <a href="mailto:pelle@neubia.com">Pelle Braendgaard</a>
* @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
* @version $Revision: 3190 $
*/
public class XMPPPacketReader {
/**
* <code>DocumentFactory</code> used to create new document objects
*/
private DocumentFactory factory;
/**
* <code>XmlPullParser</code> used to parse XML
*/
private MXParser xppParser;
/**
* <code>XmlPullParser</code> used to parse XML
*/
private XmlPullParserFactory xppFactory;
/**
* DispatchHandler to call when each <code>Element</code> is encountered
*/
private DispatchHandler dispatchHandler;
/**
* Last time a full Document was read or a heartbeat was received. Hearbeats
* are represented as whitespaces received while a Document is not being parsed.
*/
private long lastActive = System.currentTimeMillis();
public XMPPPacketReader() {
}
public XMPPPacketReader(DocumentFactory factory) {
this.factory = factory;
}
/**
* <p>Reads a Document from the given <code>File</code></p>
*
* @param file is the <code>File</code> to read from.
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
* @throws java.net.MalformedURLException if a URL could not be made for the given File
*/
public Document read(File file) throws DocumentException, IOException, XmlPullParserException {
String systemID = file.getAbsolutePath();
return read(new BufferedReader(new FileReader(file)), systemID);
}
/**
* <p>Reads a Document from the given <code>URL</code></p>
*
* @param url <code>URL</code> to read from.
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
*/
public Document read(URL url) throws DocumentException, IOException, XmlPullParserException {
String systemID = url.toExternalForm();
return read(createReader(url.openStream()), systemID);
}
/**
* <p>Reads a Document from the given URL or filename.</p>
* <p/>
* <p/>
* If the systemID contains a <code>':'</code> character then it is
* assumed to be a URL otherwise its assumed to be a file name.
* If you want finer grained control over this mechansim then please
* explicitly pass in either a {@link URL} or a {@link File} instance
* instead of a {@link String} to denote the source of the document.
* </p>
*
* @param systemID is a URL for a document or a file name.
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
* @throws java.net.MalformedURLException if a URL could not be made for the given File
*/
public Document read(String systemID) throws DocumentException, IOException, XmlPullParserException {
if (systemID.indexOf(':') >= 0) {
// lets assume its a URL
return read(new URL(systemID));
}
else {
// lets assume that we are given a file name
return read(new File(systemID));
}
}
/**
* <p>Reads a Document from the given stream</p>
*
* @param in <code>InputStream</code> to read from.
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
*/
public Document read(InputStream in) throws DocumentException, IOException, XmlPullParserException {
return read(createReader(in));
}
/**
* <p>Reads a Document from the given stream</p>
*
* @param charSet the charSet that the input is encoded in
* @param in <code>InputStream</code> to read from.
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
*/
public Document read(String charSet, InputStream in)
throws DocumentException, IOException, XmlPullParserException
{
return read(createReader(in, charSet));
}
/**
* <p>Reads a Document from the given <code>Reader</code></p>
*
* @param reader is the reader for the input
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
*/
public Document read(Reader reader) throws DocumentException, IOException, XmlPullParserException {
getXPPParser().setInput(reader);
return parseDocument();
}
/**
* <p>Reads a Document from the given array of characters</p>
*
* @param text is the text to parse
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
*/
public Document read(char[] text) throws DocumentException, IOException, XmlPullParserException {
getXPPParser().setInput(new CharArrayReader(text));
return parseDocument();
}
/**
* <p>Reads a Document from the given stream</p>
*
* @param in <code>InputStream</code> to read from.
* @param systemID is the URI for the input
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
*/
public Document read(InputStream in, String systemID) throws DocumentException, IOException, XmlPullParserException {
return read(createReader(in), systemID);
}
/**
* <p>Reads a Document from the given <code>Reader</code></p>
*
* @param reader is the reader for the input
* @param systemID is the URI for the input
* @return the newly created Document instance
* @throws DocumentException if an error occurs during parsing.
*/
public Document read(Reader reader, String systemID) throws DocumentException, IOException, XmlPullParserException {
Document document = read(reader);
document.setName(systemID);
return document;
}
// Properties
//-------------------------------------------------------------------------
public MXParser getXPPParser() throws XmlPullParserException {
if (xppParser == null) {
xppParser = (MXParser) getXPPFactory().newPullParser();
}
return xppParser;
}
public XmlPullParserFactory getXPPFactory() throws XmlPullParserException {
if (xppFactory == null) {
xppFactory = XmlPullParserFactory.newInstance(MXParser.class.getName(), null);
}
xppFactory.setNamespaceAware(true);
return xppFactory;
}
public void setXPPFactory(XmlPullParserFactory xppFactory) {
this.xppFactory = xppFactory;
}
/**
* @return the <code>DocumentFactory</code> used to create document objects
*/
public DocumentFactory getDocumentFactory() {
if (factory == null) {
factory = DocumentFactory.getInstance();
}
return factory;
}
/**
* <p>This sets the <code>DocumentFactory</code> used to create new documents.
* This method allows the building of custom DOM4J tree objects to be implemented
* easily using a custom derivation of {@link DocumentFactory}</p>
*
* @param factory <code>DocumentFactory</code> used to create DOM4J objects
*/
public void setDocumentFactory(DocumentFactory factory) {
this.factory = factory;
}
/**
* Adds the <code>ElementHandler</code> to be called when the
* specified path is encounted.
*
* @param path is the path to be handled
* @param handler is the <code>ElementHandler</code> to be called
* by the event based processor.
*/
public void addHandler(String path, ElementHandler handler) {
getDispatchHandler().addHandler(path, handler);
}
/**
* Removes the <code>ElementHandler</code> from the event based
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -