类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文档,如以下示例所示:

      <?xml version="1.0"?>
    <smackProviders>
    <iqProvider>
    <elementName>query</elementName>
    <namespace>jabber:iq:time</namespace>
    <className>org.jivesoftware.smack.packet.Time</className>
    </iqProvider>
    </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实例。

ProviderManager的更多相关文章

  1. AuthenticationManager, ProviderManager 和 AuthenticationProvider

    AuthenticationManager是一个接口: public interface AuthenticationManager { Authentication authenticate(Aut ...

  2. AuthenticationManager、ProviderManager

    本篇主要讲述以下几点: 1.AuthenticationManager.ProviderManager和AuthenticationProvider三者之间的关系 2.以UsernamePasswor ...

  3. Spring Security怎样不让默认的ProviderManager清除密码等信息

    <authentication-manager erase-credentials="false"> ... </authentication-manager&g ...

  4. Spring Security3中的-authentication-manager标签详解

    讲解完http标签的解析过程,authentication-manager标签解析部分就很容易理解了 authentication-manager标签在spring的配置文件中的定义一般如下 < ...

  5. Spring Security 从配置入门 学习讲解。刽子手------------securityConfig.xml

    不知道我的web.xml 大家都理解了没.  废话确实有点多,可能很多知识点,大家都知道,可是我学的时候,压根什么都不懂啊.... 这篇我们要讲刽子手  securityConfig. 为什么要说他是 ...

  6. 转:Acegi Security

    Acegi Security -- Spring下最优秀的安全系统 http://www.springside.org.cn/docs/reference/Acegi.htm 1. Acegi 介绍 ...

  7. XMPP学习——2、用户登录

    最近在学习XMPP的使用,打算完成一个完整较为完整地Demo示例,通过这个示例掌握xmpp的使用与开发.同时打算在这个示例中学习使用一下其他的开源类库,在此作为记录学习. 包括服务器端--Openfi ...

  8. easyui添加生成tab和子页面jsp

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...

  9. 扩展Smack Message

    XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性. Smack是一个开源的用 java 写的XMPP(jabber)客户端代码库 因为XMPP是XML,所以进行 ...

随机推荐

  1. django 基础进阶ORM COOKIE

    ORM: class Book(models.Model): title=models.CharFiled(max_length=32) 类-----------------表    #  Book- ...

  2. __attribute__((weak))

    情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数,即自己模块的代码必须用到func函数: extern int func(void); ..... ...

  3. hive使用beeline配置远程连接

    hive以hadoop集群为基础,提供hdfs的SQL支持: hive一般可以以mysql为元数据存储,默认Derby:hadoop,hive安装自行百度吧: 介绍hive的远程访问: 未配置之前使用 ...

  4. 19-C#笔记-多态性

    # 静态多态性 --- ## 1 函数重载 和C++一样. --- ## 2 运算符重载 public static operator public static Box operator+ (Box ...

  5. Helm 安装Kafka

    helm镜像库配置 helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add incubator http ...

  6. mave常用指令

    Maven常用命令有以下几种: 清理 maven clean 测试 maven test 编译 maven compile 打包 maven package 部署 maven install 第一个m ...

  7. Layui 在新标签中打开页面 / 模拟点击菜单

    原文:https://blog.csdn.net/sr_www/article/details/81394365 核心代码: //在新标签页中 打开页面 function newTab(url, ti ...

  8. university-conda

    1.建立环境 conda create -n djx python=3.7 2.激活 conda activate djx 3.退出 conda deactivate 4.查看 conda env l ...

  9. C语言实现Socket简单通信

    环境是linux,不过应该没什么影响,因为只用到了socket的基本用法,没有涉及pthread等. 分为服务器端和客户端,服务器端监听端口发来的请求,收到后向客户端发送一个Hello World,客 ...

  10. 使用PostMan进行压力/性能测试

    1. 2. 3. 4.查看结果/导出结果