Mapping Openfire Custom plugin with aSmack Client

2019-01-12 13:00发布

问题:

I'm a newbie to XMPP so forgive me if this question sounds silly. I want to create a custom plugin and map it with my aSmack client on Android. I'm trying to apply my knowledge of Web Services but I'm not winning. So please guide my thinking toward the best approach, an example will be really helpful. Thanx in advance.

回答1:

There are many types of plugins, let's talk in general pourpose. Igniterealtime Plugin guide

You want to define a brand new IQ Stanza to manage an UserCustomParam. Let's say:

<iq from="user1@myserver" to="myserver" type="get">
 <usercustomparam xmls:"com.records.iq" retrive="favouritecolor">
</iq>

What you have to:

step 1: define a plugin (class that implemements Plugin) that adds a new handler

MyCustomHandler colorshandler;
IQRouter iqRouter = XMPPServer.getInstance().getIQRouter();
iqRouter.addHandler(colorshandler);

Step2: implements MyCustomHandler as you need (read on database, write on database, read server side and so on).

public class MyCustomHandler extends IQHandler {
    public static final String NAMESPACE_TICKET_IQ = "com.records.iq";
    public static final String TAG_TICKET_IQ = "usercustomparam ";

Now your server it's ready to manage your custom IQ request.

Time to go client side:

Step3: register to your ProviderManager an IQProvider

ProviderManager.addIQProvider("usercustomparam ","com.records.iq", new IQUserCustomParamProvider());

Step4: implements your IQUserCustomParamProvider as you need

public class IQUserCustomParamProvider extends IQProvider<IQUserCustomParam>

into Provider you'll parse the incoming IQ from server and you'll create a IQUserCustomParam with an instance param like

String favouriteColor

Step5: you need to implement IQUserCustomParam

public class IQUserCustomParam extends IQ
    private final static String childElementName = "usercustomparam";
    private final static String childElementNamespace = "com.records.iq";

public IQUserCustomParam (String color)
    {
        this(childElementName , childElementNamespace );

        this.setType(IQ.Type.result);
        this.setFavouriteColor(color);
    }

Step 6: now set up it's completed, but you haven't defined yet when to accept IQUserCustomParam when it comes from server. So you need a StanzaFilter

public class IQUserCustomParamFilter implements StanzaFilter

Step 7: and you haven't defined yet what to do with IQUserCustomParam when it comes from server. So you need a StanzaListner

public class IQUserCustomParamListner implements StanzaListener

Step 8: finally you'll have to register the combo filter/listner on your connection:

AbstractXMPPConnection connection = ...;
connection.addAsyncStanzaListener(new PersonalConfigListner(this), new IQMUCConfigTicketFIlter();

if that helped, please don't forget to accept the answer!



回答2:

This is a sample of plugin implementation:

First, you should implement the Plugin interface:

public class MotDPlugin implements Plugin

Then, this requires implementation of the intitalizePlugin and destroyPlugin methods, as shown below:

public void initializePlugin(PluginManager manager, File pluginDirectory) {
   serverAddress = new JID(XMPPServer.getInstance().getServerInfo().getName());
   router = XMPPServer.getInstance().getMessageRouter();

   SessionEventDispatcher.addListener(listener);
}

public void destroyPlugin() {
   SessionEventDispatcher.removeListener(listener);

   listener = null;
   serverAddress = null;
   router = null;
}

The more about this sample, you may refer to the Openfire Plugin Development: Message of the Day.

Hope it helps.



回答3:

There is a simple instance about plugin:

public class TestIQHandle extends IQHandler {
    private static final String MODULE_NAME = "test plugin";
    private static final String NAME_SPACE = "com:test:testplug";
    private IQHandlerInfo info;
    public TestIQHandle(){
        super(MODULE_NAME);
        info = new IQHandlerInfo("query", NAME_SPACE);
    }
    public TestIQHandle(String moduleName) {
        super(moduleName);
        info = new IQHandlerInfo("query", NAME_SPACE);
    }
    @Override
    public IQ handleIQ(IQ packet) throws UnauthorizedException {
        IQ reply = IQ.createResultIQ(packet);
        Element groups = packet.getChildElement();
        if(true){
            System.out.println("=======invalid========");
        }
        if(!IQ.Type.get.equals(packet.getType())){
            reply.setChildElement(groups.createCopy());
            reply.setError(PacketError.Condition.bad_request);
            return reply;
        }
        //StringUtils.substringBefore(packet.getFrom().toString(), "@");
        return reply;
    }
    @Override
    public IQHandlerInfo getInfo() {
        // TODO Auto-generated method stub
        return info;
    }
}