public final class ProviderManager extends Object
默认状况下,Smack只知道如何使用几个名称空间中的子数据包处理IQ数据包,例如:html
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文件中注册了一个名称空间,以下例所示:java
<?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) |
public ProviderManager()
public static void addLoader(ProviderLoader loader)
public static IQProvider < IQ > getIQProvider(String elementName, String namespace)
<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命名空间。
public static List < IQProvider < IQ >> getIQProviders()
public static void addIQProvider(String elementName, String namespace, Object provider)
elementName
- XML元素名称。
namespace
- XML命名空间。
provider
- IQ提供商。
public static String removeIQProvider(String elementName, String namespace)
elementName
- XML元素名称。
namespace
- XML命名空间。
public static ExtensionElementProvider < ExtensionElement > getExtensionProvider(String elementName, String namespace)
<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类调用。api
elementName
- 与扩展提供程序关联的元素名称。
namespace
- 与扩展提供者关联的命名空间
public static void addExtensionProvider(String elementName, String namespace, Object provider)
elementName
- XML元素名称。
namespace
- XML命名空间。
provider
- 扩展提供商。
public static String removeExtensionProvider(String elementName, String namespace)
elementName
- XML元素名称。
namespace
- XML命名空间。
public static List < ExtensionElementProvider < ExtensionElement >> getExtensionProviders()
public static ExtensionElementProvider < ExtensionElement > getStreamFeatureProvider(String elementName, String namespace)
public static void addStreamFeatureProvider(String elementName, String namespace, ExtensionElementProvider < ExtensionElement > provider)
public static void removeStreamFeatureProvider(String elementName, String namespace)