导言

插件是增强 Openfire 功能。 这份文件是一个开发人员创建插件指南。

结构的一个插件

插件存放在 插件 openfireHome 目录 。 当部署一个 jar 或 war 插件文件,它会自动解压安装。 该文件在插件目录结构如下:

插件结构

myplugin /
                 | - plugin.xml                             插件定义文件
                 | - readme.html                           任择自述文件的插件,它会显示给最终用户
                 | - changelog.html                       任择修改文件的插件,它会显示给最终用户
                 | - icon_small.gif                        可选小( 16x16 )图标与插件(也可以是 PNG文件)
                 | - icon_large.gif                        可选大( 32x32 )图标与插件(也可以是 PNG文件)
                 | classes/                                    资源的插件需要(即属性文件)
                 | -database/                                可选数据库架构文件,你需要插件
                 | -i18n/                                      插件国际化的语言配置。
                 | -lib/                                       您的插件的jar包
                 | -web                                     资源的管理控制台集成,如果有的话
                          | - WEB-INF/
                          | - web.xml                       生成web.xml中含有编译JSP的条目
                          | -web-custom.xml                       可选用户自定义的web.xml中的自定义servlets
                          | -images/                          图片文件存放的目录

web 目录存在的插件,需要添加到 Openfire 管理控制台。 进一步的细节如下。

在 plugin.xml 文件规定的主要插件类。 样本文件看起来可能如下:

样本 plugin.xml

<?xml version="1.0" encoding="UTF-8"?><plugin>    <!—需要的插件类

-->

<class>org.example.ExamplePlugin</class>     <!-- 插件元数据 -->

<name>Example Plugin</name>    <description>This is an example plugin.</description>    <author>Jive Software</author>     <version>1.0</version>    <date>07/01/2006</date>    <url>http://www.igniterealtime.org/projects/openfire/plugins.jsp</url>    <minServerVersion>3.0.0</minServerVersion>    <licenseType>gpl</licenseType>     <!-- 管理控制台的条目 -->

<adminconsole>        <!-- More on this below -->    </adminconsole></plugin>该元数据的领域,可以设置在 plugin.xml 文件:

·         name                - 插件的名称。

·         description           - 插件的说明。

·         author               - 插件的作者。

·         version              - 该插件的版本。

·         date                 - 发布日期 如 2006 年 7 月 1 日 。

·         url                   - 插件网址。

·         minServerVersion     - 最低 Openfire 版本

·         databaseKey        - 如果插件需要它自己的数据表,该 databaseKey 内容应设立一个架构主要名称(通常是相同名称的插件) 。 数据库架构文件为每个支持的数据库,然后放置在 数据库 目录下的插件。 例如, “ foo” ,架构文件将被称为 “ foo_mysql.sql ” , “ foo_oracle.sql ” 等等,我们建议您,您的表前缀 of ,以避免可能的冲突与其他应用程序安装在同一数据库。 脚本应该进入 ofVersion 表使用的关键,这样的架构版本信息可跟踪,例如:

INSERT INTO ofVersion (name, version) VALUES ('foo', 0); databaseVersion - 数据库版本号(如果数据库模式的定义) 。 新的插件与数据库架构应该开始在版本。 如果将来插件版本的需要更新,这些更新可以定义创建子目录中的 升级数据库 目录为每个版本。 例如,目录 database/upgrade/1 和 database/upgrade/2 将包含脚本,如 “ foo_mysql.sql ” 和 “ foo_oracle.sql ” 中包含相关的数据库,为每一个版本的变化。 每个脚本应该更新版本中的信息 ofVersion 表,例如:

UPDATE ofVersion set version=1 where name='foo';

·         parentPlugin - 父层插件(作为 “foo” 的 “ foo.jar ” 插件) 。当一个插件有一个父插件,插件的类加载器将被使用来而不是建立一个新的类加载器。 这可让插件更加紧密地协同工作。 子 插件将不会影响其父插件。

·         “licenseType” :显示许可协议,该插件是由。 有效值如下:

o    “commercial” : commercial “ 商业 ” :插件是下发布的商业许可协议。

o    “gpl” : “ 通用公共许可证 ” :插件发布使用 GNU 公共授权( GPL ) 。

o    “ apache ” :该插件发布的 Apache 许可证。

o    “ internal ” :(内部)插件是供内部使用的一个组织只,并不会重新分配。

o    “ other ” :(其他)插件是许可下发布 agrement 不属于其中的其他类别。 许可协议的细节应该在插件的自述。

