openfire 插件开发

简介: 插件分类消息等内部插件这类插件主要用于对 openfire 内消息,状态等扩展webUI 插件这类插件主要用于对 openfire 控制台扩展web接口插件这类插件主要用于对 openfire 后台接口扩展插件开发基本流程实现 Plugin 类添加 plugin.

插件分类

  1. 消息等内部插件

    这类插件主要用于对 openfire 内消息,状态等扩展

  2. webUI 插件

    这类插件主要用于对 openfire 控制台扩展

  3. web接口插件

    这类插件主要用于对 openfire 后台接口扩展

插件开发基本流程

  1. 实现 Plugin 类

  2. 添加 plugin.xml 配置插件启动类

  3. 添加 changelog.html, logo_*.png/gif, readme.html 等说明文件及logo

基本的目录结构如下图:

img_945bccc195148cd458523f4ff1326374.png
插件目录结构

通常 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 进行,具体进行如下几步即可:

  1. 配置入口

在 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 名称。

  1. 编辑 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 配置, 如下两种方式进行配置:

  1. 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>

  1. 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>

目录
相关文章
|
前端开发 JavaScript Java
若依前后端部署之后验证码不显示
若依前后端部署之后验证码不显示
|
Web App开发
Web QQ自动强制加好友代码
也许见过强行聊天的代码:  tencent://Message/?Uin=574201314&websiteName=www.oicqzone.com&Menu=yes   但是你应该不知道,还有强行加好友的代码: tencent://AddContact/?fromId=45&f...
6096 0
|
9月前
|
弹性计算 负载均衡 网络协议
ECS中实现nginx4层7层负载均衡和ALB/NLB原SLB负载均衡
通过本文的介绍,希望您能深入理解并掌握如何在ECS中实现Nginx四层和七层负载均衡,以及如何使用ALB和NLB进行高效的负载均衡配置,以提高系统的性能和可靠性。
606 9
|
存储 机器学习/深度学习 自然语言处理
LangChain与向量数据库:高效的信息检索方案
【8月更文第4天】随着自然语言处理技术的发展,特别是深度学习的进步,我们能够更加高效地处理大量的文本数据。LangChain 作为一种强大的工具链,旨在简化和加速构建复杂的自然语言处理应用程序。结合向量数据库,LangChain 可以实现高效且精准的信息检索功能。本文将探讨这一组合的工作原理,并通过一个具体的实现案例来展示其在实际应用中的效果。
1048 2
|
11月前
|
SQL Oracle 关系型数据库
Havij功能详解
Havij功能详解
Havij功能详解
|
弹性计算 安全 Linux
操作系统智能助手OS Copilot体验评测
从了解到部署实践全方位带你体验操作系统智能助手OS Copilot的优与劣。
16934 8
操作系统智能助手OS Copilot体验评测
|
存储 弹性计算 监控
阿里云ECS健康状态产品详解
详细介绍阿里云ECS健康状态的功能和使用案例
|
NoSQL Go 网络安全
技术经验分享:codis原理及部署_01
技术经验分享:codis原理及部署_01
154 0
|
Cloud Native 安全 Docker
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
301 5
|
安全 Java
Java RMI 反序列化漏洞-远程命令执行
Java RMI 反序列化漏洞-远程命令执行
713 0