diff options
author | Jen Hsieh <jenhsieh@google.com> | 2009-08-10 14:21:24 -0700 |
---|---|---|
committer | Jen Hsieh <jenhsieh@google.com> | 2009-08-10 14:55:27 -0700 |
commit | 0c7aea12e37bf285a40ed0f7f31712ed141419f3 (patch) | |
tree | 02bbf4f8141830b736236b3c9291603f0f5b8ac5 | |
parent | 4c60174bffc0a5ba38c50fa4a753a60fab364046 (diff) | |
download | gdata-0c7aea12e37bf285a40ed0f7f31712ed141419f3.tar.gz |
Fixed XmlGDataParser for batch operations. We must check the batch namespace first in case of common tag names (e.g. "id"). Added comment.
-rw-r--r-- | src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java b/src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java index 163bdf7..25c22f3 100644 --- a/src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java +++ b/src/com/google/wireless/gdata2/parser/xml/XmlGDataParser.java @@ -65,7 +65,7 @@ public class XmlGDataParser implements GDataParser { if (!parser.getFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES)) { - throw new IllegalStateException("A XmlGDataParser needs to be " + throw new IllegalStateException("A XmlGDataParser needs to be " + "constructed with a namespace aware XmlPullParser"); } @@ -111,9 +111,9 @@ public class XmlGDataParser implements GDataParser { try { return parsePartialFeed(); } catch (XmlPullParserException xppe) { - throw new ParseException("Unable to parse <partial> feed start", xppe); + throw new ParseException("Unable to parse <partial> feed start", xppe); } catch (IOException ioe) { - throw new ParseException("Unable to parse <partial> feed start", ioe); + throw new ParseException("Unable to parse <partial> feed start", ioe); } } else if (XmlNametable.FEED.equals(name)) { try { @@ -169,9 +169,9 @@ public class XmlGDataParser implements GDataParser { } /** - * Parses the partial feed (but not any entries). This requires a - * namespace enabled parser - * + * Parses the partial feed (but not any entries). This requires a + * namespace enabled parser + * * @return A new {@link Feed} containing information about the feed. * @throws XmlPullParserException Thrown if the XML document cannot be * parsed. @@ -188,13 +188,13 @@ public class XmlGDataParser implements GDataParser { switch (eventType) { case XmlPullParser.START_TAG: String name = parser.getName(); - String namespace = parser.getNamespace(); + String namespace = parser.getNamespace(); if (XmlGDataParser.NAMESPACE_ATOM_URI.equals(namespace)) { if (XmlNametable.FEED.equals(name)) { feed = parseFeed(); } - } + } default: break; } @@ -206,9 +206,9 @@ public class XmlGDataParser implements GDataParser { /** - * Parses the feed (but not any entries). This requires a - * namespace enabled parser - * + * Parses the feed (but not any entries). This requires a + * namespace enabled parser + * * @return A new {@link Feed} containing information about the feed. * @throws XmlPullParserException Thrown if the XML document cannot be * parsed. @@ -219,13 +219,13 @@ public class XmlGDataParser implements GDataParser { Feed feed = createFeed(); // parsing <feed> feed.setETag(parser.getAttributeValue(NAMESPACE_GD_URI, XmlNametable.ETAG)); - + int eventType = parser.next(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: String name = parser.getName(); - String namespace = parser.getNamespace(); + String namespace = parser.getNamespace(); if (XmlGDataParser.NAMESPACE_OPENSEARCH_URI.equals(namespace)) { if (XmlNametable.TOTAL_RESULTS.equals(name)) { @@ -260,7 +260,7 @@ public class XmlGDataParser implements GDataParser { // stop parsing here. // TODO: pay attention to depth? return feed; - } + } } else { handleExtraElementInFeed(feed); } @@ -321,7 +321,7 @@ public class XmlGDataParser implements GDataParser { } String name = parser.getName(); - // if, in the future, we have a batch feed with partial results, the next element + // if, in the future, we have a batch feed with partial results, the next element // can be either an entry or a partial element if ((!XmlNametable.ENTRY.equals(name) && @@ -485,8 +485,8 @@ public class XmlGDataParser implements GDataParser { /** * Parses the current partial start in the XML document. Assumes - * that the parser is currently pointing just at the beginning - * of an <partial>. + * that the parser is currently pointing just at the beginning + * of an <partial>. * * @param entry The entry that will be filled. * @throws XmlPullParserException Thrown if the XML cannot be parsed. @@ -501,7 +501,7 @@ public class XmlGDataParser implements GDataParser { IllegalStateException("Expected <partial>: Actual element: <" + parser.getName() + ">"); } - + fields = parser.getAttributeValue(null /* ns */, XmlNametable.FIELDS); // now skip to the next parser event parser.next(); @@ -514,7 +514,7 @@ public class XmlGDataParser implements GDataParser { if (XmlNametable.ENTRY.equals(name)) { handleEntry(entry); return; - } + } default: break; } @@ -524,8 +524,8 @@ public class XmlGDataParser implements GDataParser { /** * Parses the current entry in the XML document. Assumes that the parser - * is currently pointing just at the beginning of an - * <entry>. + * is currently pointing just at the beginning of an + * <entry>. * * @param entry The entry that will be filled. * @throws XmlPullParserException Thrown if the XML cannot be parsed. @@ -540,7 +540,7 @@ public class XmlGDataParser implements GDataParser { IllegalStateException("Expected <entry>: Actual element: <" + parser.getName() + ">"); } - + entry.setETag(parser.getAttributeValue(NAMESPACE_GD_URI, XmlNametable.ETAG)); entry.setFields(fields); // now skip to the next parser event @@ -555,6 +555,10 @@ public class XmlGDataParser implements GDataParser { if (XmlNametable.ENTRY.equals(name)) { // stop parsing here. return; + } else if (NAMESPACE_BATCH_URI.equals(parser.getNamespace())) { + // We must check for the BATCH namespace first in case the tag name + // is reused in another namespace. e.g. "id". + handleBatchInfo(entry); } else if (XmlNametable.ID.equals(name)) { entry.setId(XmlUtils.extractChildText(parser)); } else if (XmlNametable.TITLE.equals(name)) { @@ -602,8 +606,6 @@ public class XmlGDataParser implements GDataParser { entry.setUpdateDate(XmlUtils.extractChildText(parser)); } else if (XmlNametable.DELETED.equals(name)) { entry.setDeleted(true); - } else if (NAMESPACE_BATCH_URI.equals(parser.getNamespace())) { - handleBatchInfo(entry); } else { handleExtraElementInEntry(entry); } @@ -668,9 +670,9 @@ public class XmlGDataParser implements GDataParser { status.setContentType(getAttribute(parser, XmlNametable.CONTENT_TYPE)); // TODO: Read sub-tree into content. skipSubTree(); - } else if ("id".equals(name)) { + } else if (XmlNametable.ID.equals(name)) { BatchUtils.setBatchId(entry, XmlUtils.extractChildText(parser)); - } else if ("operation".equals(name)) { + } else if (XmlNametable.OPERATION.equals(name)) { BatchUtils.setBatchOperation(entry, getAttribute(parser, XmlNametable.TYPE)); } else if ("interrupted".equals(name)) { BatchInterrupted interrupted = new BatchInterrupted(); |