Mapping Openfire Custom plugin with aSmack Client

烈酒焚心 提交于 2019-11-27 16:29:00

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!

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.

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;
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!