【0】README
1)本文旨在 简述如何 基于openfire源码开发插件, 如何导入 openfire源码到 eclipse,参见 http://blog.csdn.net/pacosonswjtu/article/details/51871622
2)also , you can checkout source code of the plugin from https://github.com/pacosonTang/MultimediaMessagingPlatform/tree/master/plugin_cluster/plugindemo/src
step1)建立插件目录树(插件名称==plugindemo)
补充1)各个目录树的目录项的意义:
补充2)目录树的缩略图如下
step2)添加 java 根目录到 source folder
step3)开发openfire插件,实现 Plugin接口
package com.myplugin;import java.io.File;import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.interceptor.InterceptorManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.xmpp.packet.Packet;// 如果需要拦截消息,就必须实现 PacketInterceptor
public class PluginDemo implements PacketInterceptor, Plugin{private static PluginManager pluginManager;private InterceptorManager interceptorManager;public PluginDemo() {interceptorManager = InterceptorManager.getInstance();}@Overridepublic void interceptPacket(Packet packet, Session session,boolean incoming, boolean processed) throws PacketRejectedException {System.out.println("拦截消息以进行逻辑处理" + "from =" + packet.getFrom() + ", to = " + packet.getTo() + ", incoming = " + incoming + ", proccessed = " + processed);System.out.println("\n=========================");}@Overridepublic void destroyPlugin() {interceptorManager.removeInterceptor(this);System.out.println("PluginDemo Plugin has been destroyed.");}@Overridepublic void initializePlugin(PluginManager manager, File pluginDirectory) {interceptorManager.addInterceptor(this);pluginManager = manager; System.out.println("PluginDemo Plugin has been installed successfully.");}
}
step4)可选的,如果你觉得有必要的话,还可以在插件中嵌入 servlet;
package com.myplugin.manager;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class PluginDemoServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/plain");PrintWriter out = response.getWriter();System.out.println("console info: 请求SampleServlet GET Method");out.println("GET Method: these info are transmitted into client.");out.flush();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// super.doPost(request, response); // should be commented outresponse.setContentType("text/plain");PrintWriter out = response.getWriter();System.out.println("请求 PluginDemoServlet POST Method");out.print("请求 PluginDemoServlet POST Method");out.flush();}@Overridepublic void init() throws ServletException {System.out.println("servlet init successfully.");}
}
step4)补充: 添加servlet映射
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app><servlet> <servlet-name>SampleServlet</servlet-name> <servlet-class>com.myplugin.manager.PluginDemoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SampleServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping>
</web-app>
step5)可选的,你也可以开发一些jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>plugin demo page.</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta name="pageID" content="sample-service"/> <!-- 这个是必须的,同 plugin.xml 中引用的标识符必须一样. --></head><body><h3>hello world. <a href="<c:url value="/plugins/plugindemo/myservlet"/>">plugin demo servlet</a></h3><div class="jive-contentBoxHeader">jive-contentBoxHeader</div><div class="jive-contentBox">jive-contentBox</div><div class="jive-table"><table cellpadding="0" cellspacing="0" border="0" width="100%"><thead><tr><th>name</th><th>age</th><th>stuid</th></tr></thead><tbody><tr class="jive-odd"><td align="center">zhangsan</td><td align="center">35</td><td align="center">2014210541</td></tr><tr class="jive-even"><td align="center">lisi</td><td align="center">67</td><td align="center">2014110321</td></tr><tr class="jive-odd"><td align="center">wangwu</td><td align="center">12</td><td align="center">2015117891</td></tr></tbody></table></div></body>
</html>
step5)补充:在jsp中 请求 该 servlet
<h3>hello world. <a href="<c:url value="/plugins/plugindemo/myservlet"/>">plugin demo servlet</a></h3>
step6)编写插件配置文件 plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin><!-- Main plugin class 这里是最重要滴,就是你的插件的全路径--><class>com.myplugin.PluginDemo</class><!-- Plugin meta-data --><name>plugindemo</name><description>This is the my plugindemo.</description><author>pacoson</author><version>1.0</version><date>29/07/2016</date> <minServerVersion>4.0.2</minServerVersion><licenseType>gpl</licenseType><adminconsole><tab id="tab-server"><sidebar id="sidebar-server-settings"><item id="plugindemo-service" name="my plugin demo" url="plugindemo-service.jsp"description="plugindemo-service plugin." /></sidebar></tab> </adminconsole>
</plugin>
【2】编译插件并打包为jar copy到 openfire 插件目录下
1)编译打包后的效果
2)通过ant 编译插件的步骤(其实很简单,因为 openfire 自带 编译模板,如果要自己写的话,那就有点复杂了)
step1)根目录\build.properties, 填写 插件名称 到 合适位置
step2)右键build.xml -> run as -> ant build(有两个ant build,选择第2个),运行 ant 脚本 编译即可,编译后的结果 在 本章节已经说明了;
【3】查看访问效果