CVS Update: xmlpull-api-v1/addons/java/util/src/org/xmlpull/v1/util

Aleksander Andrzej Slominski <[email protected]> Sat, 3 May 2003 00:51:30 -0500 (EST)
Newsgroups gmane.text.xml.xmlpull.devel
Message-ID <[email protected]>
aslom       03/05/03 00:51:30

  Modified:    addons/java/util/src/org/xmlpull/v1/util XmlPullUtil.java
  Log:
  updated util class
  
  Revision  Changes    Path
  1.2       +230 -1    xmlpull-api-v1/addons/java/util/src/org/xmlpull/v1/util/XmlPullUtil.java
  
  Index: XmlPullUtil.java
  ===================================================================
  RCS file: /l/extreme/cvspub/xmlpull-api-v1/addons/java/util/src/org/xmlpull/v1/util/XmlPullUtil.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -t -w -r1.1 -r1.2
  --- XmlPullUtil.java	2 Mar 2003 18:39:44 -0000	1.1
  +++ XmlPullUtil.java	3 May 2003 05:51:29 -0000	1.2
  @@ -6,12 +6,241 @@
   import java.io.IOException;
   import org.xmlpull.v1.XmlPullParser;
   import org.xmlpull.v1.XmlPullParserException;
  +import org.xmlpull.v1.XmlSerializer;
   
   /**
  - * Handy functions that combines XMLPULL API into higher level functionality.
  + * Handy functions that combines XmlPull API into higher level functionality.
    *
    * @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
  + * @author Naresh Bhatia
    */
   public class XmlPullUtil {
  +
  +    public static final String XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
  +
  +    private XmlPullUtil() {}
  +
  +    /**
  +     * Return value of attribute with given name and no namespace.
  +     */
  +    public static String getAttributeValue(XmlPullParser pp, String name) {
  +        return pp.getAttributeValue(XmlPullParser.NO_NAMESPACE, name);
  +    }
  +
  +
  +    /**
  +     * Return PITarget from Processing Instruction (PI) as defined in
  +     * XML 1.0 Section 2.6 Processing Instructions
  +     *  <code>[16] PI ::= '&lt;?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'</code>
  +     */
  +    public static String getPITarget(XmlPullParser pp) throws IllegalStateException
  +    {
  +        int eventType;
  +        try {
  +            eventType = pp.getEventType();
  +        } catch(XmlPullParserException ex) {
  +            // should never happen ...
  +            throw new IllegalStateException(
  +                "could not determine parser state: "+ex+pp.getPositionDescription());
  +        }
  +        if( eventType != XmlPullParser.PROCESSING_INSTRUCTION ) {
  +            throw new IllegalStateException(
  +                "parser must be on processing instruction and not "
  +                    +XmlPullParser.TYPES[ eventType ]+pp.getPositionDescription());
  +        }
  +        final String PI = pp.getText();
  +        for (int i = 0; i < PI.length(); i++)
  +        {
  +            if( isS(PI.charAt(i)) ) {
  +                // assert i > 0
  +                return PI.substring(0,i);
  +            }
  +        }
  +        return PI;
  +    }
  +
  +    /**
  +     * Return everything past PITarget and S from Processing Instruction (PI) as defined in
  +     * XML 1.0 Section 2.6 Processing Instructions
  +     *  <code>[16] PI ::= '&lt;?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'</code>
  +     *
  +     * <p><b>NOTE:</b> if there is no PI data it returns empty string.
  +     */
  +    public static String getPIData(XmlPullParser pp) throws IllegalStateException
  +    {
  +        int eventType;
  +        try {
  +            eventType = pp.getEventType();
  +        } catch(XmlPullParserException ex) {
  +            // should never happen ...
  +            throw new IllegalStateException(
  +                "could not determine parser state: "+ex+pp.getPositionDescription());
  +        }
  +        if( eventType != XmlPullParser.PROCESSING_INSTRUCTION ) {
  +            throw new IllegalStateException(
  +                "parser must be on processing instruction and not "
  +                    +XmlPullParser.TYPES[ eventType ]+pp.getPositionDescription());
  +        }
  +        final String PI = pp.getText();
  +        int pos = -1;
  +        for (int i = 0; i < PI.length(); i++)
  +        {
  +            if( isS(PI.charAt(i)) ) {
  +                pos = i;
  +            } else if(pos > 0) {
  +                return PI.substring(i);
  +            }
  +        }
  +        return "";
  +
  +    }
  +
  +    /**
  +     * Return true if chacters is S as defined in XML 1.0
  +     * <code>S ::=  (#x20 | #x9 | #xD | #xA)+</code>
  +     */
  +    private static  boolean isS(char ch) {
  +        return (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t');
  +    }
  +
  +    /**
  +     * Skip sub tree that is currently porser positioned on.
  +     * <br>NOTE: parser must be on START_TAG and when funtion returns
  +     * parser will be positioned on corresponding END_TAG
  +     */
  +    public static void skipSubTree(XmlPullParser pp)
  +        throws XmlPullParserException, IOException
  +    {
  +        pp.require(XmlPullParser.START_TAG, null, null);
  +        int level = 1;
  +        while(level > 0) {
  +            int eventType = pp.next();
  +            if(eventType == XmlPullParser.END_TAG) {
  +                --level;
  +            } else if(eventType == XmlPullParser.START_TAG) {
  +                ++level;
  +            }
  +        }
  +    }
  +
  +    /**
  +     * call parser nextTag() and check that it is START_TAG, throw exception if not.
  +     */
  +    public static void nextStartTag(XmlPullParser pp)
  +        throws XmlPullParserException, IOException
  +    {
  +        if(pp.nextTag() != XmlPullParser.START_TAG) {
  +            throw new XmlPullParserException(
  +                "expected START_TAG and not "+pp.getPositionDescription());
  +        }
  +    }
  +
  +    /**
  +     * combine nextTag(); pp.require(pp.START_TAG, namespace, name);
  +     */
  +    public static void nextStartTag(XmlPullParser pp, String namespace, String name)
  +        throws XmlPullParserException, IOException
  +    {
  +        pp.nextTag();
  +        pp.require(XmlPullParser.START_TAG, namespace, name);
  +    }
  +
  +
  +
  +
  +    /**
  +     * combine nextTag(); pp.require(pp.END_TAG, namespace, name);
  +     */
  +    public static void nextEndTag(XmlPullParser pp, String namespace, String name)
  +        throws XmlPullParserException, IOException
  +    {
  +        pp.nextTag();
  +        pp.require(XmlPullParser.END_TAG, namespace, name);
  +    }
  +
  +
  +    /**
  +     * Read text content of element ith given namespace and name
  +     * (use null namespace do indicate that nemspace should not be checked)
  +     */
  +
  +    public static String nextText(XmlPullParser pp, String namespace, String name)
  +        throws IOException, XmlPullParserException
  +    {
  +        if(name == null) {
  +            throw new XmlPullParserException("name for element can not be null");
  +        }
  +        pp.require(XmlPullParser.START_TAG, namespace, name);
  +        return pp.nextText();
  +    }
  +
  +    /**
  +     * Read attribute value and return it or throw exception if
  +     * current element does not have such attribute.
  +     */
  +
  +    public static String getRequiredAttributeValue(XmlPullParser pp, String namespace, String name)
  +        throws IOException, XmlPullParserException
  +    {
  +        String value = pp.getAttributeValue(namespace, name);
  +        if (value == null) {
  +            throw new XmlPullParserException("required attribute "+name+" is not present");
  +        } else {
  +            return value;
  +        }
  +    }
  +
  +    /**
  +     * Call parser nextTag() and check that it is END_TAG, throw exception if not.
  +     */
  +    public static void nextEndTag(XmlPullParser pp) throws XmlPullParserException, IOException
  +    {
  +        if(pp.nextTag() != XmlPullParser.END_TAG) {
  +            throw new XmlPullParserException(
  +                "expected END_TAG and not"+pp.getPositionDescription());
  +        }
  +    }
  +
  +
  +    /**
  +     * Tests if the current event is of the given type and if the namespace and name match.
  +     * null will match any namespace and any name. If the test passes a true is returned
  +     * otherwise a false is returned.
  +     */
  +    public static boolean matches(XmlPullParser pp, int type, String namespace, String name)
  +        throws XmlPullParserException
  +    {
  +        boolean matches = type != pp.getEventType()
  +            || (namespace != null && !namespace.equals (pp.getNamespace()))
  +            || (name != null && !name.equals (pp.getName ()));
  +
  +        return matches;
  +    }
  +
  +
  +    /**
  +     * Writes a simple element such as <username>johndoe</username>. The namespace
  +     * and elementText are allowed to be null. If elementText is null, an xsi:nil="true"
  +     * will be added as an attribute.
  +     */
  +    public static void writeSimpleElement(XmlSerializer serializer,
  +                                   String namespace,
  +                                   String elementName,
  +                                   String elementText)
  +        throws IOException, XmlPullParserException {
  +
  +        if (elementName == null) {
  +            throw new XmlPullParserException("name for element can not be null");
  +        }
  +
  +        serializer.startTag(namespace, elementName);
  +        if (elementText == null) {
  +            serializer.attribute(XSI_NS, "nil", "true");
  +        } else {
  +            serializer.text(elementText);
  +        }
  +        serializer.endTag(namespace, elementName);
  +    }
  +
   }
   
  
  
  


------------------------ Yahoo! Groups Sponsor ---------------------~-->
Get A Free Psychic Reading!
Your Online Answer To Life's Important Questions.
http://us.click.yahoo.com/cjB9SD/od7FAA/uetFAA/2U_rlB/TM
---------------------------------------------------------------------~->

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/