[jboss-dev-forums] [Design the new POJO MicroContainer] - Re: Module.getModuleForClassLoader()
kabir.khan@jboss.com
do-not-reply at jboss.com
Wed Jan 21 06:32:36 EST 2009
I've worked around it for now in my AOPBootstrap
| public void start(Server server) throws Exception
| {
| log.debug("Registering bootstrap classloaders with AOP");
| if(server instanceof MCServer)
| {
| MCServer mcserver = MCServer.class.cast(server);
| Map<String, KernelDeployment> serverDeployments = mcserver.getDeployments();
| KernelController controller = mcserver.getKernel().getController();
|
| for(KernelDeployment kd : serverDeployments.values())
| {
| String loaderName = getClassLoaderName(kd);
| if (loaderName == null)
| {
| continue;
| }
| registerClassLoader(controller, loaderName);
| }
| }
| else
| {
| log.warn("Server is not an instance of MCServer. Ignoring bootstrap loaders");
| }
| }
|
| private String getClassLoaderName(KernelDeployment kd)
| {
| ClassLoaderMetaData clmd = kd.getClassLoader();
| if (clmd == null)
| {
| log.debug("No ClassLoaderMetaData for " + kd);
| return null;
| }
| ValueMetaData vmd = clmd.getClassLoader();
| if (vmd == null)
| {
| log.debug("No ValueMetaData for " + clmd + " from " + kd);
| return null;
| }
| Object ldr = vmd.getUnderlyingValue();
| if (ldr == null)
| {
| log.debug("No loader in " + vmd + " for " + clmd + " for " + kd);
| return null;
| }
| if (ldr instanceof String == false)
| {
| log.warn("Loader name " + ldr + " for " + kd + " is not a String");
| }
| return (String)ldr;
| }
|
| private void registerClassLoader(KernelController controller, String name)
| {
| ControllerContext loaderCtx = controller.getContext(name, ControllerState.INSTALLED);
| if (loaderCtx == null)
| {
| throw new IllegalStateException("No classloader found with name " + name);
| }
| ClassLoader loader = (ClassLoader)loaderCtx.getTarget();
| if (loader == null)
| {
| throw new IllegalStateException("Classloader was null " + name);
| }
|
| registerLoaderWithAOP(loader, findModule(controller, loaderCtx));
| }
|
| private Module findModule(KernelController controller, ControllerContext loaderCtx)
| {
| //Figure out the Module from the dependencies
| DependencyInfo info = loaderCtx.getDependencyInfo();
| Set<DependencyItem> loaderDependencies = info.getIDependOn(null);
| Module module = null;
| for (DependencyItem dep : loaderDependencies)
| {
| Object name = dep.getIDependOn();
| ControllerContext candidateCtx = controller.getContext(name, ControllerState.INSTALLED);
| if (candidateCtx.getTarget() instanceof Module)
| {
| if (module != null)
| {
| throw new IllegalStateException("Found more than one Module in the dependencies of " +
| loaderCtx.getName() + ":" + module.getContextName() + " and " + name);
| }
| module = (Module)candidateCtx.getTarget();
| }
| }
|
| if (module == null)
| {
| throw new IllegalStateException("No Module found for loader " + loaderCtx.getName());
| }
|
| return module;
| }
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4203576#4203576
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4203576
More information about the jboss-dev-forums
mailing list