The problem is that in PreInstallAction, KernelControllerContext.setBeanInfo() adds the
bean info and also describeVisits the metadata, while
KernelMetaDataRepository.addMetaData() creates the MDR entry and updates the annotations.
So with the way it is there is no MDR at the time we are in describeVisit.
| protected void installActionInternal(KernelControllerContext context) throws
Throwable
| {
| KernelController controller = (KernelController)context.getController();
| Kernel kernel = controller.getKernel();
| KernelConfigurator configurator = kernel.getConfigurator();
|
| BeanMetaData metaData = context.getBeanMetaData();
| if (metaData.getBean() != null)
| {
| BeanInfo info = configurator.getBeanInfo(metaData);
| context.setBeanInfo(info);
| KernelMetaDataRepository repository =
controller.getKernel().getMetaDataRepository();
| ClassLoader oldCL = SecurityActions.setContextClassLoader(context);
| try
| {
| repository.addMetaData(context); //1
| }
| finally
| {
| SecurityActions.resetContextClassLoader(oldCL);
| }
| try
| {
| applyScoping(context);
| }
| catch (Throwable t)
| {
| removeMetaData(context);
| throw t;
| }
| }
| }
|
If I call KCC.setBeanInfo() after KMDR.addMetaData() some of the exisiting tests like
ClassAnnotationTestCase break. Now, the problem is that the internal calls to update the
annotations return early since there is no bean info. I have worked around this with the
following change locally:
| protected void installActionInternal(KernelControllerContext context) throws
Throwable
| {
| KernelController controller = (KernelController)context.getController();
| Kernel kernel = controller.getKernel();
| KernelConfigurator configurator = kernel.getConfigurator();
|
| BeanMetaData metaData = context.getBeanMetaData();
| if (metaData.getBean() != null)
| {
| BeanInfo info = configurator.getBeanInfo(metaData);
| context.setBeanInfo(info);
| KernelMetaDataRepository repository =
controller.getKernel().getMetaDataRepository();
| ClassLoader oldCL = SecurityActions.setContextClassLoader(context);
| try
| {
| repository.addMetaData(context);
| }
| finally
| {
| SecurityActions.resetContextClassLoader(oldCL);
| }
| try
| {
| applyScoping(context);
| }
| catch (Throwable t)
| {
| removeMetaData(context);
| throw t;
| }
| context.processMetaData();
| }
| }
|
KCC.setBeanInfo() now does not describeVisit() the metadata, instead an explicit call is
needed to KCC.processMetaData()
| $svn diff
kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
| Index:
kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java
| ===================================================================
| ---
kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java (revision
96585)
| +++
kernel/src/main/java/org/jboss/kernel/plugins/dependency/AbstractKernelControllerContext.java (working
copy)
| @@ -177,10 +177,15 @@
| public void setBeanInfo(BeanInfo info)
| {
| this.info = info;
| - infoprocessMetaData();
| flushJBossObjectCache();
| }
|
| + public void processMetaData()
| + {
| + infoprocessMetaData();
| + flushJBossObjectCache();
| + }
| +
| public BeanMetaData getBeanMetaData()
| {
| return metaData;
|
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4267059#...
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&a...