ProviderManager
类ProviderManager
- java.lang.Object继承
- 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文档,如以下示例所示:
<?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对象中存储子数据包的所有顶级元素,然后将其附加到数据包。
构造函数摘要
构造函数 构造函数和描述 ProviderManager()
方法摘要
所有方法静态方法具体方法 修饰符和类型 方法和描述 static void
addExtensionProvider(String elementName, String namespace, Object provider)
添加具有指定元素名称和名称空间的扩展提供程序。static void
addIQProvider(String elementName, String namespace, Object provider)
添加具有指定元素名称和名称空间的IQ提供程序(必须是IQProvider的实例或IQ的Class对象)。static void
addLoader(ProviderLoader loader)
static void
addStreamFeatureProvider(String elementName, String namespace,ExtensionElementProvider<ExtensionElement> provider)
static ExtensionElementProvider<ExtensionElement>
getExtensionProvider(String elementName, String namespace)
返回注册到指定XML元素名称和名称空间的节扩展提供程序。static List<ExtensionElementProvider<ExtensionElement>>
getExtensionProviders()
返回所有PacketExtensionProvider实例的不可修改的集合。static IQProvider<IQ>
getIQProvider(String elementName, String namespace)
返回注册到指定XML元素名称和名称空间的IQ提供程序。static List<IQProvider<IQ>>
getIQProviders()
返回所有IQProvider实例的不可修改的集合。static ExtensionElementProvider<ExtensionElement>
getStreamFeatureProvider(String elementName, String namespace)
static String
removeExtensionProvider(String elementName, String namespace)
删除具有指定元素名称和命名空间的扩展提供程序。static String
removeIQProvider(String elementName, String namespace)
删除具有指定元素名称和命名空间的IQ提供程序。static void
removeStreamFeatureProvider(String elementName, String namespace)
构造函数详细信息
ProviderManager的
public ProviderManager()
方法细节
addLoader
public static void addLoader(ProviderLoader loader)
getIQProvider
public static IQProvider < IQ > getIQProvider(String 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 addIQProvider(String elementName,
String namespace,
Object provider)添加具有指定元素名称和名称空间的IQ提供程序(必须是IQProvider的实例或IQ的Class对象)。提供程序将覆盖通过类路径加载的任何提供程序。- 参数:
elementName
- XML元素名称。namespace
- XML命名空间。provider
- IQ提供商。
removeIQProvider
public static String removeIQProvider(String elementName,
String namespace)删除具有指定元素名称和命名空间的IQ提供程序。通常将此方法调用为使用该addIQProvider
方法以编程方式添加的清理提供程序。- 参数:
elementName
- XML元素名称。namespace
- XML命名空间。- 返回:
- 删除IQ提供程序的密钥
getExtensionProvider
public static ExtensionElementProvider < ExtensionElement > getExtensionProvider(String 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 addExtensionProvider(String elementName,
String namespace,
Object provider)添加具有指定元素名称和名称空间的扩展提供程序。提供程序将覆盖通过类路径加载的任何提供程序。提供者必须是PacketExtensionProvider实例或Javabean的Class对象。- 参数:
elementName
- XML元素名称。namespace
- XML命名空间。provider
- 扩展提供商。
removeExtensionProvider
public static String removeExtensionProvider(String elementName,
String namespace)删除具有指定元素名称和命名空间的扩展提供程序。通常将此方法调用为使用该addExtensionProvider
方法以编程方式添加的清理提供程序。- 参数:
elementName
- XML元素名称。namespace
- XML命名空间。- 返回:
- 已删除的节扩展提供程序的密钥
getExtensionProviders
public static List < ExtensionElementProvider < ExtensionElement >> getExtensionProviders()
返回所有PacketExtensionProvider实例的不可修改的集合。集合中的每个对象都可以是PacketExtensionProvider实例,也可以是实现PacketExtensionProvider接口的Class对象。- 返回:
- 所有PacketExtensionProvider实例。
getStreamFeatureProvider
public static ExtensionElementProvider < ExtensionElement > getStreamFeatureProvider(String elementName,
String namespace)
addStreamFeatureProvider
public static void addStreamFeatureProvider(String elementName,
String namespace,
ExtensionElementProvider < ExtensionElement > provider)
removeStreamFeatureProvider
public static void removeStreamFeatureProvider(String elementName,
String namespace)
ProviderManager的更多相关文章
- AuthenticationManager, ProviderManager 和 AuthenticationProvider
AuthenticationManager是一个接口: public interface AuthenticationManager { Authentication authenticate(Aut ...
- AuthenticationManager、ProviderManager
本篇主要讲述以下几点: 1.AuthenticationManager.ProviderManager和AuthenticationProvider三者之间的关系 2.以UsernamePasswor ...
- Spring Security怎样不让默认的ProviderManager清除密码等信息
<authentication-manager erase-credentials="false"> ... </authentication-manager&g ...
- Spring Security3中的-authentication-manager标签详解
讲解完http标签的解析过程,authentication-manager标签解析部分就很容易理解了 authentication-manager标签在spring的配置文件中的定义一般如下 < ...
- Spring Security 从配置入门 学习讲解。刽子手------------securityConfig.xml
不知道我的web.xml 大家都理解了没. 废话确实有点多,可能很多知识点,大家都知道,可是我学的时候,压根什么都不懂啊.... 这篇我们要讲刽子手 securityConfig. 为什么要说他是 ...
- 转:Acegi Security
Acegi Security -- Spring下最优秀的安全系统 http://www.springside.org.cn/docs/reference/Acegi.htm 1. Acegi 介绍 ...
- XMPP学习——2、用户登录
最近在学习XMPP的使用,打算完成一个完整较为完整地Demo示例,通过这个示例掌握xmpp的使用与开发.同时打算在这个示例中学习使用一下其他的开源类库,在此作为记录学习. 包括服务器端--Openfi ...
- easyui添加生成tab和子页面jsp
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...
- 扩展Smack Message
XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性. Smack是一个开源的用 java 写的XMPP(jabber)客户端代码库 因为XMPP是XML,所以进行 ...
随机推荐
- 手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群
手把手教你如何利用 HeroKu 免费获取一个 Scrapyd 集群 本文原始地址:https://sitoi.cn/posts/48724.html 准备环境 一个 GitHub 的账号 一个 He ...
- computer networking ---------DNS
[DNS]domain named system 域名解析系统,即相当于对www.baidu.com的类似的域名进行解析,对于人而言,记忆一些域名相比于记忆一些Ip地址来说简单的多,而对于计算机而言, ...
- python字符串使用方法归纳
字符串的意思就是“一串字符”,比如“Hello,Charlie”是一个字符串,“How are you?”也是一个字符串. Python 要求字符串必须使用引号括起来,使用单引号也行,使用双引号也行, ...
- ORA-00923: FROM keyword not found where expected
网上搜索这类错误还是挺多的,只提供我遇到的一种情景. 本地数据库环境:Oracle10g 导入别人的项目后,有一段SQL查询总是报如下错误信息: Cause: java.sql.SQLExceptio ...
- 二分查找java实现
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 二分查找思路非常简单,由粗暴的遍历查找改为 ...
- Layui 常用知识
原文:https://www.cnblogs.com/30go/p/11088549.html 后台框架:Layui Admin Iframe layui.form.render();
- 【luoguP1168】中位数
题目链接 用一个大根堆和一个小根堆维护中位数即可 #include<iostream> #include<cstring> #include<cstdio> #in ...
- 日志篇 随着win10更新...
随着win10更新到最新..我发现电脑出了点状况.. 一 是电脑睡眠主机不关闭...然后用了 https://jingyan.baidu.com/article/cb5d6105d76343005c2 ...
- python入门之模块
序什么是包包的作用一.什么是模块二.模块的三种来源三.模块的四种表现形式四.为什么要使用模块五. 如何创建,编写模块,并使用模块5.1 给模块起别名5.2 模块的导入方式5.3 循环导入问题 TOC ...
- SQL Server创建、更改和删除架构
SQL Server创建架构 学习如何使用SQL Server CREATE SCHEMA在当前数据库中创建新架构. SQL Server中的架构是什么 架构是包括表,视图,触发器,存储过程,索引等在 ...