Commit 866cbd40 authored by Randy Layman's avatar Randy Layman

Make module loading driven by a file to allow modules to be replaced without changing Openfire code

parent cad52ff9
<?xml version="1.0" encoding="UTF-8"?>
<!--
This file stores the modules that make up the implementation of Openfire. Modules are loaded
in the order they are specified in this file (top to bottom).
Don't modify this file unless you really know what you are doing
-->
<jive>
<!-- Boot Modules -->
<module interface="org.jivesoftware.openfire.RoutingTable" implementation="org.jivesoftware.openfire.spi.RoutingTableImpl" />
<module interface="org.jivesoftware.openfire.audit.AuditManager" implementation="org.jivesoftware.openfire.audit.spi.AuditManagerImpl" />
<module interface="org.jivesoftware.openfire.roster.RosterManager" implementation="org.jivesoftware.openfire.roster.RosterManager" />
<module interface="org.jivesoftware.openfire.PrivateStorage" implementation="org.jivesoftware.openfire.PrivateStorage" />
<!-- Core Modules -->
<module interface="org.jivesoftware.openfire.PresenceManager" implementation="org.jivesoftware.openfire.spi.PresenceManagerImpl" />
<module interface="org.jivesoftware.openfire.SessionManager" implementation="org.jivesoftware.openfire.SessionManager" />
<module interface="org.jivesoftware.openfire.PacketRouter" implementation="org.jivesoftware.openfire.spi.PacketRouterImpl" />
<module interface="org.jivesoftware.openfire.IQRouter" implementation="org.jivesoftware.openfire.IQRouter" />
<module interface="org.jivesoftware.openfire.MessageRouter" implementation="org.jivesoftware.openfire.MessageRouter" />
<module interface="org.jivesoftware.openfire.PresenceRouter" implementation="org.jivesoftware.openfire.PresenceRouter" />
<module interface="org.jivesoftware.openfire.MulticastRouter" implementation="org.jivesoftware.openfire.MulticastRouter" />
<module interface="org.jivesoftware.openfire.spi.PacketTransporterImpl" implementation="org.jivesoftware.openfire.spi.PacketTransporterImpl" />
<module interface="org.jivesoftware.openfire.PacketDeliverer" implementation="org.jivesoftware.openfire.spi.PacketDelivererImpl" />
<module interface="org.jivesoftware.openfire.transport.TransportHandler" implementation="org.jivesoftware.openfire.transport.TransportHandler" />
<module interface="org.jivesoftware.openfire.OfflineMessageStrategy" implementation="org.jivesoftware.openfire.OfflineMessageStrategy" />
<module interface="org.jivesoftware.openfire.OfflineMessageStore" implementation="org.jivesoftware.openfire.OfflineMessageStore" />
<module interface="org.jivesoftware.openfire.vcard.VCardManager" implementation="org.jivesoftware.openfire.vcard.VCardManager" />
<!-- Standard Modules -->
<module interface="org.jivesoftware.openfire.handler.IQBindHandler" implementation="org.jivesoftware.openfire.handler.IQBindHandler" />
<module interface="org.jivesoftware.openfire.handler.IQSessionEstablishmentHandler" implementation="org.jivesoftware.openfire.handler.IQSessionEstablishmentHandler" />
<module interface="org.jivesoftware.openfire.handler.IQAuthHandler" implementation="org.jivesoftware.openfire.handler.IQAuthHandler" />
<module interface="org.jivesoftware.openfire.handler.IQPingHandler" implementation="org.jivesoftware.openfire.handler.IQPingHandler" />
<module interface="org.jivesoftware.openfire.handler.IQPrivateHandler" implementation="org.jivesoftware.openfire.handler.IQPrivateHandler" />
<module interface="org.jivesoftware.openfire.handler.IQRegisterHandler" implementation="org.jivesoftware.openfire.handler.IQRegisterHandler" />
<module interface="org.jivesoftware.openfire.handler.IQRosterHandler" implementation="org.jivesoftware.openfire.handler.IQRosterHandler" />
<module interface="org.jivesoftware.openfire.handler.IQTimeHandler" implementation="org.jivesoftware.openfire.handler.IQTimeHandler" />
<module interface="org.jivesoftware.openfire.handler.IQEntityTimeHandler" implementation="org.jivesoftware.openfire.handler.IQEntityTimeHandler" />
<module interface="org.jivesoftware.openfire.handler.IQvCardHandler" implementation="org.jivesoftware.openfire.handler.IQvCardHandler" />
<module interface="org.jivesoftware.openfire.handler.IQVersionHandler" implementation="org.jivesoftware.openfire.handler.IQVersionHandler" />
<module interface="org.jivesoftware.openfire.handler.IQLastActivityHandler" implementation="org.jivesoftware.openfire.handler.IQLastActivityHandler" />
<module interface="org.jivesoftware.openfire.handler.PresenceSubscribeHandler" implementation="org.jivesoftware.openfire.handler.PresenceSubscribeHandler" />
<module interface="org.jivesoftware.openfire.handler.PresenceUpdateHandler" implementation="org.jivesoftware.openfire.handler.PresenceUpdateHandler" />
<module interface="org.jivesoftware.openfire.handler.IQOfflineMessagesHandler" implementation="org.jivesoftware.openfire.handler.IQOfflineMessagesHandler" />
<module interface="org.jivesoftware.openfire.pep.IQPEPHandler" implementation="org.jivesoftware.openfire.pep.IQPEPHandler" />
<module interface="org.jivesoftware.openfire.pep.IQPEPOwnerHandler" implementation="org.jivesoftware.openfire.pep.IQPEPOwnerHandler" />
<module interface="org.jivesoftware.openfire.net.MulticastDNSService" implementation="org.jivesoftware.openfire.net.MulticastDNSService" />
<module interface="org.jivesoftware.openfire.handler.IQSharedGroupHandler" implementation="org.jivesoftware.openfire.handler.IQSharedGroupHandler" />
<module interface="org.jivesoftware.openfire.commands.AdHocCommandHandler" implementation="org.jivesoftware.openfire.commands.AdHocCommandHandler" />
<module interface="org.jivesoftware.openfire.handler.IQPrivacyHandler" implementation="org.jivesoftware.openfire.handler.IQPrivacyHandler" />
<module interface="org.jivesoftware.openfire.filetransfer.DefaultFileTransferManager" implementation="org.jivesoftware.openfire.filetransfer.DefaultFileTransferManager" />
<module interface="org.jivesoftware.openfire.filetransfer.proxy.FileTransferProxy" implementation="org.jivesoftware.openfire.filetransfer.proxy.FileTransferProxy" />
<module interface="org.jivesoftware.openfire.mediaproxy.MediaProxyService" implementation="org.jivesoftware.openfire.mediaproxy.MediaProxyService" />
<module interface="org.jivesoftware.openfire.pubsub.PubSubModule" implementation="org.jivesoftware.openfire.pubsub.PubSubModule" />
<module interface="org.jivesoftware.openfire.disco.IQDiscoInfoHandler" implementation="org.jivesoftware.openfire.disco.IQDiscoInfoHandler" />
<module interface="org.jivesoftware.openfire.disco.IQDiscoItemsHandler" implementation="org.jivesoftware.openfire.disco.IQDiscoItemsHandler" />
<module interface="org.jivesoftware.openfire.update.UpdateManager" implementation="org.jivesoftware.openfire.update.UpdateManager" />
<module interface="org.jivesoftware.openfire.FlashCrossDomainHandler" implementation="org.jivesoftware.openfire.FlashCrossDomainHandler" />
<module interface="org.jivesoftware.openfire.component.InternalComponentManager" implementation="org.jivesoftware.openfire.component.InternalComponentManager" />
<module interface="org.jivesoftware.openfire.muc.MultiUserChatManager" implementation="org.jivesoftware.openfire.muc.MultiUserChatManager" />
<module interface="org.jivesoftware.openfire.clearspace.ClearspaceManager" implementation="org.jivesoftware.openfire.clearspace.ClearspaceManager" />
<module interface="org.jivesoftware.openfire.handler.IQMessageCarbonsHandler" implementation="org.jivesoftware.openfire.handler.IQMessageCarbonsHandler" />
<!--
Load this module always last since we don't want to start listening for clients
before the rest of the modules have been started
-->
<module interface="org.jivesoftware.openfire.ConnectionManager" implementation="org.jivesoftware.openfire.spi.ConnectionManagerImpl" />
</jive>
\ No newline at end of file
......@@ -20,6 +20,7 @@ package org.jivesoftware.openfire;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
......@@ -33,6 +34,7 @@ import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
......@@ -40,6 +42,8 @@ import java.util.TimerTask;
import java.util.concurrent.CopyOnWriteArrayList;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.openfire.admin.AdminManager;
......@@ -165,7 +169,7 @@ public class XMPPServer {
/**
* All modules loaded by this server
*/
private Map<Class, Module> modules = new LinkedHashMap<Class, Module>();
private Map<String, Module> modules = new LinkedHashMap<String, Module>();
/**
* Listeners that will be notified when the server has started or is about to be stopped.
......@@ -532,64 +536,39 @@ public class XMPPServer {
}
}
@SuppressWarnings("unchecked")
private void loadModules() {
// Load boot modules
loadModule(RoutingTableImpl.class.getName());
loadModule(AuditManagerImpl.class.getName());
loadModule(RosterManager.class.getName());
loadModule(PrivateStorage.class.getName());
// Load core modules
loadModule(PresenceManagerImpl.class.getName());
loadModule(SessionManager.class.getName());
loadModule(PacketRouterImpl.class.getName());
loadModule(IQRouter.class.getName());
loadModule(MessageRouter.class.getName());
loadModule(PresenceRouter.class.getName());
loadModule(MulticastRouter.class.getName());
loadModule(PacketTransporterImpl.class.getName());
loadModule(PacketDelivererImpl.class.getName());
loadModule(TransportHandler.class.getName());
loadModule(OfflineMessageStrategy.class.getName());
loadModule(OfflineMessageStore.class.getName());
loadModule(VCardManager.class.getName());
// Load standard modules
loadModule(IQBindHandler.class.getName());
loadModule(IQSessionEstablishmentHandler.class.getName());
loadModule(IQAuthHandler.class.getName());
loadModule(IQPingHandler.class.getName());
loadModule(IQPrivateHandler.class.getName());
loadModule(IQRegisterHandler.class.getName());
loadModule(IQRosterHandler.class.getName());
loadModule(IQTimeHandler.class.getName());
loadModule(IQEntityTimeHandler.class.getName());
loadModule(IQvCardHandler.class.getName());
loadModule(IQVersionHandler.class.getName());
loadModule(IQLastActivityHandler.class.getName());
loadModule(PresenceSubscribeHandler.class.getName());
loadModule(PresenceUpdateHandler.class.getName());
loadModule(IQOfflineMessagesHandler.class.getName());
loadModule(IQPEPHandler.class.getName());
loadModule(IQPEPOwnerHandler.class.getName());
loadModule(MulticastDNSService.class.getName());
loadModule(IQSharedGroupHandler.class.getName());
loadModule(AdHocCommandHandler.class.getName());
loadModule(IQPrivacyHandler.class.getName());
loadModule(DefaultFileTransferManager.class.getName());
loadModule(FileTransferProxy.class.getName());
loadModule(MediaProxyService.class.getName());
loadModule(PubSubModule.class.getName());
loadModule(IQDiscoInfoHandler.class.getName());
loadModule(IQDiscoItemsHandler.class.getName());
loadModule(UpdateManager.class.getName());
loadModule(FlashCrossDomainHandler.class.getName());
loadModule(InternalComponentManager.class.getName());
loadModule(MultiUserChatManager.class.getName());
loadModule(ClearspaceManager.class.getName());
loadModule(IQMessageCarbonsHandler.class.getName());
// Load this module always last since we don't want to start listening for clients
// before the rest of the modules have been started
loadModule(ConnectionManagerImpl.class.getName());
FileReader in = null;
try {
File modulesXml = new File(JiveGlobals.getHomeDirectory(), "conf/modules.xml");
logger.info("Loading modules from " + modulesXml.getAbsolutePath());
SAXReader xmlReader = new SAXReader();
xmlReader.setEncoding("UTF-8");
in = new FileReader(modulesXml);
Document document = xmlReader.read(in);
Element root = document.getRootElement();
Iterator<Node> itr = root.nodeIterator();
while (itr.hasNext()) {
Node n = itr.next();
if (n.getNodeType() == Element.ELEMENT_NODE && "module".equals(n.getName())) {
Element module = (Element)n;
logger.debug("Loading module " + module.attributeValue("implementation") + " to interface " + module.attributeValue("interface"));
loadModule(module.attributeValue("interface"), module.attributeValue("implementation"));
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error(LocaleUtils.getLocalizedString("admin.error"), e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// Squash
}
}
}
// Keep a reference to the internal component manager
componentManager = getComponentManager();
}
......@@ -599,11 +578,12 @@ public class XMPPServer {
*
* @param module the name of the class that implements the Module interface.
*/
private void loadModule(String module) {
@SuppressWarnings("unchecked")
private void loadModule(String moduleName, String moduleImpl) {
try {
Class modClass = loader.loadClass(module);
Module mod = (Module) modClass.newInstance();
this.modules.put(modClass, mod);
Class<Module> modClass = (Class<Module>) loader.loadClass(moduleImpl);
Module mod = modClass.newInstance();
this.modules.put(moduleName, mod);
}
catch (Exception e) {
e.printStackTrace();
......@@ -1039,7 +1019,7 @@ public class XMPPServer {
* @return the <code>ConnectionManager</code> registered with this server.
*/
public ConnectionManager getConnectionManager() {
return (ConnectionManager) modules.get(ConnectionManagerImpl.class);
return (ConnectionManager) modules.get(ConnectionManager.class.getName());
}
/**
......@@ -1050,7 +1030,7 @@ public class XMPPServer {
* @return the <code>RoutingTable</code> registered with this server.
*/
public RoutingTable getRoutingTable() {
return (RoutingTable) modules.get(RoutingTableImpl.class);
return (RoutingTable) modules.get(RoutingTable.class.getName());
}
/**
......@@ -1061,7 +1041,7 @@ public class XMPPServer {
* @return the <code>PacketDeliverer</code> registered with this server.
*/
public PacketDeliverer getPacketDeliverer() {
return (PacketDeliverer) modules.get(PacketDelivererImpl.class);
return (PacketDeliverer) modules.get(PacketDeliverer.class.getName());
}
/**
......@@ -1072,7 +1052,7 @@ public class XMPPServer {
* @return the <code>RosterManager</code> registered with this server.
*/
public RosterManager getRosterManager() {
return (RosterManager) modules.get(RosterManager.class);
return (RosterManager) modules.get(RosterManager.class.getName());
}
/**
......@@ -1083,7 +1063,7 @@ public class XMPPServer {
* @return the <code>PresenceManager</code> registered with this server.
*/
public PresenceManager getPresenceManager() {
return (PresenceManager) modules.get(PresenceManagerImpl.class);
return (PresenceManager) modules.get(PresenceManagerImpl.class.getName());
}
/**
......@@ -1094,7 +1074,7 @@ public class XMPPServer {
* @return the <code>OfflineMessageStore</code> registered with this server.
*/
public OfflineMessageStore getOfflineMessageStore() {
return (OfflineMessageStore) modules.get(OfflineMessageStore.class);
return (OfflineMessageStore) modules.get(OfflineMessageStore.class.getName());
}
/**
......@@ -1105,7 +1085,7 @@ public class XMPPServer {
* @return the <code>OfflineMessageStrategy</code> registered with this server.
*/
public OfflineMessageStrategy getOfflineMessageStrategy() {
return (OfflineMessageStrategy) modules.get(OfflineMessageStrategy.class);
return (OfflineMessageStrategy) modules.get(OfflineMessageStrategy.class.getName());
}
/**
......@@ -1116,7 +1096,7 @@ public class XMPPServer {
* @return the <code>PacketRouter</code> registered with this server.
*/
public PacketRouter getPacketRouter() {
return (PacketRouter) modules.get(PacketRouterImpl.class);
return (PacketRouter) modules.get(PacketRouter.class.getName());
}
/**
......@@ -1127,7 +1107,7 @@ public class XMPPServer {
* @return the <code>IQRegisterHandler</code> registered with this server.
*/
public IQRegisterHandler getIQRegisterHandler() {
return (IQRegisterHandler) modules.get(IQRegisterHandler.class);
return (IQRegisterHandler) modules.get(IQRegisterHandler.class.getName());
}
/**
......@@ -1138,7 +1118,7 @@ public class XMPPServer {
* @return the <code>IQAuthHandler</code> registered with this server.
*/
public IQAuthHandler getIQAuthHandler() {
return (IQAuthHandler) modules.get(IQAuthHandler.class);
return (IQAuthHandler) modules.get(IQAuthHandler.class.getName());
}
/**
......@@ -1149,7 +1129,7 @@ public class XMPPServer {
* @return the <code>IQPEPHandler</code> registered with this server.
*/
public IQPEPHandler getIQPEPHandler() {
return (IQPEPHandler) modules.get(IQPEPHandler.class);
return (IQPEPHandler) modules.get(IQPEPHandler.class.getName());
}
/**
......@@ -1169,7 +1149,7 @@ public class XMPPServer {
* @return the <code>PubSubModule</code> registered with this server.
*/
public PubSubModule getPubSubModule() {
return (PubSubModule) modules.get(PubSubModule.class);
return (PubSubModule) modules.get(PubSubModule.class.getName());
}
/**
......@@ -1195,7 +1175,7 @@ public class XMPPServer {
* @return the <code>SessionManager</code> registered with this server.
*/
public SessionManager getSessionManager() {
return (SessionManager) modules.get(SessionManager.class);
return (SessionManager) modules.get(SessionManager.class.getName());
}
/**
......@@ -1206,7 +1186,7 @@ public class XMPPServer {
* @return the <code>TransportHandler</code> registered with this server.
*/
public TransportHandler getTransportHandler() {
return (TransportHandler) modules.get(TransportHandler.class);
return (TransportHandler) modules.get(TransportHandler.class.getName());
}
/**
......@@ -1217,7 +1197,7 @@ public class XMPPServer {
* @return the <code>PresenceUpdateHandler</code> registered with this server.
*/
public PresenceUpdateHandler getPresenceUpdateHandler() {
return (PresenceUpdateHandler) modules.get(PresenceUpdateHandler.class);
return (PresenceUpdateHandler) modules.get(PresenceUpdateHandler.class.getName());
}
/**
......@@ -1228,7 +1208,7 @@ public class XMPPServer {
* @return the <code>PresenceSubscribeHandler</code> registered with this server.
*/
public PresenceSubscribeHandler getPresenceSubscribeHandler() {
return (PresenceSubscribeHandler) modules.get(PresenceSubscribeHandler.class);
return (PresenceSubscribeHandler) modules.get(PresenceSubscribeHandler.class.getName());
}
/**
......@@ -1239,7 +1219,7 @@ public class XMPPServer {
* @return the <code>IQRouter</code> registered with this server.
*/
public IQRouter getIQRouter() {
return (IQRouter) modules.get(IQRouter.class);
return (IQRouter) modules.get(IQRouter.class.getName());
}
/**
......@@ -1250,7 +1230,7 @@ public class XMPPServer {
* @return the <code>MessageRouter</code> registered with this server.
*/
public MessageRouter getMessageRouter() {
return (MessageRouter) modules.get(MessageRouter.class);
return (MessageRouter) modules.get(MessageRouter.class.getName());
}
/**
......@@ -1261,7 +1241,7 @@ public class XMPPServer {
* @return the <code>PresenceRouter</code> registered with this server.
*/
public PresenceRouter getPresenceRouter() {
return (PresenceRouter) modules.get(PresenceRouter.class);
return (PresenceRouter) modules.get(PresenceRouter.class.getName());
}
/**
......@@ -1272,7 +1252,7 @@ public class XMPPServer {
* @return the <code>MulticastRouter</code> registered with this server.
*/
public MulticastRouter getMulticastRouter() {
return (MulticastRouter) modules.get(MulticastRouter.class);
return (MulticastRouter) modules.get(MulticastRouter.class.getName());
}
/**
......@@ -1305,7 +1285,7 @@ public class XMPPServer {
* @return the <code>UpdateManager</code> registered with this server.
*/
public UpdateManager getUpdateManager() {
return (UpdateManager) modules.get(UpdateManager.class);
return (UpdateManager) modules.get(UpdateManager.class.getName());
}
/**
......@@ -1316,7 +1296,7 @@ public class XMPPServer {
* @return the <code>AuditManager</code> registered with this server.
*/
public AuditManager getAuditManager() {
return (AuditManager) modules.get(AuditManagerImpl.class);
return (AuditManager) modules.get(AuditManagerImpl.class.getName());
}
/**
......@@ -1406,7 +1386,7 @@ public class XMPPServer {
* @return the <code>IQDiscoInfoHandler</code> registered with this server.
*/
public IQDiscoInfoHandler getIQDiscoInfoHandler() {
return (IQDiscoInfoHandler) modules.get(IQDiscoInfoHandler.class);
return (IQDiscoInfoHandler) modules.get(IQDiscoInfoHandler.class.getName());
}
/**
......@@ -1417,7 +1397,7 @@ public class XMPPServer {
* @return the <code>IQDiscoItemsHandler</code> registered with this server.
*/
public IQDiscoItemsHandler getIQDiscoItemsHandler() {
return (IQDiscoItemsHandler) modules.get(IQDiscoItemsHandler.class);
return (IQDiscoItemsHandler) modules.get(IQDiscoItemsHandler.class.getName());
}
/**
......@@ -1428,7 +1408,7 @@ public class XMPPServer {
* @return the <code>PrivateStorage</code> registered with this server.
*/
public PrivateStorage getPrivateStorage() {
return (PrivateStorage) modules.get(PrivateStorage.class);
return (PrivateStorage) modules.get(PrivateStorage.class.getName());
}
/**
......@@ -1439,7 +1419,7 @@ public class XMPPServer {
* @return the <code>MultiUserChatManager</code> registered with this server.
*/
public MultiUserChatManager getMultiUserChatManager() {
return (MultiUserChatManager) modules.get(MultiUserChatManager.class);
return (MultiUserChatManager) modules.get(MultiUserChatManager.class.getName());
}
/**
......@@ -1450,7 +1430,7 @@ public class XMPPServer {
* @return the <code>AdHocCommandHandler</code> registered with this server.
*/
public AdHocCommandHandler getAdHocCommandHandler() {
return (AdHocCommandHandler) modules.get(AdHocCommandHandler.class);
return (AdHocCommandHandler) modules.get(AdHocCommandHandler.class.getName());
}
/**
......@@ -1461,7 +1441,7 @@ public class XMPPServer {
* @return the <code>FileTransferProxy</code> registered with this server.
*/
public FileTransferProxy getFileTransferProxy() {
return (FileTransferProxy) modules.get(FileTransferProxy.class);
return (FileTransferProxy) modules.get(FileTransferProxy.class.getName());
}
/**
......@@ -1472,7 +1452,7 @@ public class XMPPServer {
* @return the <code>FileTransferProxy</code> registered with this server.
*/
public FileTransferManager getFileTransferManager() {
return (FileTransferManager) modules.get(DefaultFileTransferManager.class);
return (FileTransferManager) modules.get(DefaultFileTransferManager.class.getName());
}
/**
......@@ -1483,7 +1463,7 @@ public class XMPPServer {
* @return the <code>MediaProxyService</code> registered with this server.
*/
public MediaProxyService getMediaProxyService() {
return (MediaProxyService) modules.get(MediaProxyService.class);
return (MediaProxyService) modules.get(MediaProxyService.class.getName());
}
/**
......@@ -1494,7 +1474,7 @@ public class XMPPServer {
* @return the <code>FlashCrossDomainHandler</code> registered with this server.
*/
public FlashCrossDomainHandler getFlashCrossDomainHandler() {
return (FlashCrossDomainHandler) modules.get(FlashCrossDomainHandler.class);
return (FlashCrossDomainHandler) modules.get(FlashCrossDomainHandler.class.getName());
}
/**
......@@ -1515,7 +1495,7 @@ public class XMPPServer {
* @return the <code>InternalComponentManager</code> registered with this server.
*/
private InternalComponentManager getComponentManager() {
return (InternalComponentManager) modules.get(InternalComponentManager.class);
return (InternalComponentManager) modules.get(InternalComponentManager.class.getName());
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment