【插件开发三】开发继承IQHandler的插件

53 篇文章 0 订阅
49 篇文章 0 订阅

OF的插件开发有三种方式,关于如何开发OF的插件,请参考别的文章,本文就不具体描述了。下面讲述如何Register a plugin as anIQHandler

我们如果要做自己的IQ包处理,可以自定义类如TestTemplateMethodHandler:class TestTemplateMethodHandler extends IQHandler。

以下需要注意:

1.IQ handlers相应包中特定的元素名或命名空间,在public IQHandlerInfo getInfo()方法中写上自己想要注册的元素名及命名空间

2.在public IQ handlerIQ(IQ packet)方法中写上自己想要对丢进来的IQ包做什么样的处理(注意IQ包是基于问答形式的,所以应该有IQ包的reply)。

3.继承IQHandler的插件,需要注册到IQRouter中去。

以下是注册一个继承IQHandler的插件到IQRouter中的代码:

IQHandler myHandler = new MyIQHander();
IQRouter iqRouter = XMPPServer.getInstance().getIQRouter();
iqRouter.addHandler(myHandler);

 

接下来就是展示具体的实现继承IQHandler的插件两种方式:(区别主要是在把IQHandler的继承类和插件是否绑定在一起)

1.注册继承IQHandler的插件到IQrouter可以在这个插件初始化的时候:

package com.bis.plugins.iqhandler;

import java.io.File;

import org.jivesoftware.openfire.IQHandlerInfo;
import org.jivesoftware.openfire.IQRouter;
import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.auth.UnauthorizedException;
import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.handler.IQHandler;
import org.xmpp.packet.IQ;

public class MyIQHandler extends IQHandler implements Plugin{

	private IQHandlerInfo info;

	public MyIQHandler() {
		super("MyIQHandler");
		info = new IQHandlerInfo("query", "jabber:iq:roster");
	}

	@Override
	public IQHandlerInfo getInfo() {
		// TODO Auto-generated method stub
		return info;
	}

	@Override
	public IQ handleIQ(IQ packet) throws UnauthorizedException {
		// TODO Auto-generated method stub
		IQ reply = IQ.createResultIQ(packet);
		System.out.println("【iq from】:" + reply.getFrom());
		System.out.println("【iq to】:" + reply.getTo());
		return reply;
	}

	@Override
	public void initializePlugin(PluginManager manager, File pluginDirectory) {
		IQRouter iqRouter = XMPPServer.getInstance().getIQRouter(); 
		iqRouter.addHandler(this); 
		System.out.println("==init myIQHandler==");
		
	}

	@Override
	public void destroyPlugin() {
		// TODO Auto-generated method stub
		
	}
}


或者,单独写一个IQHandler的实现类,再单独写一个插件专门用于把所有扩展的IQHandler继承类注册到IQRouter中:

IQHandler的继承类:

public class GroupTreeIQHander extends IQHandler
{

    private static final String MODULE_NAME = "group tree handler";

    private static final String NAME_SPACE = "com:im:group";

    private IQHandlerInfo info;

    public GroupTreeIQHander()
    {
        super(MODULE_NAME);
        info = new IQHandlerInfo("gruops", NAME_SPACE);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.jivesoftware.openfire.handler.IQHandler#getInfo()
     */
    @Override
    public IQHandlerInfo getInfo()
    {
        return info;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.jivesoftware.openfire.handler.IQHandler#handleIQ(org.xmpp.packet.IQ)
     */
    @Override
    public IQ handleIQ(IQ packet) throws UnauthorizedException
    {
        IQ reply = IQ.createResultIQ(packet);
        Element groups = packet.getChildElement();//1
        
        if (!IQ.Type.get.equals(packet.getType()))
        {
            System.out.println("非法的请求类型");
            reply.setChildElement(groups.createCopy());
            reply.setError(PacketError.Condition.bad_request);
            return reply;
        }
        
        String userName = StringUtils.substringBefore(packet.getFrom().toString(),"@");

        GroupManager.getInstance().initElement(groups,userName);
        
        reply.setChildElement(groups.createCopy());//2

        System.out.println("返回的最终XML" + reply.toXML());

        return reply;
    }

}


再写一个插件,用于把扩展的IQHandler继承类注册到IQRouter中:

/**
 * 服务器端插件类
 * 
 * @author Phoenix
 * 
 * Mar 14, 2008 11:03:11 AM
 * 
 * version 0.1
 */
public class GroupTreePlugin implements Plugin
{
    private XMPPServer server;

    /*
     * (non-Javadoc)
     * 
     * @see org.jivesoftware.openfire.container.Plugin#destroyPlugin()
     */
    public void destroyPlugin()
    {

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.jivesoftware.openfire.container.Plugin#initializePlugin(org.jivesoftware.openfire.container.PluginManager,
     *      java.io.File)
     */
    public void initializePlugin(PluginManager manager, File pluginDirectory)
    {
        PluginLog.trace("注册群组树IQ处理器");
        server = XMPPServer.getInstance();
        
        server.getIQRouter().addHandler(new GroupTreeIQHander()); //1
        server.getIQRouter().addHandler(new UserInfoIQHandler());
        server.getIQRouter().addHandler(new DelUserIQHandler());
        server.getIQRouter().addHandler(new CreateUserIQHandler());
        server.getIQRouter().addHandler(new AddGroupUserIQHandler());
        server.getIQRouter().addHandler(new SetRoleIQHandler());

    }

}


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值