[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