[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