/* -*- 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 Aleksander Slominski */ 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 = (char[]) buf.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 = "barmaz"; //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(); } }