У меня есть 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="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>
Это то, что приходит:
<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();
, но я не могу сказать, почему его код никогда не вызывается.
- Я что-то не так здесь делаю? Почему мои атрибуты и содержимое тегов не попадают в smack?
- Возможно ли, что OpenFire что-то фильтрует?
Вам не нужен файл свойств, поскольку вы вызываете addExtensionProvider() напрямую. Ваша конфигурация выглядит правильно, но мы действительно не знаем, к чему привязаны имя элемента и пространство имен. Я бы заподозрил, что они ошибаются, так как это отображает поставщика во время разбора. – Robin
Хорошо, Робин, ты был прав в своих комментариях. Во время публикации класса OperationExtension в вопросе, чтобы показать вам, я все понял правильно, я увидел, что имя тега, которое возвращает класс, имеет прописную и строчную буквы. Изменено это, и все работает. Если вы положите это как ответ, я буду принимать его в одно мгновение. Благодаря! – Akku