📄 internalcomponentmanager.java
字号:
return new org.xmpp.component.Log() {
public void error(String msg) {
Log.error(msg);
}
public void error(String msg, Throwable throwable) {
Log.error(msg, throwable);
}
public void error(Throwable throwable) {
Log.error(throwable);
}
public void warn(String msg) {
Log.warn(msg);
}
public void warn(String msg, Throwable throwable) {
Log.warn(msg, throwable);
}
public void warn(Throwable throwable) {
Log.warn(throwable);
}
public void info(String msg) {
Log.info(msg);
}
public void info(String msg, Throwable throwable) {
Log.info(msg, throwable);
}
public void info(Throwable throwable) {
Log.info(throwable);
}
public void debug(String msg) {
Log.debug(msg);
}
public void debug(String msg, Throwable throwable) {
Log.debug(msg, throwable);
}
public void debug(Throwable throwable) {
Log.debug(throwable);
}
};
}
/**
* Returns the list of components that are currently installed in the server.
* This includes internal and external components.
*
* @return the list of installed components.
*/
public Collection<Component> getComponents() {
return Collections.unmodifiableCollection(components.values());
}
/**
* Retrieves the <code>Component</code> which is mapped
* to the specified JID.
*
* @param componentJID the jid mapped to the component.
* @return the component with the specified id.
*/
public Component getComponent(JID componentJID) {
Component component = components.get(componentJID.getDomain());
if (component != null) {
return component;
}
else {
// Search again for those JIDs whose domain include the server name but this
// time remove the server name from the JID's domain
String serverName = componentJID.getDomain();
int index = serverName.lastIndexOf("." + serverDomain);
if (index > -1) {
return components.get(serverName.substring(0, index));
}
}
return null;
}
/**
* Retrieves the <code>Component</code> which is mapped
* to the specified JID.
*
* @param jid the jid mapped to the component.
* @return the component with the specified id.
*/
public Component getComponent(String jid) {
return getComponent(new JID(jid));
}
/**
* Registers Probeers who have not yet been serviced.
*
* @param prober the jid probing.
* @param probee the presence being probed.
*/
public void addPresenceRequest(JID prober, JID probee) {
presenceMap.put(prober, probee);
}
private void checkPresences() {
for (JID prober : presenceMap.keySet()) {
JID probee = presenceMap.get(prober);
Component component = getComponent(probee);
if (component != null) {
Presence presence = new Presence();
presence.setFrom(prober);
presence.setTo(probee);
component.processPacket(presence);
// No reason to hold onto prober reference.
presenceMap.remove(prober);
}
}
}
/**
* Send a disco#info request to the new component. If the component provides information
* then it will be added to the list of discoverable server items.
*
* @param component the new component that was added to this manager.
* @param componentJID the XMPP address of the new component.
*/
private void checkDiscoSupport(Component component, JID componentJID) {
// Build a disco#info request that will be sent to the component
IQ iq = new IQ(IQ.Type.get);
iq.setFrom(getAddress());
iq.setTo(componentJID);
iq.setChildElement("query", "http://jabber.org/protocol/disco#info");
// Send the disco#info request to the component. The reply (if any) will be processed in
// #process(Packet)
sendPacket(component, iq);
}
public JID getAddress() {
return serviceAddress;
}
/**
* Processes packets that were sent to this service. Currently only packets that were sent from
* registered components are being processed. In the future, we may also process packet of
* trusted clients. Trusted clients may be able to execute ad-hoc commands such as adding or
* removing components.
*
* @param packet the packet to process.
*/
public void process(Packet packet) throws PacketException {
Component component = getComponent(packet.getFrom());
// Only process packets that were sent by registered components
if (component != null) {
if (packet instanceof IQ && IQ.Type.result == ((IQ) packet).getType()) {
IQ iq = (IQ) packet;
Element childElement = iq.getChildElement();
String namespace = null;
if (childElement != null) {
namespace = childElement.getNamespaceURI();
}
if ("http://jabber.org/protocol/disco#info".equals(namespace)) {
// Add a disco item to the server for the component that supports disco
Element identity = childElement.element("identity");
if (identity == null) {
// Do nothing since there are no identities in the disco#info packet
return;
}
try {
XMPPServer.getInstance().getIQDiscoItemsHandler().addComponentItem(packet.getFrom()
.toBareJID(),
identity.attributeValue("name"));
if (component instanceof ComponentSession.ExternalComponent) {
ComponentSession.ExternalComponent externalComponent =
(ComponentSession.ExternalComponent) component;
externalComponent.setName(identity.attributeValue("name"));
externalComponent.setType(identity.attributeValue("type"));
externalComponent.setCategory(identity.attributeValue("category"));
}
}
catch (Exception e) {
Log.error("Error processing disco packet of component: " + component +
" - " + packet.toXML(), e);
}
// Store the IQ disco#info returned by the component
String subdomain = packet.getFrom().getDomain().replace("." + serverDomain, "");
componentInfo.put(subdomain, iq);
// Notify listeners that a component answered the disco#info request
for (ComponentEventListener listener : listeners) {
listener.componentInfoReceived(component, iq);
}
}
}
}
}
/**
* Exposes a Component as a RoutableChannelHandler.
*/
public static class RoutableComponent implements RoutableChannelHandler {
private JID jid;
private Component component;
public RoutableComponent(JID jid, Component component) {
this.jid = jid;
this.component = component;
}
public JID getAddress() {
return jid;
}
public void process(Packet packet) throws PacketException {
component.processPacket(packet);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -