zoukankan      html  css  js  c++  java
  • ProviderManager

    类ProviderManager



    • public final class ProviderManager 
      extends Object
      管理提供程序以解析XMPP数据包的自定义XML子文档。存在两种类型的提供者:
      • IQProvider - 将IQ请求解析为Java对象。
      • PacketExtension - 将附加到数据包的XML子文档解析为PacketExtension实例。
      IQProvider

      默认情况下,Smack只知道如何使用几个名称空间中的子数据包处理IQ数据包,例如:

        • 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文件中注册了一个名称空间,如下例所示:

       <?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类调用。

          参数:
          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实例。
  • 相关阅读:
    java8新特性学习:stream与lambda
    Storm实践(一):基础知识
    Google Protocol Buffer入门
    zeromq实践
    maven实践--你所需要了解的maven
    springcloud实践(一)服务发现:Eureka
    职责链模式(chain of responsibility Pattern)
    代理模式 (Proxy Pattern)
    享元模式(Flyweight Pattern)
    外观模式(Facade Pattern)
  • 原文地址:https://www.cnblogs.com/endv/p/11427918.html
Copyright © 2011-2022 走看看