Пользовательские расширения 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. Я делаю что-то не так здесь? Почему мои атрибуты и содержимое тегов не приходят в надлежащем виде?
  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

Короче говоря, это была опечатка в строке верхнего и нижнего регистра, Робин помог мне найти ее, запросив подробности в комментарии, и приведенный выше код работает. Спасибо Робин!

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