2013-08-01 1 views
2

У меня есть Smack, работающий с OpenFire. Передача сообщений работает нормально, но пользовательские расширения никогда не поступают полностью.Smack XMPP Custom Extensions не подходит полностью

Это то, что получает прислало (по не-привкусу библиотеки):

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

ОперацияProvider выглядит так для тестирования, но мои точки останова никогда не получить удар :-(

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 что-то фильтрует?
+2

Вам не нужен файл свойств, поскольку вы вызываете addExtensionProvider() напрямую. Ваша конфигурация выглядит правильно, но мы действительно не знаем, к чему привязаны имя элемента и пространство имен. Я бы заподозрил, что они ошибаются, так как это отображает поставщика во время разбора. – Robin

+0

Хорошо, Робин, ты был прав в своих комментариях. Во время публикации класса OperationExtension в вопросе, чтобы показать вам, я все понял правильно, я увидел, что имя тега, которое возвращает класс, имеет прописную и строчную буквы. Изменено это, и все работает. Если вы положите это как ответ, я буду принимать его в одно мгновение. Благодаря! – Akku

ответ

1

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

+0

... поэтому то, что я делал выше в моем вопросе, было полностью работоспособным, я указал на строчную проблему с строкой в ​​комментарии в источнике OperationExtension. – Akku

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); 
+1

Нет, расширение пакета по умолчанию отсутствовало что-то важное, что мне нужно, я думаю, что это атрибуты. – Akku