插件分类
-
消息等内部插件
这类插件主要用于对 openfire 内消息,状态等扩展
-
webUI 插件
这类插件主要用于对 openfire 控制台扩展
-
web接口插件
这类插件主要用于对 openfire 后台接口扩展
插件开发基本流程
实现 Plugin 类
添加 plugin.xml 配置插件启动类
添加 changelog.html, logo_*.png/gif, readme.html 等说明文件及logo
基本的目录结构如下图:
通常 plugin.xml 是导入 PluginManager 中的默认配置文件,其配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<class>com.demo.hello.HelloPlugin</class>
<name>hello</name>
<description>First Openfire Custom Plugin.</description>
<author>ilufei</author>
<version>1.0.0</version>
<date>11/07/2018</date>
<minServerVersion>4.0.2</minServerVersion>
<!-- 控制台上追加界面 -->
<adminconsole>
<!-- tab位置 -->
<tab id="tab-server">
<!-- sidebar位置 -->
<sidebar id="sidebar-server-manager">
<!-- item位置,使用 name 进行 i18n 语言配置,url连接地址配置 -->
<item id="hello-setting" name="${hello.title}"
url="hello.jsp"
description="Quickly change the HELLO configurations." />
</sidebar>
</tab>
</adminconsole>
</plugin>
对于 pom.xml 则是在 build 过程中自动打包使用的。
注意: [WEB-INF] 目录下 web-custom.xml 则是对 servlet 等动态注册的配置页面,类似 Tomcat 中的 web.xml 配置,详细参见 Web 接口开发
消息等内部插件
主要在插件主入口处拿到 XMPPServer 对象,并插入相关的回调函数,进行相应的处理即可:
public class HelloPlugin implements Plugin {
private static final Logger Log = LoggerFactory.getLogger(HelloPlugin.class);
private XMPPServer mXMPPServer;
/**
* Instantiates a new Hello service plugin.
*/
public HelloPlugin() {
}
/*
* (non-Javadoc)
*
* @see
* org.jivesoftware.openfire.container.Plugin#initializePlugin(org.jivesoftware
* .openfire.container.PluginManager, java.io.File)
*/
public void initializePlugin(PluginManager manager, File pluginDirectory) {
// 获取 XMPPServer 服务
mXMPPServer = XMPPServer.getInstance();
Log.debug(mXMPPServer.getServerInfo().toString());
// 添加 IQHandler --> mHandler
mXMPPServer.getIQRouter().addHandler(mHandler);
// 添加离线消息监听
mXMPPServer.getOfflineMessageStrategy().addListener(this);
// TODO 更多
}
/*
* (non-Javadoc)
*
* @see org.jivesoftware.openfire.container.Plugin#destroyPlugin()
*/
public void destroyPlugin() {
// 删除 IQHandler --> mHandler
mXMPPServer.getIQRouter().removeHandler(mHandler);
// 删除离线消息监听
mXMPPServer.getOfflineMessageStrategy().removeListener(this);
}
}
调试过程中,为方便查看日志,将 build/lib/dist/log4j.xml 配置文件中添加如下内容即可:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="all-console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy.MM.dd HH:mm:ss} %-5p [%t]: %c - %m%n" />
</layout>
</appender>
...
<logger name="com.demo.hello">
<level value="debug" />
<appender-ref ref="console"/>
</logger>
<root>
<level value="debug" />
<appender-ref ref="all-out" />
<appender-ref ref="debug-out" />
<appender-ref ref="info-out" />
<appender-ref ref="warn-out" />
<appender-ref ref="error-out" />
<appender-ref ref="all-console" />
</root>
</log4j:configuration>
webUI 开发
如果所有UI都是界面,则可以通过 jsp 进行,具体进行如下几步即可:
- 配置入口
在 plugin.xml 中的 <adminconsole> 标签中添加相关的 item 即可:
<!-- 控制台上追加界面 -->
<adminconsole>
<!-- tab位置 -->
<tab id="tab-server">
<!-- sidebar位置 -->
<sidebar id="sidebar-server-manager">
<!-- item位置,使用 name 进行 i18n 语言配置,url连接地址配置 -->
<item id="hello-setting" name="${hello.title}"
url="hello.jsp"
description="Quickly change the HELLO configurations." />
</sidebar>
</tab>
</adminconsole>
注意:这里 tab 和 sidebar 中设置的 id 代表 显示的位置, 具体可以查询 openfire_src/src/resources/jar/admin-sidebar.xml 中的id,从而确认相关 tab 和 sidebar 的 id 名称。
- 编辑 jsp 文件
注意这里需要导入如下几个标签哦,不然 i18n 可能没法使用...
<%@ page import="org.jivesoftware.util.JiveProperties"
errorPage="error.jsp"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
具体如下:
<%@ page
import="org.jivesoftware.openfire.container.PluginManager,
org.jivesoftware.util.JiveProperties"
errorPage="error.jsp"%>
<%@ page import="java.util.Map"%>
<%@ page import="java.util.HashMap"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager" />
<%
webManager.init(request, response, session, application, out);
%>
<%
// Get parameters
boolean update = request.getParameter("update") != null;
Map<String, String> errors = new HashMap<String, String>();
final JiveProperties mJiveProperties = JiveProperties.getInstance();
if (update) {
// TODO update params
}
%>
<html>
<head>
<title><fmt:message key="hello.title" /></title>
<meta name="pageID" content="jpush-setting" />
</head>
<body>
<p>
<fmt:message key="hello.info" />
</p>
</body>
</html>
注意:jsp调试目前没有找到方法,仅能通过日志的方式进行调试.
web接口插件开发
在 [WEB-INF] 目录下 web-custom.xml 则是对 servlet 等动态注册的配置页面,类似 Tomcat 中的 web.xml 配置, 如下两种方式进行配置:
- Servlet 注册
比如 Fastpath 插件下的 servlet 配置如下:
<?xml version='1.0' encoding='ISO-8859-1'?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- Servlets -->
<servlet>
<servlet-name>ImageServlet</servlet-name>
<servlet-class>org.jivesoftware.openfire.fastpath.ImageServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SoundServlet</servlet-name>
<servlet-class>org.jivesoftware.openfire.fastpath.SoundServlet</servlet-class>
</servlet>
<!-- Servlet mappings -->
<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
<url-pattern>/getimage</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SoundServlet</servlet-name>
<url-pattern>/getsound</url-pattern>
</servlet-mapping>
</web-app>
- JerseyWrapper 配置
比如 mucservice 中配置 JerseyWrapper 的方式如下:
<?xml version='1.0' encoding='ISO-8859-1'?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- Servlets -->
<servlet>
<servlet-name>JerseyWrapper</servlet-name>
<servlet-class>org.jivesoftware.openfire.plugin.servlet.JerseyWrapper</servlet-class>
</servlet>
<!-- Servlet mappings -->
<servlet-mapping>
<servlet-name>JerseyWrapper</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>