如果许可证类型未设置,这是假定其他。

一些额外的文件都可以在该插件提供更多资料,以最终用户(所有放置在主要的插件目录) :

·         readme.html - 可选自述文件的插件,它会显示给最终用户。

·         changelog.html - 可选修改文件的插件,它会显示给最终用户。

·         icon_small.png - 可选小( 16x16 )图标相关插件。 也可以是。 GIF 文件。

·         icon_large.png - 可选大( 32x32 )图标相关插件。 也可以是。 GIF 文件。

interface from the Openfire API as well as have a default (no argument) contructor.您的插件类必须执行 插件 接口从 Openfire的 API ,以及有一个缺省(无参数) contructor 。 插件接口方法初始化和销毁插件。

采样插件执行

package org.example; import org.jivesoftware.openfire.container.Plugin;import org.jivesoftware.openfire.container.PluginManager; import java.io.File; /** * A sample plugin for Openfire. */public class ExamplePlugin implements Plugin {     public void initializePlugin(PluginManager manager, File pluginDirectory) {        //您的代码

}     public void destroyPlugin() {        //您的代码

}}General Plugin Best Practices 一般插件最佳实践

在选择软件包的名称为您的插件,我们建议您选择一些与众不同的您和 / 或您的组织,以帮助避免冲突尽可能。 例如,如果每个人去与 org.example.PluginName ,即使 PluginName 是不同的,您可能会开始投放到一些冲突在这里和那里的类名。 尤其是当工作与聚类。

修改管理控制台

插件可以添加标签,区段,和网页的管理控制台。 有几个步骤,以完成这项:

·         第一个 <adminconsole/> 必须添加到 plugin.xml 文件。

·         JSP 的文件必须编制和实施的类路径的插件。 阿 web.xml 中 的汇编文件,其中包含的 JSP servlet 的条目必须付诸 网页 / 目录下的插件。 注: Openfire 建立脚本可以协助编制 JSPs 和创造 web.xml 中。 这是详细说明如下。

·         任何图像所需的 JSP 页面必须住在 网页 / 图像 / 目录。 只有 GIF 和 PNG 图像的支持。

该 <adminconsole /> 部分 plugin.xml 定义额外的标签,科和项目管理控制台框架。 抽样 plugin.xml 文件看起来可能如下:

样本 plugin.xml

<?xml version="1.0" encoding="UTF-8"?>

<plugin>

<!-- 主要插件类 -->

<class>org.example.ExamplePlugin</class>

<!-- 管理控制台的条目 -->

<adminconsole>

<tab id="mytab" name="Example" url="my-plugin-admin.jsp" description="Click to manage...">

<sidebar id="mysidebar" name="My Plugin">

<item id="my-plugin" name="My Plugin Admin"

url="my-plugin-admin.jsp"

description="Click to administer settings for my plugin" />

</sidebar>

</tab>

</adminconsole>

</plugin>

在这个例子中,我们定义一个新的标签 “ 范例 ” ,一个工具栏目 “ 我的插件 ” 和一个网页 “ 我的插件管理 ” 。 我们已经注册 的,插件 admin.jsp 页面。 您可以覆盖现有的标签,区段,项目利用现有的 ID 属性值在自己的 <adminconsole> 定义。

管理控制台最佳实践

有几种最佳做法时,需要考虑变更 Openfire 管理控制台通过一个插件。 总的主题是无缝集成的插件应该:

·         集成到现有的标签和侧栏节只要有可能不是创建自己的。 只有创造新标签的非常重要的新功能。

·         不要用 “ 插件 ” 的名称,标签, sidebars 和项目。例如,有一个项目叫做 “ 网关插件 ” ,也可能是所谓的 “ 网关设置 ” 。

·         尝试以符合现有的用户界面管理控制台在您的自定义插件的网页。

·         没有必要建立一个管理控制台进入查看插件元数据。 相反,让 Openfire 告知用户有关该插件安装,并提供插件管理。

写作网页管理控制台

Openfire 使用 Sitemesh 框架装饰网页的管理控制台。 全球定义的装修适用于每个网页,以便使最终产出,如下面的图:

建立网页,与 Sitemesh 是容易的。 只要创建有效的 HTML 页面,然后使用中继标记来传送指示 Sitemesh 。 当渲染输出, Sitemesh 将使用您所提供的指示,使装修的任何内容,在您的 HTML 网页。 以下元标记可用于:

