導言
插件是增強Openfire功能。這份文件是一個開發(fā)人員創(chuàng)建插件指南。
結(jié)構(gòu)的一個插件
插件存放在插件openfireHome目錄。當部署一個jar或war插件文件,它會自動解壓安裝。該文件在插件目錄結(jié)構(gòu)如下:
插件結(jié)構(gòu)
myplugin /
| - plugin.xml 插件定義文件
| - readme.html 任擇自述文件的插件,它會顯示給最終用戶
| - changelog.html 任擇修改文件的插件,它會顯示給最終用戶
| - icon_small.gif 可選?。?16x16 )圖標與插件(也可以是 PNG文件)
| - icon_large.gif 可選大( 32x32 )圖標與插件(也可以是 PNG文件)
| classes/ 資源的插件需要(即屬性文件)
| -database/ 可選數(shù)據(jù)庫架構(gòu)文件,你需要插件
| -i18n/ 插件國際化的語言配置。
| -lib/ 您的插件的jar包
| -web 資源的管理控制臺集成,如果有的話
| - WEB-INF/
| - web.xml 生成web.xml中含有編譯JSP的條目
| -web-custom.xml 可選用戶自定義的web.xml中的自定義servlets
| -images/ 圖片文件存放的目錄
web目錄存在的插件,需要添加到Openfire管理控制臺。進一步的細節(jié)如下。
在plugin.xml文件規(guī)定的主要插件類。樣本文件看起來可能如下:
樣本plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<!—需要的插件類 -->
<class>org.example.ExamplePlugin</class>
<!-- 插件元數(shù)據(jù) -->
<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>
該元數(shù)據(jù)的領域,可以設置在plugin.xml文件:
· name -插件的名稱。
· description -插件的說明。
· author -插件的作者。
· version -該插件的版本。
· date -發(fā)布日期如2006年7月1日。
· url -插件網(wǎng)址。
· minServerVersion -最低Openfire版本
· databaseKey -如果插件需要它自己的數(shù)據(jù)表,該databaseKey內(nèi)容應設立一個架構(gòu)主要名稱(通常是相同名稱的插件)。數(shù)據(jù)庫架構(gòu)文件為每個支持的數(shù)據(jù)庫,然后放置在數(shù)據(jù)庫目錄下的插件。例如, “foo”,架構(gòu)文件將被稱為“ foo_mysql.sql ” , “ foo_oracle.sql ”等等,我們建議您,您的表前綴of ,以避免可能的沖突與其他應用程序安裝在同一數(shù)據(jù)庫。腳本應該進入ofVersion表使用的關鍵,這樣的架構(gòu)版本信息可跟蹤,例如:
INSERT INTO ofVersion (name, version) VALUES ('foo', 0); databaseVersion -數(shù)據(jù)庫版本號(如果數(shù)據(jù)庫模式的定義)。新的插件與數(shù)據(jù)庫架構(gòu)應該開始在版本。如果將來插件版本的需要更新,這些更新可以定義創(chuàng)建子目錄中的升級數(shù)據(jù)庫目錄為每個版本。例如,目錄database/upgrade/1和database/upgrade/2將包含腳本,如“ foo_mysql.sql ”和“ foo_oracle.sql ”中包含相關的數(shù)據(jù)庫,為每一個版本的變化。每個腳本應該更新版本中的信息ofVersion表,例如:
UPDATE ofVersion set version=1 where name='foo';
· parentPlugin -父層插件(作為“foo”的“ foo.jar ”插件)。當一個插件有一個父插件,插件的類加載器將被使用來而不是建立一個新的類加載器。這可讓插件更加緊密地協(xié)同工作。子插件將不會影響其父插件。
· “licenseType”:顯示許可協(xié)議,該插件是由。有效值如下:
o “commercial”:commercial “商業(yè)” :插件是下發(fā)布的商業(yè)許可協(xié)議。
o “gpl”: “通用公共許可證” :插件發(fā)布使用GNU公共授權(quán)( GPL )。
o “apache” :該插件發(fā)布的Apache許可證。
o “internal” :(內(nèi)部)插件是供內(nèi)部使用的一個組織只,并不會重新分配。
o “other” :(其他)插件是許可下發(fā)布agrement不屬于其中的其他類別。許可協(xié)議的細節(jié)應該在插件的自述。
如果許可證類型未設置,這是假定其他。
一些額外的文件都可以在該插件提供更多資料,以最終用戶(所有放置在主要的插件目錄):
· readme.html -可選自述文件的插件,它會顯示給最終用戶。
· changelog.html -可選修改文件的插件,它會顯示給最終用戶。
· icon_small.png -可選?。?/span> 16x16 )圖標相關插件。也可以是。 GIF文件。
· icon_large.png -可選大( 32x32 )圖標相關插件。也可以是。 GIF文件。
interface from the Openfire API as well as have a default (no argument) contructor.您的插件類必須執(zhí)行插件接口從Openfire的API ,以及有一個缺?。o參數(shù)) contructor 。插件接口方法初始化和銷毀插件。
采樣插件執(zhí)行
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是不同的,您可能會開始投放到一些沖突在這里和那里的類名。尤其是當工作與聚類。
。
修改管理控制臺
插件可以添加標簽,區(qū)段,和網(wǎng)頁的管理控制臺。有幾個步驟,以完成這項:
· 第一個<adminconsole/>必須添加到plugin.xml文件。
· JSP的文件必須編制和實施的類路徑的插件。阿web.xml中的匯編文件,其中包含的JSP servlet的條目必須付諸網(wǎng)頁/目錄下的插件。注: Openfire建立腳本可以協(xié)助編制JSPs和創(chuàng)造web.xml中。這是詳細說明如下。
· 任何圖像所需的JSP頁面必須住在網(wǎng)頁/圖像/目錄。只有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>
在這個例子中,我們定義一個新的標簽“范例” ,一個工具欄目“我的插件”和一個網(wǎng)頁“我的插件管理” 。我們已經(jīng)注冊的,插件admin.jsp頁面。您可以覆蓋現(xiàn)有的標簽,區(qū)段,項目利用現(xiàn)有的ID屬性值在自己的<adminconsole>定義。
管理控制臺最佳實踐
有幾種最佳做法時,需要考慮變更Openfire管理控制臺通過一個插件。總的主題是無縫集成的插件應該:
· 集成到現(xiàn)有的標簽和側(cè)欄節(jié)只要有可能不是創(chuàng)建自己的。只有創(chuàng)造新標簽的非常重要的新功能。
· 不要用“插件”的名稱,標簽, sidebars和項目。例如,有一個項目叫做“網(wǎng)關插件” ,也可能是所謂的“網(wǎng)關設置” 。
· 嘗試以符合現(xiàn)有的用戶界面管理控制臺在您的自定義插件的網(wǎng)頁。
· 沒有必要建立一個管理控制臺進入查看插件元數(shù)據(jù)。相反,讓Openfire告知用戶有關該插件安裝,并提供插件管理。
寫作網(wǎng)頁管理控制臺
Openfire使用Sitemesh框架裝飾網(wǎng)頁的管理控制臺。全球定義的裝修適用于每個網(wǎng)頁,以便使最終產(chǎn)出,如下面的圖:
建立網(wǎng)頁,與Sitemesh是容易的。只要創(chuàng)建有效的HTML頁面,然后使用中繼標記來傳送指示Sitemesh 。當渲染輸出,Sitemesh將使用您所提供的指示,使裝修的任何內(nèi)容,在您的HTML網(wǎng)頁。以下元標記可用于:
· pageID -的ID的網(wǎng)頁,其中必須符合入境管理控制臺中的XML上文所述。要么pageID或subPageID 必須指定。
· subPageID -的ID小組網(wǎng)頁,其中必須符合入境管理控制臺中的XML上文所述。小組網(wǎng)頁用于行政行為涉及到父頁面編號。例如,編輯或刪除某一特定群體。要么pageID或subPageID 必須指定。
· extraParams (可選) -額外的參數(shù),應通過網(wǎng)頁。例如,在網(wǎng)頁上刪除一組可能的ID集團。參數(shù)必須是URL編碼。
· 裝修(可選) -覆寫Sitemesh裝修使用的網(wǎng)頁。裝修沒有命名,將可提供簡單的網(wǎng)頁沒有裝修。
下面的HTML代碼段顯示了有效的網(wǎng)頁:
范例
<html>
<head>
<title>My Plugin Page</title>
<meta name="pageID" content="myPluginPage"/>
</head>
<body>
Body here!
</body>
</html>
在您使用本土化插件
這有可能把你的插件成多種語言化( i18n )。為此,請使用下列程序進行:
· 創(chuàng)建一個“i18n”目錄的根目錄中的插件。
· 購買每項資源文件,并使用%[plugin_name]%_i18n "_" language ".properties"。屬性”命名約定,在那里[ plugin_name ]的名字是插件目錄中。見翻譯指南 ,詳細了解資源包。
· 字符串轉(zhuǎn)換在您的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構(gòu)建腳本
在Openfire建立腳本將幫助您建立和發(fā)展插件。它看起來的插件開發(fā)目錄格式如下:
插件結(jié)構(gòu)
myplugin/
|- plugin.xml <-插件定義文件
|- readme.html <-插件自述文件
|- changelog.html <-插件修改的日志
|- icon_small.gif <- 縮略圖片(16x16)
|- icon_large.gif <-圖片 (32x32)
|- classes/ <-資源的插件需要(即屬性文件)
|- lib/ <- 包
|- src/
|- database <-可選的數(shù)據(jù)庫腳本的插件
|- java <- 插件的Java源代碼
| |- com
| |- mycompany
| |- *.java
|- web
|- *.jsp <- jsp頁面
|- images/ <- 圖片文件
|- WEB-INF
|- web.xml <-可選的文件自定義servlets可以注冊
構(gòu)建腳本將編譯源文件和JSPs ,并建立有效的插件結(jié)構(gòu)和JAR文件。把你的插件目錄中的 src /插件目錄下的源分布,然后用antplugins來建立您的插件。
任何JAR文件的插件需要在匯編應放到lib目錄。這些JAR文件也將被復制到插件的生成lib目錄的構(gòu)建過程的一部份。
如果您創(chuàng)建一個src/web/WEB-INF/web.xml,注冊servlets初始化時啟動插件。只有注冊的servlet和servlet的映在web.xml中的文件。注:此功能是通過合并執(zhí)行您的自定義web.xml中的檔案文件的web.xml中所產(chǎn)生的JSP的匯編過程。
執(zhí)行您的插件
插件完全進入Openfire的API 。這提供了一個巨大的靈活性,什么插件可以完成。然而,有幾個集成點,這是最常見的:
IQHandler myHandler = new MyIQHander();
IQRouter iqRouter = XMPPServer.getInstance().getIQRouter();
iqRouter.addHandler(myHandler);
插件常見問題解答
我是否可以部署一個插件目錄不是一jar?
不,所有的插件必須部署Jar文件或WAR文件。當插件的一個jar或war不存在, Openfire假設該文件已被刪除,而用戶要銷毀插件,所以它也刪除了目錄。
什么是插件許可協(xié)議受?
由于Openfire是下發(fā)布的開源GPL許可,任何插件發(fā)達國家也必須在GPL許可下發(fā)布或兼容的開源許可證如果您分發(fā)插件以外的組織。這是違反了許可協(xié)議,以創(chuàng)建插件分配不開源。請訪問jive software如果您需要不同的授權(quán)條款Openfire的權(quán)利,包括建立商業(yè)插件。