ProviderManager

匿名 (未验证) 提交于 2019-12-02 23:56:01
    • org.jivesoftware.smack.provider.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对象中存储子数据包的所有顶级元素,然后将其附加到数据包。

    • 方法摘要

      所有方法静态方法具体方法
      修饰符和类型方法和描述
      static void
      添加具有指定元素名称和名称空间的扩展提供程序。
      static void
      添加具有指定元素名称和名称空间的IQ提供程序(必须是IQProvider的实例或IQ的Class对象)。
      static void
      static void
      返回注册到指定XML元素名称和名称空间的节扩展提供程序。
      getExtensionProviders()
      返回所有PacketExtensionProvider实例的不可修改的集合。
      返回注册到指定XML元素名称和名称空间的IQ提供程序。
      getIQProviders()
      返回所有IQProvider实例的不可修改的集合。
      删除具有指定元素名称和命名空间的扩展提供程序。
      删除具有指定元素名称和命名空间的IQ提供程序。
      static void
      • 从类java.lang继承的方法。

    • 构造函数详细信息

      • ProviderManager的

         
    • 方法细节

      • addLoader

         
      • getIQProvider

         
        返回注册到指定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
        namespace
        返回:
        IQ提供者。
      • getIQProviders

         
        返回所有IQProvider实例的不可修改的集合。集合中的每个对象都可以是IQProvider实例,也可以是实现IQProvider接口的Class对象。
        返回:
        所有IQProvider实例。
      • addIQProvider

         
        添加具有指定元素名称和名称空间的IQ提供程序(必须是IQProvider的实例或IQ的Class对象)。提供程序将覆盖通过类路径加载的任何提供程序。
        参数:
        elementName
        namespace
        provider
      • removeIQProvider

         
        删除具有指定元素名称和命名空间的IQ提供程序。通常将此方法调用为使用该addIQProvider方法以编程方式添加的清理提供程序
        参数:
        elementName
        namespace
        返回:
        删除IQ提供程序的密钥
      • getExtensionProvider

         
        返回注册到指定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

         
        添加具有指定元素名称和名称空间的扩展提供程序。提供程序将覆盖通过类路径加载的任何提供程序。提供者必须是PacketExtensionProvider实例或Javabean的Class对象。
        参数:
        elementName
        namespace
        provider
      • removeExtensionProvider

         
        删除具有指定元素名称和命名空间的扩展提供程序。通常将此方法调用为使用该addExtensionProvider方法以编程方式添加的清理提供程序
        参数:
        elementName
        namespace
        返回:
        已删除的节扩展提供程序的密钥
      • getExtensionProviders

         
        返回所有PacketExtensionProvider实例的不可修改的集合。集合中的每个对象都可以是PacketExtensionProvider实例,也可以是实现PacketExtensionProvider接口的Class对象。
        返回:
        所有PacketExtensionProvider实例。
      • getStreamFeatureProvider

         
      • addStreamFeatureProvider

         
      • removeStreamFeatureProvider

         
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!