·       pageID - 的 ID 的网页,其中必须符合入境管理控制台中的 XML 上文所述。 要么 pageID 或 subPageID 必须 指定。

·       subPageID - 的 ID 小组网页,其中必须符合入境管理控制台中的 XML 上文所述。 小组网页用于行政行为涉及到父页面编号。 例如,编辑或删除某一特定群体。要么 pageID 或 subPageID 必须 指定。

·       extraParams (可选) - 额外的参数,应通过网页。例如,在网页上删除一组可能的 ID 集团。 参数必须是 URL 编码。

·       装修 (可选) - 覆写 Sitemesh 装修使用的网页。装修 没有 命名,将可提供简单的网页没有装修。

下面的 HTML 代码段显示了有效的网页:

范例

<html>   <head>       <title>My Plugin Page</title>        <meta name="pageID" content="myPluginPage"/>   </head>   <body>        Body here!   </body>   </html>在您使用本土化插件

这有可能把你的插件成多种语言化( i18n ) 。 为此,请使用下列程序进行:

·   创建一个 “ i18n ” 目录的根目录中的插件。

·   购买每项资源文件,并使用 %[plugin_name]%_i18n "_" language ".properties" 。属性 ” 命名约定,在那里 [ plugin_name ] 的名字是插件目录中。 见 翻译指南 ,详细了解资源包。

·   字符串转换在您的 JSP 的文件指的是国际钥匙。 例如:

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>

<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>

...

<fmt:message key="some.key.name" />

·   国际化在你的 Java 文件使用 LocaleUtils class :
org.jivesoftware.util.LocaleUtils.getLocalizedString("some.key.name", "[plugin_name]");

·   国际化 plugin.xml 文件在您使用 $ (叶)格式:
<sidebar id="gateways" name="${plugin.sidebar.name}" description="${plugin.sidebar.description}">
<description>${plugin.description}</description>

使用 Openfire 构建脚本

在 Openfire 建立脚本将帮助您建立和发展插件。 它看起来的插件开发目录格式如下:

插件结构

myplugin/ |- plugin.xml      <-插件定义文件

|- readme.html     <-插件自述文件

|- changelog.html <-插件修改的日志

|- icon_small.gif <- 缩略图片

(16x16) |- icon_large.gif <-图片

(32x32)  |- classes/         <-资源的插件需要(即属性文件)

|- lib/              <- 包

|- src/     |- database      <-可选的数据库脚本的插件

|- java           <- 插件的

Java源代码

|   |- com     |       |- mycompany     |           |- *.java     |- web         |- *.jsp          <- jsp页面

|- images/       <- 图片文件

|- WEB-INF             |- web.xml    <-可选的文件自定义

servlets可以注册

构建脚本将编译源文件和 JSPs ,并建立有效的插件结构和 JAR 文件。 把你的插件目录中 的 src / 插件 目录下的源分布,然后用 ant plugins 来建立您的插件。

任何 JAR 文件的插件需要在汇编应放到 lib 目录。 这些 JAR 文件也将被复制到插件的生成 lib 目录的构建过程的一部份。

如果您创建一个 src/web/WEB-INF/web.xml ,注册 servlets 初始化时启动插件。 只有注册的 servlet 和 servlet 的映在 web.xml 中的文件。 注:此功能是通过合并执行您的自定义 web.xml 中的档案文件的 web.xml 中所产生的 JSP 的汇编过程。

执行您的插件

插件完全进入 Openfire 的 API 。 这提供了一个巨大的灵活性,什么插件可以完成。 然而,有几个集成点,这是最常见的:

注册一个插件作为一个 组成部分 。元件接收所有数据包给某一特定子网域。 例如, test_component.example.com 。 因此,数据包发送到 joe@test_component.example.com 将交付给该组件。 请注意,子域定义为组件无关的 DNS 条目的子域。 所有的 XMPP 协议路由在套接字级别是使用主服务器域( example.com 在上面的例子) ; 子域仅用于路由的 XMPP 协议的服务器。
注册一个插件作为 IQHandler 。 智商处理回应智商包特别元素的名称和命名空间。 下面的代码片断演示了如何注册一个 IQHandler :
   IQHandler myHandler = new MyIQHander(); IQRouter iqRouter = XMPPServer.getInstance().getIQRouter(); iqRouter.addHandler(myHandler);

