Openfire插件開發人員指南

導言html

插件是加強Openfire功能。這份文件是一個開發人員建立插件指南。java

結構的一個插件mysql

插件存放在插件openfireHome目錄當部署一個jarwar插件文件,它會自動解壓安裝。該文件在插件目錄結構以下: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                -發佈日期200671

·         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/1database/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.您的插件類必須執行插件接口從OpenfireAPI ,以及有一個缺省(無參數) 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頁面必須住在網頁/圖像/目錄。只有GIFPNG圖像的支持。

<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上文所述。要麼pageIDsubPageID 必須指定。

·       subPageID -ID小組網頁,其中必須符合入境管理控制檯中的XML上文所述。小組網頁用於行政行爲涉及到父頁面編號。例如,編輯或刪除某一特定羣體。要麼pageIDsubPageID 必須指定。

·       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初始化時啓動插件。只有註冊的servletservlet的映在web.xml中的文件。注:此功能是經過合併執行您的自定義web.xml中的檔案文件的web.xml中所產生的JSP的彙編過程。

執行您的插件

插件徹底進入OpenfireAPI 這提供了一個巨大的靈活性,什麼插件能夠完成。然而,有幾個集成點,這是最多見的:

  1. 註冊一個插件做爲一個組成部分 。元件接收全部數據包給某一特定子網域。例如,test_component.example.com所以,數據包發送到joe@test_component.example.com將交付給該組件。請注意,子域定義爲組件無關的DNS條目的子域。全部的XMPP協議路由在套接字級別是使用主服務器域( example.com在上面的例子) ;子域僅用於路由的XMPP協議的服務器。

  2. 註冊一個插件做爲IQHandler 智商處理迴應智商包特別元素的名稱和命名空間。下面的代碼片段演示瞭如何註冊一個IQHandler

   IQHandler myHandler = new MyIQHander();
 IQRouter iqRouter = XMPPServer.getInstance().getIQRouter();
 iqRouter.addHandler(myHandler);

 

  1. 註冊一個插件做爲PacketInterceptor接收全部數據包被經過該系統,並有選擇地予以拒絕。例如,一個攔截能夠拒絕全部的郵件或載褻瀆國旗他們審查的管理員。

  2. 您能夠儲存持續插件設置Openfire屬性使用JiveGlobals.getProperty (字符串)和JiveGlobals.setProperty (字符串,字符串)的方法。讓您的插件屬性聽衆收聽改變其性質,執行org.jivesoftware.util.PropertyEventListener方法。您能夠註冊您的插件做爲一個聽者使用PropertyEventDispatcher.addListener  PropertyEventListener )方法。必定要註冊您的插件做爲聽衆在您的插件的destroyPlugin )方法。

插件常見問題解答

我是否能夠部署一個插件目錄不是一jar

不,全部的插件必須部署Jar文件或WAR文件。當插件的一個jarwar不存在, Openfire假設該文件已被刪除,而用戶要銷燬插件,因此它也刪除了目錄。

什麼是插件許可協議受?

因爲Openfire是下發布的開源GPL許可,任何插件發達國家也必須在GPL許可下發布或兼容的開源許可證若是您分發插件之外的組織。這是違反了許可協議,以建立插件分配不開源。請訪問jive software若是您須要不一樣的受權條款Openfire的權利,包括創建商業插件。

相關文章
相關標籤/搜索