SMACK-415 Added fix for handling the empty tag case.

git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/branches/smack_3_3_0@13624 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
rcollier 2013-04-27 15:37:21 +00:00
parent 3c975426f6
commit f0d729ef52
2 changed files with 168 additions and 54 deletions

View File

@ -36,14 +36,13 @@ public class ItemProvider implements PacketExtensionProvider
public PacketExtension parseExtension(XmlPullParser parser) throws Exception public PacketExtension parseExtension(XmlPullParser parser) throws Exception
{ {
String id = parser.getAttributeValue(null, "id"); String id = parser.getAttributeValue(null, "id");
String node = parser.getAttributeValue(null, "node");
String elem = parser.getName(); String elem = parser.getName();
int tag = parser.next(); int tag = parser.next();
if (tag == XmlPullParser.END_TAG) if (tag == XmlPullParser.END_TAG)
{ {
return new Item(id, node); return new Item(id);
} }
else else
{ {
@ -53,6 +52,7 @@ public class ItemProvider implements PacketExtensionProvider
if (ProviderManager.getInstance().getExtensionProvider(payloadElemName, payloadNS) == null) if (ProviderManager.getInstance().getExtensionProvider(payloadElemName, payloadNS) == null)
{ {
boolean done = false; boolean done = false;
boolean isEmptyElement = false;
StringBuilder payloadText = new StringBuilder(); StringBuilder payloadText = new StringBuilder();
while (!done) while (!done)
@ -76,7 +76,7 @@ public class ItemProvider implements PacketExtensionProvider
if (parser.isEmptyElementTag()) if (parser.isEmptyElementTag())
{ {
payloadText.append("/>"); payloadText.append("/>");
done = true; isEmptyElement = true;
} }
else else
{ {
@ -85,8 +85,8 @@ public class ItemProvider implements PacketExtensionProvider
} }
else if (parser.getEventType() == XmlPullParser.END_TAG) else if (parser.getEventType() == XmlPullParser.END_TAG)
{ {
if (done) if (isEmptyElement)
done = false; isEmptyElement = false;
else else
payloadText.append("</").append(parser.getName()).append(">"); payloadText.append("</").append(parser.getName()).append(">");
} }
@ -96,10 +96,10 @@ public class ItemProvider implements PacketExtensionProvider
} }
tag = parser.next(); tag = parser.next();
} }
return new PayloadItem<SimplePayload>(id, node, new SimplePayload(payloadElemName, payloadNS, payloadText.toString())); return new PayloadItem<SimplePayload>(id, new SimplePayload(payloadElemName, payloadNS, payloadText.toString()));
} }
else { else {
return new PayloadItem<PacketExtension>(id, node, PacketParserUtils.parsePacketExtension( return new PayloadItem<PacketExtension>(id, PacketParserUtils.parsePacketExtension(
payloadElemName, payloadNS, parser)); payloadElemName, payloadNS, parser));
} }
} }

View File

