Kristof tiene razón, los documentos son escasos, pero están mejorando. Sin embargo, hay un conjunto bueno, pero difícil de encontrar, de extensiones. El PubSub uno está en http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html.
Después de ir desde cero a la ruta del proveedor de IQ personalizado con una extensión, encontré que era más fácil hacerlo usando los gerentes tanto como sea posible. Los desarrolladores que escribieron los gerentes han abstraído muchos de los puntos de dolor.
Ejemplo (versión modificada para la geoloc de uno rcollier escribió en el foro Smack):
ConfigureForm form = new ConfigureForm(FormType.submit);
form.setPersistentItems(false);
form.setDeliverPayloads(true);
form.setAccessModel(AccessModel.open);
PubSubManager manager
= new PubSubManager(connection, "pubsub.communitivity.com");
Node myNode = manager.createNode("http://jabber.org/protocol/geoloc", form);
StringBuilder body = new StringBuilder(); //ws for readability
body.append("<geoloc xmlns='http://jabber.org/protocol/geoloc' xml:lang='en'>");
body.append(" <country>Italy</country>");
body.append(" <lat>45.44</lat>");
body.append(" <locality>Venice</locality>");
body.append(" <lon>12.33</lon>");
body.append(" <accuracy>20</accuracy>");
body.append("</geoloc>");
SimplePayload payload = new SimplePayload(
"geoloc",
"http://jabber.org/protocol/geoloc",
body.toString());
String itemId = "zz234";
Item<SimplePayload> item = new Item<SimplePayload>(itemId, payload);
// Required to recieve the events being published
myNode.addItemEventListener(myEventHandler);
// Publish item
myNode.publish(item);
O al menos esa es la forma más dura :). Acaba de recordar que hay una PEPManager ahora ...
PEPProvider pepProvider = new PEPProvider();
pepProvider.registerPEPParserExtension(
"http://jabber.org/protocol/tune", new TuneProvider());
ProviderManager.getInstance().addExtensionProvider(
"event",
"http://jabber.org/protocol/pubsub#event", pepProvider);
Tune tune = new Tune("jeff", "1", "CD", "My Title", "My Track");
pepManager.publish(tune);
Se necesitaría para escribir las clases GeoLocProvider y geoloc.
¿dónde puedo encontrar esta clase 'TuneProvider' y' Tune' en smack o asmack? – Hunt
El ejemplo es de la documentación de smack. No estoy seguro de qué implementación de XEP-0118 también se están refiriendo, ya que Smack aún tiene un error abierto para agregar compatibilidad con XEP-0118, última actualización en mayo de 2011. Había improvisado mi propia versión para un experimento, pero no tener el código más. Lo lanzaría de nuevo, pero no tengo tiempo. Ahora hay un buen ejemplo de cómo crear su propia extensión de PEPItem y publicar un elemento aquí: http://oneminutedistraction.wordpress.com/2010/08/26/. Eso simplemente deja la parte de análisis sintáctico (en TuneProvider, un proveedor de PEP). –
Estoy usando smack 4.2.0 y no puedo encontrar PEPProvider? – umerk44