【0】README
1)本文旨在 简述如何 基于openfire源码开发插件, 如何导入 openfire源码到 eclipse,参见 http://blog.youkuaiyun.com/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();
}
@Override
public 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=========================");
}
@Override
public void destroyPlugin() {
interceptorManager.removeInterceptor(this);
System.out.println("PluginDemo Plugin has been destroyed.");
}
@Override
public 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{
@Override
protected 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();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// super.doPost(request, response); // should be commented out
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
System.out.println("请求 PluginDemoServlet POST Method");
out.print("请求 PluginDemoServlet POST Method");
out.flush();
}
@Override
public 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】查看访问效果