@ -19,14 +19,19 @@
*/ */
package org.jivesoftware.smackx.pubsub; package org.jivesoftware.smackx.pubsub;
import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; import static org.custommonkey.xmlunit.XMLAssert.*;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue;
import java.io.Reader; import java.io.Reader;
import java.io.StringReader; import java.io.StringReader;
import org.jivesoftware.smack.TestUtils;
import org.jivesoftware.smack.ThreadedDummyConnection; import org.jivesoftware.smack.ThreadedDummyConnection;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.util.PacketParserUtils;
import org.jivesoftware.smackx.pubsub.packet.PubSubNamespace;
import org.jivesoftware.smackx.pubsub.provider.ItemsProvider; import org.jivesoftware.smackx.pubsub.provider.ItemsProvider;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@ -95,37 +100,146 @@ public class ItemValidationTest
assertXMLEqual(nodeIdCtrl, itemWithNodeId.toXML()); assertXMLEqual(nodeIdCtrl, itemWithNodeId.toXML());
} }
// @Test @Test
// public void parseBasicItemWithoutNode() throws Exception public void parseBasicItem() throws Exception
// { {
// XmlPullParser parser = new MXParser(); XmlPullParser parser = TestUtils.getMessageParser(
// Reader reader = new StringReader( "<message from='pubsub.myserver.com' to='francisco@denmark.lit' id='foo'>" +
// "<event xmlns='http://jabber.org/protocol/pubsub#event'>" + "<event xmlns='http://jabber.org/protocol/pubsub#event'>" +
// "<items node='testNode'>" + "<items node='testNode'>" +
// "<item id='testid1' />" + "<item id='testid1' />" +
// "</items></event>"); "</items>" +
// parser.setInput(reader); "</event>" +
// ItemsProvider itemsProvider = new ItemsProvider(); "</message>");
// ItemsExtension ext = (ItemsExtension) itemsProvider.parseExtension(parser);
// Item basicItem = (Item) ext.getItems().get(0);
//
// assertEquals("testid1", basicItem.getId());
// assertNull(basicItem.getNode());
// }
// @Test Packet message = PacketParserUtils.parseMessage(parser);
// public void parseBasicItemNode() throws Exception PacketExtension eventExt = message.getExtension(PubSubNamespace.EVENT.getXmlns());
// {
// BlockingQueue<Item> itemQ = new ArrayBlockingQueue<Item>(1); assertTrue(eventExt instanceof EventElement);
// EventElement event = (EventElement) eventExt;
// setupListener(itemQ); assertEquals(EventElementType.items, event.getEventType());
// Message itemMsg = getMessage("<item id='testid1' node='testNode'>"); assertEquals(1, event.getExtensions().size());
// connection.addMessage(itemMsg); assertTrue(event.getExtensions().get(0) instanceof ItemsExtension);
// assertEquals(1, ((ItemsExtension)event.getExtensions().get(0)).items.size());
// Item basicItem = itemQ.poll(2, TimeUnit.SECONDS);
// PacketExtension itemExt = ((ItemsExtension)event.getExtensions().get(0)).items.get(0);
// assertNotNull(basicItem); assertTrue(itemExt instanceof Item);
// assertEquals("testid1", basicItem.getId()); assertEquals("testid1", ((Item)itemExt).getId());
// assertEquals("testNode", basicItem.getNode()); }
// }
@Test
public void parseSimplePayloadItem() throws Exception
{
String itemContent = "<foo xmlns='smack:test'>Some text</foo>";
XmlPullParser parser = TestUtils.getMessageParser(
"<message from='pubsub.myserver.com' to='francisco@denmark.lit' id='foo'>" +
"<event xmlns='http://jabber.org/protocol/pubsub#event'>" +
"<items node='testNode'>" +
"<item id='testid1' >" +
itemContent +
"</item>" +
"</items>" +
"</event>" +
"</message>");
Packet message = PacketParserUtils.parseMessage(parser);
PacketExtension eventExt = message.getExtension(PubSubNamespace.EVENT.getXmlns());
EventElement event = (EventElement) eventExt;
PacketExtension itemExt = ((ItemsExtension)event.getExtensions().get(0)).items.get(0);
assertTrue(itemExt instanceof PayloadItem<?>);
PayloadItem<?> item = (PayloadItem<?>)itemExt;
assertEquals("testid1", item.getId());
assertTrue(item.getPayload() instanceof SimplePayload);
SimplePayload payload = (SimplePayload) item.getPayload();
assertEquals("foo", payload.getElementName());
assertEquals("smack:test", payload.getNamespace());
assertXMLEqual(itemContent, payload.toXML());
}
@Test
public void parseComplexItem() throws Exception
{
String itemContent =
"<entry xmlns='http://www.w3.org/2005/Atom'>" +
"<title>Soliloquy</title>" +
"<summary>" +
"To be, or not to be: that is the question:" +
"Whether 'tis nobler in the mind to suffer" +
"The slings and arrows of outrageous fortune," +
"Or to take arms against a sea of troubles," +
"And by opposing end them?" +
"</summary>" +
"<link rel='alternate' type='text/html' href='http://denmark.lit/2003/12/13/atom03'/>" +
"<id>tag:denmark.lit,2003:entry-32397</id>" +
"<published>2003-12-13T18:30:02Z</published>" +
"<updated>2003-12-13T18:30:02Z</updated>" +
"</entry>";
XmlPullParser parser = TestUtils.getMessageParser(
"<message from='pubsub.myserver.com' to='francisco@denmark.lit' id='foo'>" +
"<event xmlns='http://jabber.org/protocol/pubsub#event'>" +
"<items node='testNode'>" +
"<item id='testid1' >" +
itemContent +
"</item>" +
"</items>" +
"</event>" +
"</message>");
Packet message = PacketParserUtils.parseMessage(parser);
PacketExtension eventExt = message.getExtension(PubSubNamespace.EVENT.getXmlns());
EventElement event = (EventElement) eventExt;
PacketExtension itemExt = ((ItemsExtension)event.getExtensions().get(0)).items.get(0);
assertTrue(itemExt instanceof PayloadItem<?>);
PayloadItem<?> item = (PayloadItem<?>)itemExt;
assertEquals("testid1", item.getId());
assertTrue(item.getPayload() instanceof SimplePayload);
SimplePayload payload = (SimplePayload) item.getPayload();
assertEquals("entry", payload.getElementName());
assertEquals("http://www.w3.org/2005/Atom", payload.getNamespace());
assertXMLEqual(itemContent, payload.toXML());
}
@Test
public void parseEmptyTag() throws Exception
{
String itemContent = "<foo xmlns='smack:test'><bar/></foo>";
XmlPullParser parser = TestUtils.getMessageParser(
"<message from='pubsub.myserver.com' to='francisco@denmark.lit' id='foo'>" +
"<event xmlns='http://jabber.org/protocol/pubsub#event'>" +
"<items node='testNode'>" +
"<item id='testid1' >" +
itemContent +
"</item>" +
"</items>" +
"</event>" +
"</message>");
Packet message = PacketParserUtils.parseMessage(parser);
PacketExtension eventExt = message.getExtension(PubSubNamespace.EVENT.getXmlns());
assertTrue(eventExt instanceof EventElement);
EventElement event = (EventElement) eventExt;
assertEquals(EventElementType.items, event.getEventType());
assertEquals(1, event.getExtensions().size());
assertTrue(event.getExtensions().get(0) instanceof ItemsExtension);
assertEquals(1, ((ItemsExtension)event.getExtensions().get(0)).items.size());
PacketExtension itemExt = ((ItemsExtension)event.getExtensions().get(0)).items.get(0);
assertTrue(itemExt instanceof PayloadItem<?>);
PayloadItem<?> item = (PayloadItem<?>)itemExt;
assertEquals("testid1", item.getId());
assertTrue(item.getPayload() instanceof SimplePayload);
assertXMLEqual(itemContent, ((SimplePayload)item.getPayload()).toXML());
}
} }