DreamSea

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Pubsub Extensions for Smack

http://community.igniterealtime.org/message/191463#191463

http://community.igniterealtime.org/message/196048#196048

http://www.digipedia.pl/usenet/thread/10917/2269/

https://github.com/squaremo/smackx-pubsub/tree/master/src/test/java/org/jivesoftware/smackx/pubsub/test

http://www.apache.org/dyn/closer.cgi/mina/vysper/0.7/vysper-0.7-src.zip

 

 

Pubsub - hello world example

 

Re: Pubsub - hello world example

This is a simple example using the pubsub extensions I wrote here

Create and publish

 

        ConfigureForm form = new ConfigureForm(FormType.submit);
        form.setPersistentItems(false);
        form.setDeliverPayloads(true);
        form.setAccessModel(AccessModel.open);

 

        PubSubManager manager = new PubSubManager(connection, "pubsub.my.openfire.server");

        Node myNode = manager.createNode("TestNode", form);

 

        SimplePayload payload = new SimplePayload("book","pubsub:test:book", "<book xmlns='pubsub:test:book'><title>Lord of the Rings</title></book>");

        Item<SimplePayload> item = new Item<SimplePayload>(itemId, payload);

 

        // Required to recieve the events being published

        myNode.addItemEventListener(myEventHandler);

 

        // Publish item

        myNode.publish(item);

 

 

 

Get node and listen (different user)

 

        Node eventNode = manager.getNode("TestNode");

        eventNode.addItemEventListener(myEventHandler);

        eventNode.subscribe("myJID");

 

 

I have included the work I have done for adding pubsub support to Smack.  The three jars contain the binaries, source and javadoc.  I will try to create some user documentation as soon as I get the chance.  It was suggested to upload it as an eclipse patch, but this is entirely new code with no alterations to the existing Smack library, so I just uploaded the source code as is.

 

This code has been tested against a customized version of OpenFire in which I fixed a couple of existing bugs, I will be uploading those as real patches as soon as possible.  It was designed around version 1.12 of the spec, and the current OpenFire implementation supports 1.8 (I believe).  Some of the basic functionality should still work with that spec, I will try to document the issues when I get the chance.

 

For anyone that wants to give it a try, start at the PubSubManager class, it should be pretty simple from there (famous last words).

 

