導言html
插件是加強Openfire功能。這份文件是一個開發人員建立插件指南。java
結構的一個插件mysql
插件存放在插件openfireHome目錄。當部署一個jar或war插件文件,它會自動解壓安裝。該文件在插件目錄結構以下:web
插件結構sql
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管理控制檯。進一步的細節以下。apache
在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文件:oracle
· 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 /插件目錄下的源分佈,而後用antplugins來創建您的插件。
任何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的權利,包括創建商業插件。