package org.jivesoftware.openfire.plugin.component;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.dom4j.Element;
import org.jivesoftware.openfire.IQRouter;
import org.jivesoftware.openfire.RoutingTable;
import org.jivesoftware.openfire.XMPPServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.component.IQResultListener;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
public class ComponentList implements IQResultListener {
private static final Logger Log = LoggerFactory.getLogger(ComponentList.class);
private static ComponentList instance = new ComponentList();
private XMPPServer server = XMPPServer.getInstance();
private RoutingTable routingTable = server.getRoutingTable();
Map<String, String> componentMap = new ConcurrentHashMap<String, String>();
private ComponentList() {
getComponentInfo();
}
public Map<String, String> getComponentMap() {
return componentMap;
}
public static ComponentList getInstance() {
return instance;
}
public String getComponentName(JID jid) {
return componentMap.get(jid.toString());
}
public String getComponentName(String jid) {
return componentMap.get(jid);
}
public void receivedAnswer(IQ packet) {
if (IQ.Type.result == packet.getType()) {
Element child = packet.getChildElement();
if (child != null) {
for (Iterator<Element> it = child.elementIterator("identity"); it.hasNext();) {
Element identity = it.next();
String name = identity.attributeValue("name");
componentMap.put(packet.getFrom().toString(), name);
}
}
}
}
public void answerTimeout(String packetId) {
Log.warn("An answer to a previously sent IQ stanza was never received. Packet id: " + packetId);
}
public Collection<String> getComponentDomains() {
return routingTable.getComponentsDomains();
}
public Collection<String> getComponentNames() {
return componentMap.values();
}
private void getComponentInfo() {
IQRouter iqRouter;
Collection<String> components = routingTable.getComponentsDomains();
iqRouter = server.getIQRouter();
for (String componentDomain : components) {
IQ iq = new IQ(IQ.Type.get);
iq.setFrom(server.getServerInfo().getXMPPDomain());
iq.setTo(componentDomain);
iq.setChildElement("query", "http://jabber.org/protocol/disco#info");
iqRouter.addIQResultListener(iq.getID(), this);
iqRouter.route(iq);
}
}
}