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实例。
相关文章
相关标签/搜索