美文网首页
openfire 插件开发

openfire 插件开发

作者: 走在成长的道路上 | 来源:发表于2018-07-31 11:52 被阅读0次

插件分类

  1. 消息等内部插件

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

  2. webUI 插件

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

  3. web接口插件

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

插件开发基本流程

  1. 实现 Plugin 类

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

  3. 添加 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 进行,具体进行如下几步即可:

  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>

相关文章

网友评论

      本文标题:openfire 插件开发

      本文链接:https://www.haomeiwen.com/subject/mbgcvftx.html