ProviderManager

類ProviderManager



  • public final class ProviderManager 
    extends Object
    管理提供程序以解析XMPP數據包的自定義XML子文檔。存在兩種類型的提供者:
    • IQProvider - 將IQ請求解析爲Java對象。
    • PacketExtension - 將附加到數據包的XML子文檔解析爲PacketExtension實例。
    IQProvider

    默認狀況下,Smack只知道如何使用幾個名稱空間中的子數據包處理IQ數據包,例如:html

      • jabber:iq:auth
      • jabber:iq:roster
      • jabber:iq:register
    因爲更多的IQ類型是XMPP及其擴展的一部分,所以提供了可插入的IQ解析機制。IQ提供程序以編程方式或經過建立提供程序文件進行註冊。該文件是包含一個或多個iqProvider條目的XML文檔,如如下示例所示:
    1  <?xml version="1.0"?>
    2  <smackProviders>
    3      <iqProvider>
    4          <elementName>query</elementName>
    5          <namespace>jabber:iq:time</namespace>
    6          <className>org.jivesoftware.smack.packet.Time</className>
    7      </iqProvider>
    8  </smackProviders>

     

    每一個IQ提供程序都與元素名稱和命名空間相關聯。若是多個提供程序條目嘗試註冊以處理相同的命名空間,則從類路徑加載的第一個條目將優先。IQ提供程序類能夠實現IQProvider接口,也能夠擴展IQ類。在前一種狀況下,每一個IQProvider都負責解析原始XML流以建立IQ實例。在後一種狀況下,bean introspection用於嘗試使用IQ節XML中的值自動設置IQ實例的屬性。例如,XMPP時間節相似於如下內容:
     <iq type='result' to='joe@example.com' from='mary@example.com' id='time_1'>
         <query xmlns='jabber:iq:time'>
             <utc>20020910T17:58:35</utc>
             <tz>MDT</tz>
             <display>Tue Sep 10 12:58:35 2002</display>
         </query>
     </iq>

     

    爲了將此節自動映射到上面的providers文件中列出的Time對象,它必須具備方法setUtc(String),setTz(String)和setDisplay(String)。內省服務將自動嘗試將XML中的String值轉換爲boolean,int,long,float,double或Class,具體取決於IQ實例所指望的類型。

    還存在用於節擴展的可插入系統,用於消息和存在分組的自定義命名空間中的子元素。每一個擴展提供程序都在smack.providers文件中註冊了一個名稱空間,以下例所示:java

     <?xml version="1.0"?>
     <smackProviders>
         <extensionProvider>
             <elementName>x</elementName>
             <namespace>jabber:iq:event</namespace>
             <className>org.jivesoftware.smack.packet.MessageEvent</className>
         </extensionProvider>
     </smackProviders>

     

    若是多個提供程序條目嘗試註冊以處理相同的元素名稱和命名空間,則從類路徑加載的第一個條目將優先。每當在數據包中找到節擴展時,解析將被傳遞給正確的提供者。每一個提供程序均可以實現PacketExtensionProvider接口,也能夠是標準Java Bean。在前一種狀況下,每一個擴展提供程序負責解析原始XML流以構造對象。在後一種狀況下,bean introspection用於嘗試使用節擴展子元素中的值自動設置類的屬性。當擴展提供程序未註冊元素名稱和命名空間組合時,Smack將在DefaultPacketExtension對象中存儲子數據包的全部頂級元素,而後將其附加到數據包。

     

    • 構造函數詳細信息

    • 方法細節

      • getIQProvider

        public static  IQProvider < IQgetIQProviderString  elementName,
                                                    String  namespace)
        返回註冊到指定XML元素名稱和名稱空間的IQ提供程序。例如,若是提供程序已註冊到元素名稱「query」和命名空間「jabber:iq:time」,則如下節將觸發提供程序:
         <iq type='result' to='joe@example.com' from='mary@example.com' id='time_1'>
             <query xmlns='jabber:iq:time'>
                 <utc>20020910T17:58:35</utc>
                 <tz>MDT</tz>
                 <display>Tue Sep 10 12:58:35 2002</display>
             </query>
         </iq>

         

        注意:此方法一般僅由內部Smack類調用。編程

        參數:
        elementName  - XML元素名稱。
        namespace  - XML命名空間。
        返回:
        IQ提供者。
      • getIQProviders

        public static  List < IQProvider < IQ >>  getIQProviders()
        返回全部IQProvider實例的不可修改的集合。集合中的每一個對象均可以是IQProvider實例,也能夠是實現IQProvider接口的Class對象。
        返回:
        全部IQProvider實例。
      • addIQProvider

        public static void  addIQProviderString  elementName,
                                          String  namespace,
                                          Object  provider)
        添加具備指定元素名稱和名稱空間的IQ提供程序(必須是IQProvider的實例或IQ的Class對象)。提供程序將覆蓋經過類路徑加載的任何提供程序。
        參數:
        elementName  - XML元素名稱。
        namespace  - XML命名空間。
        provider  - IQ提供商。
      • removeIQProvider

        public static  String  removeIQProviderString  elementName,
                                               String  namespace)
        刪除具備指定元素名稱和命名空間的IQ提供程序。一般將此方法調用爲使用該 addIQProvider 方法以編程方式添加的清理提供程序
        參數:
        elementName  - XML元素名稱。
        namespace  - XML命名空間。
        返回:
        刪除IQ提供程序的密鑰
      • getExtensionProvider

        public static  ExtensionElementProvider < ExtensionElementgetExtensionProviderString  elementName,
                                                                                       String  namespace)
        返回註冊到指定XML元素名稱和名稱空間的節擴展提供程序。例如,若是提供程序已註冊到元素名稱「x」和命名空間「jabber:x:event」,則如下節將觸發提供程序:
         <message to='romeo@montague.net' id='message_1'>
             <body>Art thou not Romeo, and a Montague?</body>
             <x xmlns='jabber:x:event'>
                 <composing/>
             </x>
         </message>

         

        注意:此方法一般僅由內部Smack類調用。api

        參數:
        elementName  - 與擴展提供程序關聯的元素名稱。
        namespace  - 與擴展提供者關聯的命名空間
        返回:
        擴展提供商。
      • addExtensionProvider

        public static void  addExtensionProviderString  elementName,
                                                 String  namespace,
                                                 Object  provider)
        添加具備指定元素名稱和名稱空間的擴展提供程序。提供程序將覆蓋經過類路徑加載的任何提供程序。提供者必須是PacketExtensionProvider實例或Javabean的Class對象。
        參數:
        elementName  - XML元素名稱。
        namespace  - XML命名空間。
        provider  - 擴展提供商。
      • removeExtensionProvider

        public static  String  removeExtensionProviderString  elementName,
                                                      String  namespace)
        刪除具備指定元素名稱和命名空間的擴展提供程序。一般將此方法調用爲使用該 addExtensionProvider 方法以編程方式添加的清理提供程序
        參數:
        elementName  - XML元素名稱。
        namespace  - XML命名空間。
        返回:
        已刪除的節擴展提供程序的密鑰
      • getExtensionProviders

        public static  List < ExtensionElementProvider < ExtensionElement >>  getExtensionProviders()
        返回全部PacketExtensionProvider實例的不可修改的集合。集合中的每一個對象均可以是PacketExtensionProvider實例,也能夠是實現PacketExtensionProvider接口的Class對象。
        返回:
        全部PacketExtensionProvider實例。
相關文章
相關標籤/搜索