CVS Update: xmlpull-api-v1/src/java/samples
Aleksander Andrzej Slominski <[email protected]> Fri, 13 Feb 2004 16:06:02 -0500 (EST)
| Newsgroups | gmane.text.xml.xmlpull.devel |
|---|---|
| Message-ID | <[email protected]> |
aslom 04/02/13 16:06:02
Added: src/java/samples CloneableFileReader.java CloneParser.java
Log:
Sample that demonstrates how to XmlPullParser that implements Cloneable
Sampe cloneable file reader (not tested!)
Revision Changes Path
1.1 xmlpull-api-v1/src/java/samples/CloneableFileReader.java
Index: CloneableFileReader.java
===================================================================
/* -*- c-basic-offset: 4; indent-tabs-mode: nil; -*- //------100-columns-wide------>|*/
// for license please see accompanying LICENSE.txt file (available also at http://www.xmlpull.org/)
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
* Simple Cloneable File Reader to allow cloning pull parsers efficiently.
*
* @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
*/
public class CloneableFileReader extends Reader implements Cloneable
{
FileReader freader;
String filename;
long position;
public CloneableFileReader(String filename) throws FileNotFoundException {
this.freader = new FileReader(filename);
this.filename = filename;
}
//JDK15 covariant public CloneableFileReader clone() throws CloneNotSupportedException {
public Object clone() throws CloneNotSupportedException {
CloneableFileReader clone;
try {
clone = new CloneableFileReader(filename);
clone.skip(position);
} catch (IOException e) {
throw new CloneNotSupportedException("could not clone file reader "+e);
}
return clone;
}
public int read(char[] cbuf,
int offset,
int length)
throws IOException
{
int actual = freader.read(cbuf, offset, length);
if(actual > 0) {
position += actual;
}
return actual;
}
// re-implement remaining functions similar to read above...
public void close() throws IOException {
freader.close();
}
}
1.1 xmlpull-api-v1/src/java/samples/CloneParser.java
Index: CloneParser.java
===================================================================
/* -*- c-basic-offset: 4; indent-tabs-mode: nil; -*- //------100-columns-wide------>|*/
// for license please see accompanying LICENSE.txt file (available also at http://www.xmlpull.org/)
//import CloneableMXParser;
import java.io.CharArrayReader;
import java.io.Reader;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
/**
* An example to demonstrate how cloneable parser can be used.
*
* @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
*/
class CloneParser {
public static class CloenableCharArrayReader extends CharArrayReader implements Cloneable {
public CloenableCharArrayReader(char buf[]) {
super(buf);
}
public Object clone() throws CloneNotSupportedException
{
CloenableCharArrayReader cloned = (CloenableCharArrayReader) super.clone();
cloned.buf = buf.clone();
//UGLY UGLY UGLY ...
cloned.lock = cloned;
return cloned;
}
}
public static void main(String[] args) throws Exception
{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(
System.getProperty(XmlPullParserFactory.PROPERTY_NAME), null);
//factory.setNamespaceAware(true);
factory.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
XmlPullParser mpp = factory.newPullParser();
final String XML = "<foo><baz>bar</baz><moo>maz</moo></foo>";
//RecordableXmlPullParser mpp = new RecordableXmlPullParser(xpp);
//CloneableMXParser mpp = new CloneableMXParser();
System.out.println("parser implementation class is "+mpp.getClass());
Reader cpp = new CloenableCharArrayReader(XML.toCharArray());
mpp.setInput(cpp);
mpp.next(); print(mpp);
mpp.next(); print(mpp);
System.out.println(">>> SPLIT POINT "+mpp);
//CloneableMXParser m2 = (CloneableMXParser) mpp.clone();
XmlPullParser m2 = cloneParserIfCloneable(mpp);
mpp.next(); print(mpp);
mpp.next(); print(mpp);
mpp.next(); print(mpp);
while(mpp.getEventType() != XmlPullParser.END_DOCUMENT) {
mpp.next(); print(mpp);
}
System.out.println(">>> CLONED PARSER "+m2);
//mpp.rewind();
while(m2.getEventType() != XmlPullParser.END_DOCUMENT) {
m2.next(); print(m2);
}
System.out.println(">>> END");
}
private static XmlPullParser cloneParserIfCloneable(XmlPullParser pp)
throws CloneNotSupportedException
{
if(pp instanceof java.lang.Cloneable) {
// due to design decisions Cloneable is emtpy interface without clone() method
//use reflection to call clone() -- this is getting ugly!!!!
// more background on this in http://www.artima.com/intv/issues3.html "The clone Dilemma"
Object o;
try {
o = pp.getClass().getMethod("clone", null).invoke(pp, null);
} catch (Exception e) {
CloneNotSupportedException ee =
new CloneNotSupportedException("failed to call clone() on "+pp+":"+e);
ee.initCause(e);
throw ee;
}
return (XmlPullParser) o;
}
throw new CloneNotSupportedException(
"could not clone pull parser as it does not implement Cloneable "+pp.getClass());
}
private static void print(XmlPullParser pp) throws XmlPullParserException {
int type = pp.getEventType();
System.out.print(XmlPullParser.TYPES[type]+" ");
if(type == XmlPullParser.START_TAG || type == XmlPullParser.END_TAG) {
System.out.print(pp.getName());
} else if(type == XmlPullParser.TEXT) {
System.out.print("'"+pp.getText()+"'");
}
System.out.println();
}
}
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/xmlpull-dev/
<*> To unsubscribe from this group, send an email to:
[email protected]
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/