ProviderManager
类ProviderManager
- java.lang.Object继承
-
- org.jivesoftware.smack.provider.ProviderManager
public final class ProviderManager extends Object
管理提供程序以解析XMPP数据包的自定义XML子文档。存在两种类型的提供者:- IQProvider - 将IQ请求解析为Java对象。
- PacketExtension - 将附加到数据包的XML子文档解析为PacketExtension实例。
默认情况下,Smack只知道如何使用几个名称空间中的子数据包处理IQ数据包,例如:
-
- jabber:iq:auth
- jabber:iq:roster
- jabber:iq:register
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对象中存储子数据包的所有顶级元素,然后将其附加到数据包。
-
-
构造函数摘要
构造函数 构造函数和描述 ProviderManager()
-
方法摘要
所有方法静态方法具体方法 修饰符和类型 方法和描述 static voidaddExtensionProvider(String elementName, String namespace, Object provider)添加具有指定元素名称和名称空间的扩展提供程序。static voidaddIQProvider(String elementName, String namespace, Object provider)添加具有指定元素名称和名称空间的IQ提供程序(必须是IQProvider的实例或IQ的Class对象)。static voidaddLoader(ProviderLoader loader)static voidaddStreamFeatureProvider(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 StringremoveExtensionProvider(String elementName, String namespace)删除具有指定元素名称和命名空间的扩展提供程序。static StringremoveIQProvider(String elementName, String namespace)删除具有指定元素名称和命名空间的IQ提供程序。static voidremoveStreamFeatureProvider(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)
- 参数:
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)
- 参数:
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)
-
-

浙公网安备 33010602011771号