From d1fdd497d9317a74123844f000217c27bd82ee8b Mon Sep 17 00:00:00 2001 From: rcollier Date: Sat, 23 Mar 2013 22:18:38 +0000 Subject: [PATCH] SMACK-415 Applied patch to fix improper use of parser. git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/branches/smack_3_3_0@13590 b35dd754-fafc-0310-a699-88a17e54d16e --- .../smackx/pubsub/provider/ItemProvider.java | 118 +++++++++++------- 1 file changed, 75 insertions(+), 43 deletions(-) diff --git a/source/org/jivesoftware/smackx/pubsub/provider/ItemProvider.java b/source/org/jivesoftware/smackx/pubsub/provider/ItemProvider.java index aabd4cb2f..833392a43 100644 --- a/source/org/jivesoftware/smackx/pubsub/provider/ItemProvider.java +++ b/source/org/jivesoftware/smackx/pubsub/provider/ItemProvider.java @@ -24,53 +24,85 @@ import org.jivesoftware.smackx.pubsub.packet.PubSubNamespace; import org.xmlpull.v1.XmlPullParser; /** - * Parses an item element as is defined in both the {@link PubSubNamespace#BASIC} and {@link PubSubNamespace#EVENT} - * namespaces. To parse the item contents, it will use whatever {@link PacketExtensionProvider} is registered in - * smack.providers for its element name and namespace. If no provider is registered, it will return a {@link SimplePayload}. + * Parses an item element as is defined in both the {@link PubSubNamespace#BASIC} and + * {@link PubSubNamespace#EVENT} namespaces. To parse the item contents, it will use whatever + * {@link PacketExtensionProvider} is registered in smack.providers for its element name and namespace. If no + * provider is registered, it will return a {@link SimplePayload}. * * @author Robin Collier */ -public class ItemProvider implements PacketExtensionProvider +public class ItemProvider implements PacketExtensionProvider { - public PacketExtension parseExtension(XmlPullParser parser) throws Exception - { - String id = parser.getAttributeValue(null, "id"); + public PacketExtension parseExtension(XmlPullParser parser) throws Exception + { + String id = parser.getAttributeValue(null, "id"); String node = parser.getAttributeValue(null, "node"); - String elem = parser.getName(); - - int tag = parser.next(); - - if (tag == XmlPullParser.END_TAG) - { - return new Item(id, node); - } - else - { - String payloadElemName = parser.getName(); - String payloadNS = parser.getNamespace(); - - if (ProviderManager.getInstance().getExtensionProvider(payloadElemName, payloadNS) == null) - { - boolean done = false; - StringBuilder payloadText = new StringBuilder(); - - while (!done) - { - if (tag == XmlPullParser.END_TAG && parser.getName().equals(elem)) - done = true; - else if (!((tag == XmlPullParser.START_TAG) && parser.isEmptyElementTag())) - payloadText.append(parser.getText()); - - if (!done) - tag = parser.next(); - } - return new PayloadItem(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText.toString())); - } - else - { - return new PayloadItem(id, node, PacketParserUtils.parsePacketExtension(payloadElemName, payloadNS, parser)); - } - } - } + String elem = parser.getName(); + + int tag = parser.next(); + + if (tag == XmlPullParser.END_TAG) + { + return new Item(id, node); + } + else + { + String payloadElemName = parser.getName(); + String payloadNS = parser.getNamespace(); + + if (ProviderManager.getInstance().getExtensionProvider(payloadElemName, payloadNS) == null) + { + boolean done = false; + StringBuilder payloadText = new StringBuilder(); + + while (!done) + { + if (tag == XmlPullParser.END_TAG && parser.getName().equals(elem)) + { + done = true; + } + else if (parser.getEventType() == XmlPullParser.START_TAG) + { + payloadText.append("<").append(parser.getName()); + + if (parser.getName().equals(payloadElemName) && (!payloadNS.isEmpty())) + payloadText.append(" xmlns=\"").append(payloadNS).append("\""); + int n = parser.getAttributeCount(); + + for (int i = 0; i < n; i++) + payloadText.append(" ").append(parser.getAttributeName(i)).append("=\"") + .append(parser.getAttributeValue(i)).append("\""); + + if (parser.isEmptyElementTag()) + { + payloadText.append("/>"); + done = true; + } + else + { + payloadText.append(">"); + } + } + else if (parser.getEventType() == XmlPullParser.END_TAG) + { + if (done) + done = false; + else + payloadText.append(""); + } + else if (parser.getEventType() == XmlPullParser.TEXT) + { + payloadText.append(parser.getText()); + } + tag = parser.next(); + } + return new PayloadItem(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText.toString())); + } + else { + return new PayloadItem(id, node, PacketParserUtils.parsePacketExtension( + payloadElemName, payloadNS, parser)); + } + } + } }