类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. AMD Ryzen一代、二代CPU一览表

    Ryzen一代(14纳米).二代(12纳米)CPU一览表 http://img30.360buyimg.com/sku/jfs/t1/1134/23/12713/382299/5bd910f9E63b ...

  2. Python使用进程间共享变量来控制两个进程(监听键盘和相机录制)的交互

    我有个简单的应用需求: 1. 该应用随时会监听键盘的输入: 2. 当输入指定键时会控制相机录制的启动和关闭. 监听键盘是一个事件循环,相机录制也是一个循环录制的过程.我试着用 Python 启动两个进 ...

  3. css之单行缩略..以及多行缩略

    html单行缩略方法 .oneline { white-space: nowrap; //强制文本在一行内输出 overflow: hidden; //隐藏溢出部分 text-overflow: el ...

  4. 201871010110-李华《面向对象程序设计(java)》第6-7周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  5. wordpress怎么用AMP加速器呢

    AMP项目(Accelerated Mobile Pages)是一个开放源代码计划,旨在为所有人打造更好的网络体验.借助该项目,用户可以打造出在各种设备和分发平台上都能始终如一地快速加载且效果出色的精 ...

  6. ubuntu gitclone下载的文件放哪里了

    在home主文件夹里面.

  7. Io 异常: Invalid number format for port number

    报错信息: Caused by: java.sql.SQLException: Io 异常: Invalid number format for port number    at oracle.jd ...

  8. [PHP] Elasticsearch 6.4.2 的安装和使用

    Elasticsearch 6.4.2 的安装和使用 一.安装http://www.ruanyifeng.com/blog/2017/08/elasticsearch.htmlhttps://www. ...

  9. python paramiko模块简介及安装

    一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  10. BFS实现8数码问题,思考与总结

    BFS实现8数码问题,思考与总结 今天中午学习了二叉树的线索化与线索化遍历,突然有一种想实现八数码问题的冲动,因为它的初级解决方式是BFS(广度优先搜索算法).于是我开始编程. 没想到一编就是一个下午 ...