I have created a new thread instead of posting to the existing one (http://www.igniterealtime.org/community/message/191247#191247) since I wasn't sure if the patch tag would get picked up by the powers that be.

 

Updated to version 0.6 - Fixed some bugs - Node from previous version is now LeafNode.  Node is a base class for LeafNode and CollectionNode.  Please note though, CollectionNode exists as a placeholder for future usage, it has not been tested!  That being said, some of the basic functionality from the base class (Node) should still work since it is not specific to either node type. - There is now an Item and PayloadItem vs. the Item<PacketExtension> type that previously existed. - Source code jar has been removed and will now only reside in the <a href="http://www.igniterealtime.org/issues/browse/ SMACK-272" target="_blank">JIRA task</a>. Javadoc still needs to be updated to reflect these changes.

附件:

 

Re: Pubsub Extensions for Smack

Awesome.

rcollier, I hope you don't mind, I've mavenised this and started making the tests work with ejabberd too.  It's up at github: http://github.com/squaremo/smackx-pubsub/tree/master

At the minute I am pointing to your profile here as the original author.  Let me know if I can do better.

cheers

mikeb

Re: Pubsub Extensions for Smack

OK, I probably don't have permissions for updating the source, so I will include the file here.

 

I replaces the existing one in org.jivesoftware.smackx.pubsub

附件:

Re: Pubsub Extensions for Smack

The new LeafNode/CollectionNode and Item/PayloadItem organization is much better than 0.4. Thanks for your job!

 

BTW, the PubSubManager.getNodes() was missing in 0.6. Is there any alternative?

Re: Pubsub Extensions for Smack

Thanks for the feedback and I am glad you like the changes.

 

I removed it since it didn't actually do as was advertised (get all nodes).  It was only returning all nodes under root, the same as discoverNodes(), and then creating ready to use Node objects.  Since the node creation could also be an issue fi there were a significant number of nodes, I removed it.  You can use discoverNodes() to get the same list of node id's and then call getNode(id) to retrieve the actual Node object, so no actual functionality is missing.

 

I am hoping to get a chance to work on the CollectionNode in the near future so that will have the ability to get the child nodes and drill down a hierarchy.

Re: Pubsub Extensions for Smack

we use the library of rcollier I added this connection and I installed Openfire on my machine but there is always a connection problem, where is the problem?
can you help me!!

 

 

public class Test
{

 

 

 

    public static void main(String[] args) {

 


           //PubSubManager test = new PubSubManager(connection, "");

 

           XMPPConnection connection = new XMPPConnection("127.0.0");

 

           PubSubManager test = new PubSubManager("127.0.0");
            test.connection("127.0.0");
           test.createNode("firstnode");

 

            //System.out.println(test.createNode);

 

            System.out.println(test.getNodes());

 

 

 


    }
}

Re: Pubsub Extensions for Smack  by rcollier

You still need smack.jar and smackx.jar on your classpath (before smacx-pubsub.jar).  You have classpath issues, plus the output is not even from the Test class specified, but from another one called Toto?!?  There is also no connection method on PubSubManager.  Please look at the Hello World example as that is working code.  The only thing missing is the connect and login to your server.  Look at the last posting which explains how to setup the PubSubManager.

 

Re: Pubsub Extensions for Smack

I took the code hellow word and I add the connection

 

public class Toto1

{

 

public static void main(String[] args) {

 

          XMPPConnection connection = new XMPPConnection("127.0.0.1", 5222);

        //XMPPConnection connection = new XMPPConnection("localhost",5222);

 

        //connection.login("admin", "admin");

 

        ConfigureForm form = new ConfigureForm(FormType.submit);

        form.setPersistentItems(false);

        form.setDeliverPayloads(true);

        form.setAccessModel(AccessModel.open);

 

        PubSubManager manager = new PubSubManager(connection);

        myNode = manager.createNode("TestNode", form);

 

        //public SimplePayload(String elementName, String namespace, String xmlPayload)

        SimplePayload payload = new SimplePayload("book","pubsub:test:book", "<book xmlns='pubsub:test:book'><title>Lord of the Rings</title></book>");

 

        Item<SimplePayload> item = new Item<SimplePayload>(itemId, payload);

 

        // Required to recieve the events being published

 

        myNode.addItemEventListener(myEventHandler);

 

        // Publish item

 

        myNode.publish(item);

 

       eventNode = manager.getNode("TestNode");

 

        eventNode.addItemEventListener(myEventHandler);

 

        eventNode.subscribe("myJID");

 

           connection.close();

 

        }

 

        }

 

 

in fiel "PubSubManager"

 

final public class PubSubManager
{

 

    /** Server name */
         public static final String SERVER_NAME = "localhost";
         /** Server port */
     public static final int SERVER_PORT = 5222;

 


     /** user - for login */
         private final String user;
         /** Client password - for login*/
         private final String password;

 

 

 


     private XMPPConnection con;

 

        private String to;

 

    private ConcurrentHashMap<String, Node> nodeMap = new ConcurrentHashMap<String, Node>();

 

 

 

    // Create a connection to the igniterealtime.org XMPP server.
      XMPPConnection connection = new XMPPConnection("localhost",5222);
      // Connect to the server
     connection.connect();
      // Most servers require you to login before performing other tasks.
      connection.login("user", "password");

 

 

 

    /**
      * Create a pubsub manager associated to the specified connection.
      *
      * @param connection The XMPP connection
      */
     public PubSubManager(XMPPConnection connection)
     {
         con = connection;
     }

|

|

|

|

|


     // Disconnect from the server
connection.disconnect();

 

}

 

error ???????????

 

C:\Documents and Settings\Bureau\noeudspubsub\org\jivesoftware\smackx\pubsub\Toto1.java:10: cannot find symbol
         symbol  : class XMPPConnection
         location: class Toto1
                   XMPPConnection connection = new XMPPConnection("127.0.0.1", 5222);
                   ^
         C:\Documents and Settings\Bureau\noeudspubsub\org\jivesoftware\smackx\pubsub\Toto1.java:10: cannot find symbol
         symbol  : class XMPPConnection
         location: class Toto1
                   XMPPConnection connection = new XMPPConnection("127.0.0.1", 5222);
                                                   ^
         C:\Documents and Settings\Bureau\noeudspubsub\org\jivesoftware\smackx\pubsub\Toto1.java:16: cannot access ConfigureForm
         bad class file: .\ConfigureForm.class
         class file contains wrong class: org.jivesoftware.smackx.pubsub.ConfigureForm
         Please remove or make sure it appears in the correct subdirectory of the classpath.
                 ConfigureForm form = new ConfigureForm(FormType.submit);
                 ^
         3 errors
         Processus terminé avec code quitter 1

 

where is the probleme ??

Re: Pubsub Extensions for Smack

1.can someone post workabout example of helloworld with "xmppconnection" ?

2.is there any configuration need to add/edit at openfire server?

3. is openfire port 5222 open by default for the connection?

Re: Pubsub Extensions for Smack

The subscriber will only receive content from the moment he is subscripting to a node and all old content published by publisher will not be received by subscriber.  Is this correct?  May i know, what do i need to do in order for subscriber to receive all previous old content ?

Re: Pubsub Extensions for Smack

Old content can only be retrieved if the node is persistent.  If it is configured this way, then calling LeafNode.getItems() will retrieve all persisted items.

Re: Pubsub Extensions for Smack

The pubsub extensions for Smack have now been committed to the codebase (in trunk) and can be obtained if you retrieve it from svn.  From what I can tell, the nightly builds are no longer done or published, which is too bad as this would be a much easier way to obtain and use it.

Re: Pubsub Extensions for Smack

Hi there,

 

thanks to your great contribution I was able to integrate XEP-0118 (Tune) into my application. Publishing my current track works as expected and could be confirmed with Psi at the other end. However now I'm quite confused on how to react on PubSub Events on my side. E.g. what do I have to do to process for ex. Tune Events from other users?

 

Could anybody be so kind and point me into the right direction or even post a small example?

 

Thanks in Advance,

 

Maui

Re: Pubsub Extensions for Smack  by  rcollier

You have several options.

 

No customization:

You can deal with the XML via the SimplePayload class which will already be returned in the PayloadItem.  This requires no extra work, but is not overly friendly to deal with.  In all likelihood, you will want to have a custom class to represent a Tune element.

 

Create custom TunePayload:

The best thing to do is

1) create a TunePayloadProvider that implements PacketExtensionProvider that will parse the Tune element of the item and return a TunePayload which extends PacketExtension

