📄 iqdiscoinfohandler.java
字号:
serverNodeProviders.remove(node);
}
/**
* Returns the DiscoInfoProvider responsible for providing information about a given entity or
* null if none was found.
*
* @param name the name of the identity.
* @return the DiscoInfoProvider responsible for providing information about a given entity or
* null if none was found.
*/
private DiscoInfoProvider getProvider(String name) {
return entities.get(name);
}
/**
* Sets that a given DiscoInfoProvider will provide information about a given entity. This
* message must be used when new modules (e.g. MUC) are implemented and need to provide
* information about them.
*
* @param name the name of the entity.
* @param provider the DiscoInfoProvider that will provide the entity's information.
*/
protected void setProvider(String name, DiscoInfoProvider provider) {
entities.put(name, provider);
}
/**
* Removes the DiscoInfoProvider related to a given entity.
*
* @param name the name of the entity.
*/
protected void removeProvider(String name) {
entities.remove(name);
}
/**
* Adds the features provided by the new service that implements the ServerFeaturesProvider
* interface. This information will be used whenever a disco for information is made against
* the server (i.e. the packet's target is the server).
* Example of features are: jabber:iq:agents, jabber:iq:time, etc.
*
* @param provider the ServerFeaturesProvider that provides new server features.
*/
private void addServerFeaturesProvider(ServerFeaturesProvider provider) {
for (Iterator<String> it = provider.getFeatures(); it.hasNext();) {
addServerFeature(it.next());
}
}
/**
* Adds one specific feature to the information returned whenever a disco for information is
* made against the server.
*
* @param namespace the namespace identifying the new server feature.
* @return true if the new feature was successfully added.
*/
public boolean addServerFeature(String namespace) {
return serverFeatures.add(namespace);
}
/**
* Removes a feature from the information returned whenever a disco for information is
* made against the server.
*
* @param namespace the namespace of the feature to be removed.
*/
public void removeServerFeature(String namespace) {
serverFeatures.remove(namespace);
}
public void initialize(XMPPServer server) {
super.initialize(server);
// Track the implementors of ServerFeaturesProvider so that we can collect the features
// provided by the server
for (ServerFeaturesProvider provider : server.getServerFeaturesProviders()) {
addServerFeaturesProvider(provider);
}
setProvider(server.getServerInfo().getName(), getServerInfoProvider());
}
/**
* Returns the DiscoInfoProvider responsible for providing information at the server level. This
* means that this DiscoInfoProvider will provide information whenever a disco request whose
* recipient JID is the server (e.g. localhost) is made.
*
* @return the DiscoInfoProvider responsible for providing information at the server level.
*/
private DiscoInfoProvider getServerInfoProvider() {
DiscoInfoProvider discoInfoProvider = new DiscoInfoProvider() {
final ArrayList<Element> identities = new ArrayList<Element>();
public Iterator<Element> getIdentities(String name, String node, JID senderJID) {
if (node != null && serverNodeProviders.get(node) != null) {
// Redirect the request to the disco info provider of the specified node
return serverNodeProviders.get(node).getIdentities(name, node, senderJID);
}
if (name == null) {
// Answer identity of the server
synchronized (identities) {
if (identities.isEmpty()) {
Element identity = DocumentHelper.createElement("identity");
identity.addAttribute("category", "server");
identity.addAttribute("name", JiveGlobals.getProperty(
"xmpp.server.name", "Wildfire Server"));
identity.addAttribute("type", "im");
identities.add(identity);
}
}
return identities.iterator();
}
else {
if (SessionManager.getInstance().isAnonymousRoute(name)) {
// Answer identity of an anonymous user.
return anonymousUserIdentities.iterator();
}
else {
// Answer identity of a registered user.
// Note: We know that this user exists because #hasInfo returned true
return registeredUserIdentities.iterator();
}
}
}
public Iterator<String> getFeatures(String name, String node, JID senderJID) {
if (node != null && serverNodeProviders.get(node) != null) {
// Redirect the request to the disco info provider of the specified node
return serverNodeProviders.get(node).getFeatures(name, node, senderJID);
}
if (name == null) {
// Answer features of the server
return serverFeatures.iterator();
}
else {
// Answer features of the user
return userFeatures.iterator();
}
}
public boolean hasInfo(String name, String node, JID senderJID) {
if (node != null) {
if (serverNodeProviders.get(node) != null) {
// Redirect the request to the disco info provider of the specified node
return serverNodeProviders.get(node).hasInfo(name, node, senderJID);
}
// Unknown node
return false;
}
try {
// True if it is an info request of the server, a registered user or an
// anonymous user. We now support disco of user's bare JIDs
return name == null || UserManager.getInstance().getUser(name) != null ||
SessionManager.getInstance().isAnonymousRoute(name);
}
catch (UserNotFoundException e) {
return false;
}
}
public XDataFormImpl getExtendedInfo(String name, String node, JID senderJID) {
if (node != null && serverNodeProviders.get(node) != null) {
// Redirect the request to the disco info provider of the specified node
return serverNodeProviders.get(node).getExtendedInfo(name, node, senderJID);
}
return null;
}
};
return discoInfoProvider;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -