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>

目录
相关文章
|
存储 安全 API
oss服务器端加密(Server-Side Encryption Configuration)
阿里云OSS提供服务器端加密(SSE),确保静态数据安全。支持SSE-KMS,使用KMS托管CMK加密。数据上传时自动加密,下载时自动解密。用户可设置Bucket默认加密或在上传时指定加密选项。适用于高度保护数据场景,如敏感个人信息和企业关键信息。兼容多种部署形态,特定特性地域可用。此功能简化了加密处理,增强了云端数据安全性。
641 1
|
监控 前端开发 安全
CentOS7 部署 Zabbix 监控平台———监控网络设备,Linux 主机、Windows 主机
Zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。
1797 0
CentOS7 部署 Zabbix 监控平台———监控网络设备,Linux 主机、Windows 主机
|
Web App开发
Web QQ自动强制加好友代码
也许见过强行聊天的代码:  tencent://Message/?Uin=574201314&websiteName=www.oicqzone.com&Menu=yes   但是你应该不知道,还有强行加好友的代码: tencent://AddContact/?fromId=45&f...
6269 0
|
网络协议 数据可视化 网络安全
firewalld 详细介绍配置(二)
【8月更文挑战第10天】配置`firewalld`涉及安装、启动与管理防火墙规则。首先通过`yum install firewalld`安装,然后使用`systemctl`命令进行启动、停止及禁用服务。`firewall-cmd`命令用于管理防火墙状态、查看版本与帮助信息、设置默认区域及接口所属区域。可通过添加或移除端口和服务来控制网络流量,并利用丰富规则进行更细粒度的控制。此外,`firewalld`支持动态规则更新,无需重启服务即可生效。可以通过配置文件持久化规则设置,适用于长期维护场景。
529 3
|
编解码 网络协议 Java
技术笔记:Mina框架(实战详解)
技术笔记:Mina框架(实战详解)
|
Web App开发 消息中间件 Prometheus
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!(一)
Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控等!
|
Cloud Native 安全 Docker
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
379 5