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>

目录
相关文章
|
监控 IDE Java
JRebel插件使用详解
JRebel插件使用详解
JRebel插件使用详解
|
6月前
idea的yapi插件使用详解
idea的yapi插件使用详解
452 0
|
资源调度 前端开发
jira项目笔记2-反应应用程序-polyfill
jira项目笔记2-反应应用程序-polyfill
88 0
|
XML 存储 Java
eclipse+maven开发web项目环境配置详解
一,开发工具准备与说明 1,整体说明 eclipse-jee-neon+JDK8+maven+tomcat7 eclipse是编码环境 JDK8是Java语言运行环境 tomcat7是服务器 maven是项目构建环境(简单的理解就是jar包自动管理,写一个配置,maven会将该配置对应的jar包自动构建到项目里面来)
655 0
eclipse+maven开发web项目环境配置详解
|
Android开发 开发者 Java
Eclipse离线安装Emmet插件----web开发者绝对熟悉的插件之一
web开发者对Emmet 这个插件相信大家都不会陌生。       之前是重配eclipse环境的时候基本都需要重新安装这个插件,之前都是通过eclipse的在线安装,但是因为懒的缘故,久而久之连在线安装的过程都懒得等了。
2028 0
|
JavaScript Java Android开发
|
JavaScript 前端开发 开发工具