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)