Персонализираните разширения на Smack XMPP не пристигат напълно

Имам Smack, работещ с OpenFire. Прехвърлянето на съобщения работи добре, но персонализираните разширения никога не пристигат напълно.

Това е, което се изпраща (от библиотека без удар):

<message type="normal" id="42444f16-761f-471d-a37c-c9204cf14cfc" to="[email protected]">
  <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=&quot;value&quot;">stopped</part>
  <part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="simple" content-disposition="riddl-data; name=&quot;tims&quot;">world</part>
  <part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="complex" content-disposition="riddl-data; name=&quot;excellent&quot;" content-transfer-encoding="binary" content-type="text/plain">party time</part>
</message>

Ето какво пристига:

<message id="42444f16-761f-471d-a37c-c9204cf14cfc" to="[email protected]" from="jü[email protected]/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>

Опитах се да създам OperationExtension и да го настроя, преди връзката да бъде създадена по този начин:

OperationProvider o = new OperationProvider();
ProviderManager.getInstance().addExtensionProvider(o.getExtension().getElementName(),o.getExtension().getNamespace(), o);

OperationProvider изглежда така за тестване, но моите точки на прекъсване никога не се достигат :-(

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;
    }

}

Самото разширение OperationExtension е доста елементарно (задайте точки на прекъсване тук, за да се надяваме, че понякога ще ги удряте, но не работи):

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 ;-)
    }

}

, но методът toXml() също не се извиква. Както предполагат някои от малкото налични документи, поставих файл smack.properties в папка META-INF в /src пътя на проекта и го направих да изглежда така:

<?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>

Знам, че моят доставчик е регистриран в ProviderManager.getInstance().getExtensionProviders();, но не мога да кажа защо неговият код никога не се извиква.

  1. Правя ли нещо грешно тук? Защо моите атрибути и съдържание на тагове не пристигат в smack?
  2. Възможно ли е OpenFire да филтрира нещо?

person Akku    schedule 01.08.2013    source източник
comment
Нямате нужда от файла със свойства, тъй като извиквате директно addExtensionProvider(). Вашата конфигурация изглежда правилна, но всъщност не знаем на какво са зададени името на елемента и пространството от имена. Подозирам, че грешат, тъй като това картографира доставчика по време на анализиране.   -  person Robin    schedule 01.08.2013
comment
Добре, Робин, беше прав в коментара си. Докато публикувах класа OperationExtension във въпроса, за да ви покажа, че разбрах всичко правилно, видях, че името на етикета, което класът връща, е с главни букви, а не с малки букви. Промених това и всичко работи. Ако поставите това като отговор, ще го приема на секундата. Благодаря!   -  person Akku    schedule 02.08.2013


Отговори (2)


Мисля, че можете също да използвате PacketExtension, за да разширите персонализирания си пакет от съобщения.

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);
person Browny Lin    schedule 10.10.2013
comment
Не, разширението на пакета по подразбиране липсваше нещо важно, от което се нуждаех, мисля, че бяха атрибути. - person Akku; 10.10.2013

Накратко, това беше печатна грешка между главни и малки букви в String, Робин ми помогна да го намеря, като поиска подробности в коментар, и кодът по-горе работи. Благодаря Робин!

person Akku    schedule 23.08.2013
comment
... така че това, което направих по-горе в моя въпрос, работеше напълно, посочих проблема с малките букви в коментар в източника на OperationExtension. - person Akku; 10.10.2013