轉自:http://www.blogjava.net/jyleon/articles/254197.html
Openfire插件開發人員指南
導言
插件是增強 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 的權利,包括建立商業插件。