In short, it was a uppercase-lowercase typo in a String, Robin helped me find it by asking for details in a comment, and the code above works. Thanks Robin!
Smack XMPP Custom Extensions not arriving fully
Question
I've got Smack running with OpenFire. Message Transfer works fine, but custom extensions never arrive fully.
This is what get's sent (by a not-smack library):
<message type="normal" id="42444f16-761f-471d-a37c-c9204cf14cfc" to="timmy@openfireserver.eu">
<operation xmlns="http://www.openfireserver.eu/ns/xmpp-rest" ack="false">PUT</operation>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="simple" content-disposition="riddl-data; name="value"">stopped</part>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="simple" content-disposition="riddl-data; name="tims"">world</part>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="complex" content-disposition="riddl-data; name="excellent"" content-transfer-encoding="binary" content-type="text/plain">party time</part>
</message>
This is what arrives:
<message id="42444f16-761f-471d-a37c-c9204cf14cfc" to="timmy@openfireserver.eu" from="jürgen@openfireserver.eu/f8c64ccb">
<operation xmlns="http://www.openfireserver.eu/ns/xmpp-rest"></operation>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest"></part>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest"></part>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest"></part>
</message>
I tried creating an OperationExtension and setting it before the connection is created like this:
OperationProvider o = new OperationProvider();
ProviderManager.getInstance().addExtensionProvider(o.getExtension().getElementName(),o.getExtension().getNamespace(), o);
The OperationProvider looks like this for testing, but my breakpoints never get hit :-(
public class OperationProvider implements PacketExtensionProvider {
private OperationExtension extension = new OperationExtension();
@Override
public PacketExtension parseExtension(XmlPullParser xmlparser) throws Exception {
OperationExtension o = new OperationExtension();
System.out.println("YAAAA + " + xmlparser.getText());
String text = xmlparser.nextText();
while (text != null)
{
System.out.println("YAAAA + " + text);
text = xmlparser.nextText();
}
return o;
}
public OperationExtension getExtension() {
return extension;
}
public void setExtension(OperationExtension extension) {
this.extension = extension;
}
}
The OperationExtension itself is pretty basic (set breakpoints here to hopefully have them hit sometimes, but doesn't work):
public class OperationExtension implements PacketExtension {
public static final String NAMESPACE = "http://www.openfireserver.eu/ns/xmpp-rest";
public String getElementName()
{
return "Operation"; // <-- here was my error, it should say (lower-case) "operation"
}
public String getNamespace()
{
return NAMESPACE;
}
@Override
public String toXML() {
return "<Operation>GET</Operation>"; // this is also just mockup with a breakpoint ;-)
}
}
, but the toXml() method also doesn't get called. As some of the few available docs suggest, I put a smack.properties file in a META-INF folder inside the /src path of the project, and I made it look like this:
<?xml version="1.0"?>
<extensionProvider>
<elementName>operation</elementName>
<namespace>http://www.openfireserver.eu/ns/xmpp-rest</namespace>
<className>adventure.messagerouting.XmppExtensions.OperationExtension</className>
</extensionProvider>
<extensionProvider>
<elementName>part</elementName>
<namespace>http://www.openfireserver.eu/ns/xmpp-rest</namespace>
<className>adventure.messagerouting.XmppExtensions.PartExtension</className>
</extensionProvider>
I can that my Provider is registered in ProviderManager.getInstance().getExtensionProviders();
but I cannot say why it's code is never called.
- Do I do something wrong here? Why do my attributes and tag contents not arrive in smack?
- Is it possible that OpenFire filters something out?
Solution 2
OTHER TIPS
I think you could also use PacketExtension to extend your custom message packet.
Message message = new Message();
DefaultPacketExtension yourExt = new DefaultPacketExtension("your_ext", "com:your:ext:namespace");
yourExt.setValue("<XML element name>", <XML element value>);
messgae.addExtension(yourExt);