注册一个插件作为 PacketInterceptor 接收所有数据包被通过该系统,并有选择地予以拒绝。 例如,一个拦截可以拒绝所有的邮件或载亵渎国旗他们审查的管理员。
您可以储存持续插件设置 Openfire 属性使用 JiveGlobals.getProperty (字符串)和 JiveGlobals.setProperty (字符串,字符串)的方法。 让您的插件属性听众收听改变其性质,执行 org.jivesoftware.util.PropertyEventListener 方法。您可以注册您的插件作为一个听者使用 PropertyEventDispatcher.addListener ( PropertyEventListener )方法。 一定要注册您的插件作为听众在您的插件的 destroyPlugin ( )方法。
插件常见问题解答

我是否可以部署一个插件目录不是一 jar ?

不,所有的插件必须部署 Jar 文件或 WAR 文件。 当插件的一个 jar 或 war 不存在, Openfire 假设该文件已被删除,而用户要销毁插件,所以它也删除了目录。

什么是插件许可协议受?

由于 Openfire 是下发布的开源 GPL 许可,任何插件发达国家也必须在 GPL 许可下发布或兼容的开源许可证如果您分发插件以外的组织。 这是违反了许可协议,以创建插件分配不开源。 请访问 jive software 如果您需要不同的授权条款 Openfire 的权利,包括建立商业插件。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/heyi1214/archive/2009/05/26/4218201.aspx

Openfire简单教程相关推荐

  1. ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 异常和错误处理 上一章节中,我们学习了 ASP.NET Cor ...

  2. idea 从svn导入多个项目_IDEA导入项目简单教程

    该教程用于IDEA初学者导入eclipse项目,或者导入其他已经写好的Java源程序的简单教程. 我们用IDEA打开一个已经写好的项目源文件时,如果没有配置好,就会出现:JDK配置失误报错.程序无法启 ...

  3. expect简单教程

    expect简单教程 一.概述 expect是Unix系统中用来进行自动化控制和测试的软件工具,由Don Libes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Pas ...

  4. ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础 ...

  5. Git和Github简单教程

    网络上关于Git和GitHub的教程不少,但是这些教程有的命令太少不够用,有的命令太多,使得初期学习的时候需要额外花不少时间在一些当前用不到的命令上. 这篇文章主要的目标是用较少的时间学习Git和Gi ...

  6. ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 标签助手 上一章节我们介绍了视图导入,学习了 ...

  7. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单 ...

  8. wcf简单教程(10) ajax调用,wcf简单教程(10) ajax调用

    wcf简单教程(10) ajax调用 [2021-02-11 16:23:59]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&q ...

  9. ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单 ...

最新文章

  1. R回归模型glm与lm的区别
  2. linux中sqlite3编译时出错,Sqlite3 交叉编译 undefined reference to `fdatasync' 错误解决
  3. Git 分支 - rebase 变基
  4. 再见,Eclipse...
  5. BUUCTF-Reverce:不一样的flag
  6. 此加载项为此计算机的所有用户安装_MDI Jade 6.5软件安装教程
  7. matlab两张图片合成一张_二次曝光合成手机照片剪影照并不难,这样用snapseed轻松实现...
  8. Danfo.js专题 - 附:Dnotebook(Danfo Notebook)单机资源与汉化文档
  9. 监控系统哪家强?eBay 在监控系统上的实践应用!
  10. Oracle JET Model 数据获取与使用
  11. 【资料】avr单片机和stm32区别,avr单片机选型技巧
  12. 解决斑马打印机打中文的问题
  13. 大数据战略对企业生存有多重要?
  14. 2021年美容师(初级)报名考试及美容师(初级)最新解析
  15. excel冻结窗格--冻结行列标题
  16. 解决Host key verification failed.
  17. 巴西龟饲养日志----巴西龟成长标志
  18. 把款软件可以测试双显卡,如何看自己的电脑是不是双显卡?双显卡有什么好处?...
  19. DataBricks从开源到商业化踩过的坑
  20. 算法面经360、58同城篇

热门文章

  1. 动态规划-入室抢劫-闭环
  2. python整数表示精确到什么位_保留整数表示精确到什么位?
  3. ytu一c语言实验一保留整数
  4. 荣耀9xpro能升鸿蒙吗,荣耀9X也有份,鸿蒙升级计划曝光,麒麟710也支持
  5. java调用httpservler接口
  6. 梅花雪js树形控件MZTreeVew1.0/MZTreeVew2.0下载
  7. ISTA2A认证试验项目
  8. java 程序包不存在
  9. VoIP网络电话,VoIP渐成摇钱树 市场容量已达20亿美元
  10. 《人人都在晒,凭什么你出彩》读书笔记