Or maybe I’m just missing something.
If I itereate over the extensions on a packet, a subsequent call to packet.getExtension() fails to find the extension. If I reverse the order of the calls, both work. In the snippet below (I’ve already registered the extension, etc.)
public void processPacket(Packet packet) {
if (packet instanceof Message) {
// some syntactic sugar because parenthesis are endangered and casting wastes them
Message m = (Message)packet;
boolean contentHandled = false;
/* straight get */
PacketExtension pe2 = m.getExtension(“content”, XMLConstants.AV_CORTEXT_NAMESPACE);
if(pe2 != null){
log.debug("found a cortext message with content element in namespace: " + pe2.getNamespace());
// connection.sendPacket(cmf.handleContent(m, botDirectory));
}
/* itereate to find it and use it */
Iterator i = m.getExtensions().iterator();
while(i.hasNext()){
PacketExtension pe = i.next();
log.debug("extension: " + pe.getClass().getCanonicalName() + " " + pe.getElementName() + " " + pe.getNamespace());
if(pe.getElementName().equals(“content”)){
log.debug("found content element: ");
log.debug("it is a: " + ((ContentExtension)pe).getMimeType());
// connection.sendPacket(cmf.handleContent(m, botDirectory));
contentHandled = true; // set flag so that we don’t handle it again
break;
}
}
… other code elided …
}
In that approach I get the output and results I expect.
[DEBUG 19 Dec 2012 10:06:26] - [processPacket ] …
[DEBUG 19 Dec 2012 10:06:26] - found a cortext message with content element in namespace: http://imprivata.com/protocol/cortext
[DEBUG 19 Dec 2012 10:06:26] - extension: org.jivesoftware.smack.packet.DefaultPacketExtension domain http://imprivata.com/protocol/cortext
[DEBUG 19 Dec 2012 10:06:26] - extension: org.jivesoftware.smack.packet.DefaultPacketExtension request urn:xmpp:receipts
[DEBUG 19 Dec 2012 10:06:26] - extension: com.imprivata.mpgqa.test.xmpp.bot.smack.extensions.ContentExtension content http://imprivata.com/protocol/cortext
[DEBUG 19 Dec 2012 10:06:26] - found content element:
[DEBUG 19 Dec 2012 10:06:26] - it is a: application/x-cortext-callback
If I swap things around and iterate first, then use packet.getExtension() the PacketExtension (pe2) comes back as null so my output looks like:
[DEBUG 19 Dec 2012 10:21:33] - [processPacket ] …
[DEBUG 19 Dec 2012 10:21:33] - extension: org.jivesoftware.smack.packet.DefaultPacketExtension domain http://imprivata.com/protocol/cortext
[DEBUG 19 Dec 2012 10:21:33] - extension: org.jivesoftware.smack.packet.DefaultPacketExtension request urn:xmpp:receipts
[DEBUG 19 Dec 2012 10:21:33] - extension: com.imprivata.mpgqa.test.xmpp.bot.smack.extensions.ContentExtension content http://imprivata.com/protocol/cortext
[DEBUG 19 Dec 2012 10:21:33] - found content element:
[DEBUG 19 Dec 2012 10:21:33] - it is a: application/x-cortext-callback
The “found a cortext message” output that is gated by the null check is never fired.
-Rich