[jboss-dev-forums] [JBoss Microcontainer Development POJO Server] - Re: AS weld-int

kabir.khan@jboss.com do-not-reply at jboss.com
Mon Oct 26 13:20:55 EDT 2009


"alesj" wrote : "kabir.khan at jboss.com" wrote : 
  |   | a) I need the BeanManager. BootstrapBean is initialised, so I can call BB.getWeldManager(). I do however need access to the bean manager to use, which I can get from the (Flat)Deployment attachment. I do see some issues down the line if a deployment has several bean managers, but want to get something up and running before digging into that.
  |   | 
  | This is the name under which BootstrapBean is registered in MC:
  | * String bootstrapName = DeployersUtils.getBootstrapBeanName(unit);
  | 

I have a chicken and egg situation :-) When creating WeldKernelControllerContexts in the BeanMetaDataDeployer plugin, I need a reference to the BeanManager:


  |    public KernelControllerContext createContext(DeploymentUnit unit, BeanMetaData beanMetaData)
  |    {
  |       if (determineWeldDeployment(unit))
  |       {
  |          BeanManager beanManager = ????;
  |          return new WeldKernelControllerContext(null, beanMetaData, null, beanManager);
  |       }
  |       return null;
  |    }
  | 

However, since everything is deployed by the BeanMetaDataDeployer there is not really a way to make sure that we are deploying the BeanManager. Unless you know of a nicer way I think I'll end up doing something along the lines of:

  |    public KernelControllerContext createContext(DeploymentUnit unit, BeanMetaData beanMetaData)
  |    {
  |       if (determineWeldDeployment(unit))
  |       {
  |          if (isBootstrapBean(beanMetaData))
  |              return new KernelControllerContext(null, beanMetaData, null);
  | 
  |           //Add dependency on bootstrap bean in beanMetaData
  |           //bootstrap bean should be CREATED, and is needed in the DESCRIBE state *)
  |           BeanManager beanManager = new DelegatingBeanManager(DeployersUtils.getBootstrapBeanName(unit));
  |          
  |           new WeldKernelControllerContext(null, beanMetaData, null, beanManager);
  |       }
  |       return null;
  |    }
  | 

*) The DESCRIBE state is probably too early, so I will probably need a WELD_EXTRA_DESCRIBE state or something like that to initialise the WeldInjector for WeldKernelControllerContexts, which I am currently doing as part of the DESCRIBE state.


  | public class DelegatingBeanManager implements BeanManager
  | {
  |    private volatile BeanManager manager;
  |    
  |    Controller controller;
  |    
  |    String beanManagerName;
  |    
  |    public DelegatingBeanManager(Controller controller)
  |    {
  |       this.controller = controller;
  |       if (controller instanceof ControllerStateModel == false)
  |          throw new IllegalArgumentException("Controller is not an instance of ControllerStateModel");
  |    }
  |    
  |    private BeanManager getBeanManager()
  |    {
  |       if (manager == null)
  |       {
  |          ControllerContext context = controller.getContext(beanManagerName, null);
  |          if (context == null)
  |             throw new IllegalStateException("No bean manager found under " + beanManagerName);
  |         
  |          manager = (BeanManager)context.getTarget();
  |       }
  |       return manager; 
  |    }
  |    
  |    /**
  |     * @param bean
  |     * @deprecated
  |     * @see javax.enterprise.inject.spi.BeanManager#addBean(javax.enterprise.inject.spi.Bean)
  |     */
  |    public void addBean(Bean<?> bean)
  |    {
  |       getBeanManager().addBean(bean);
  |    }
  | 
  |    //Rest of BeanManager methods
  | }
  | 


View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4262236#4262236

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4262236



More information about the jboss-dev-forums mailing list