插件分類
-
消息等内部插件
這類插件主要用于對 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>