(三)Openfire插件开发
此部分是Openfire的第三大部分,本部分的开发必须基于前两部分
本文档基于消息拦截器插件功能进行开发。
新建插件messageFilter:
- 在openfire插件源码的plugins目录下新建文件夹messageFilter
- messageFilter文件夹下新建lib和src文件夹。lib包下放jar包,src文件夹下放要开发的插件源码。
- 将changelog.html、logo_large.gif、logo_small.gif、plugin.xml、pom.xml、readme.html在其他的插件中复制到demo目录下
- src文件夹下新建文件夹java并右键选择Mark Directory as-→Sources root
- java目录下新建directory com.weishuai
- com.weishuai下新建类MessageFilter并实现Plugin和PacketInterceptor接口
- 修改plugin.xml,主要是class标签的内容为插件类的权限定名。如下图:
此时我们的插件结构如下图所示
代码如下:
fromid为发信息的id,可以通过断点的而形式在packet的message标签中from属性获取,同理获得toid
public class DemoPlugin implements Plugin, PacketInterceptor {
//B: 消息拦截器
private InterceptorManager interceptorManager;
@Override
public void initializePlugin(PluginManager manager, File pluginDirectory) {
// 将当前插件加入到消息拦截管理器(interceptorManager )中,当消息到来或者发送出去的时候,会触发本插件的interceptPacket方法。
interceptorManager = InterceptorManager.getInstance();
interceptorManager.addInterceptor(this);
}
@Override
public void destroyPlugin() {
// 当插件被卸载的时候,主要通过openfire管理控制台卸载插件时,被调用。注意interceptorManager的addInterceptor和removeInterceptor需要成对调用。
interceptorManager.removeInterceptor(this);
}
@Override
public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) throws PacketRejectedException {
//入参incoming来判断是服务器发送的包还是接受的包(注:true为服务器接收的包;false为发出的包);
// processed为false,表示本条消息没有被openfire处理过。这说明这是一条处女消息,也就是没有被处理过的消息。
String strXML = packet.toXML();
Document doc = null;
try {
doc = DocumentHelper.parseText(strXML);
} catch (DocumentException e) {
e.printStackTrace();
}
//1.1读取根标签
Element rootElem = doc.getRootElement();
//1.2获取标签的名称
String rootName = rootElem.getName();
// Element conElem = rootElem.element("contact");
// 1.1 在标签上获取属性(根据属性的名称来获取属性值)
String fromid = rootElem.attributeValue("from");
String toid = rootElem.attributeValue("to");
if (incoming && !processed) {
if (packet instanceof Message) {
if (fromid.equals("[email protected]/Spark")) {
PacketRejectedException rejectedException = new PacketRejectedException();
// rejectedException.setRejectionMessage("the friend already in black.");
throw rejectedException;
}
}
}
}
}
打包插件
如图所示,右侧ant中双击plugins。等程序运行完毕,jar包就在openfire源码包下的openfire_src\target\openfire\plugins文件夹里。
此时启动openfire服务器,在插件中打上断点即可以进入断点。
通过spark发送消息,可以进入消息拦截器方法中。