2) register this provider in the smack.providers file by its namespace "http://jabber.org/protocol/tune"

3) Now a call to PayloadItem.getItem() will return a TunePayload.

 

This also has the added benefit of being able to create TunePayload objects to publish as well.

 

 

Sorry but I don't have more time to elaborate with examples, but this is the basics of what you should do.

 

Good luck.

Robin

 

 

Re: Pubsub Extensions for Smack  by treffer

Here is our samplecode:

@SuppressWarnings("unchecked")

    @Override

    public void processPacket(Packet packet) {

        try {

        if (packet instanceof Message) {

            Message message = (Message) packet;

            for (PacketExtension packetExtension : message.getExtensions()) {

                if (!(packetExtension instanceof EventElement)) {

                    continue;

                }

                EventElement event = (EventElement) packetExtension;

                for (PacketExtension eventExtension : event.getExtensions()) {

                    if (!(eventExtension instanceof ItemsExtension)) {

                        continue;

                    }

                    ItemsExtension items = (ItemsExtension) eventExtension;

                    String node = items.getNode();

                    for (PacketExtension itemsExtension : items.getExtensions()) {

                        if (!(itemsExtension instanceof PayloadItem)) {

                            continue;

                        }

                        PayloadItem payload = (PayloadItem) itemsExtension;

                        if (payload.getPayload() instanceof BCAtom) {

 

 

 

 

Works so far. Just replace BCAtom with your payload.

 

Re: Pubsub Extensions for Smack  by rcollier

If you register a listener for the node, then you don't need any of the code you are using since the method, handlePublishedItems(ItemPublishEvent<T> items) will be called on your listener.  The ItemPublishEvent contains the list of items already.

 

Your code sample shows how to filter incoming packets manually to get the item events, but this is not really necessary.

 

posted on 2011-07-30 16:09  DreamSea  阅读(1560)  评论(0编辑  收藏  举报