NPE when skipping cdi for ears
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/e60f9234 Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/e60f9234 Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/e60f9234 Branch: refs/heads/master Commit: e60f92340bdb5bef2d1c3c71bc9c4983f97e86a3 Parents: e677d4d Author: Romain Manni-Bucau <[email protected]> Authored: Tue Jun 16 18:17:38 2015 +0200 Committer: Romain Manni-Bucau <[email protected]> Committed: Tue Jun 16 18:17:38 2015 +0200 ---------------------------------------------------------------------- .../java/org/apache/openejb/cdi/CdiPlugin.java | 10 +++++- .../openejb/cdi/WebAppInjectionResolver.java | 2 +- .../apache/openejb/cdi/WebappBeanManager.java | 35 ++++++++++++++------ 3 files changed, 35 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/e60f9234/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java index 440e25b..db39ccb 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java @@ -103,10 +103,18 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl public void setWebBeansContext(final WebBeansContext webBeansContext) { this.webBeansContext = webBeansContext; + if (webBeansContext == null) { + return; + } if (!WebappWebBeansContext.class.isInstance(webBeansContext)) { cacheProxies = new ConcurrentHashMap<Contextual<?>, Object>(); } else { // share cache of proxies between the whole app otherwise hard to share an EJB between a webapp and the lib part of the app - cacheProxies = CdiPlugin.class.cast(WebappWebBeansContext.class.cast(webBeansContext).getParent().getPluginLoader().getEjbPlugin()).cacheProxies; + final WebBeansContext parent = WebappWebBeansContext.class.cast(webBeansContext).getParent(); + if (parent != null) { + cacheProxies = CdiPlugin.class.cast(parent.getPluginLoader().getEjbPlugin()).cacheProxies; + } else { + cacheProxies = new ConcurrentHashMap<Contextual<?>, Object>(); + } } } http://git-wip-us.apache.org/repos/asf/tomee/blob/e60f9234/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppInjectionResolver.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppInjectionResolver.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppInjectionResolver.java index 909ee6e..98c5a11 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppInjectionResolver.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebAppInjectionResolver.java @@ -35,7 +35,7 @@ public class WebAppInjectionResolver extends InjectionResolver { @Override public Set<Bean<?>> implResolveByType(final boolean delegate, final Type injectionPointType, final Class<?> injectinPointClass, final Annotation... qualifiers) { final Set<Bean<?>> set = super.implResolveByType(delegate, injectionPointType, injectinPointClass, qualifiers); - if (set.isEmpty()) { + if (set.isEmpty() && context.getParent() != null) { return context.getParent().getBeanManagerImpl().getInjectionResolver().implResolveByType(delegate, injectionPointType, injectinPointClass, qualifiers); } return set; http://git-wip-us.apache.org/repos/asf/tomee/blob/e60f9234/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java index c6a3b52..eacfc5d 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebappBeanManager.java @@ -21,6 +21,7 @@ import org.apache.openejb.util.reflection.Reflections; import org.apache.webbeans.component.BuiltInOwbBean; import org.apache.webbeans.component.ExtensionBean; import org.apache.webbeans.component.OwbBean; +import org.apache.webbeans.config.WebBeansContext; import org.apache.webbeans.container.BeanManagerImpl; import org.apache.webbeans.context.creational.CreationalContextImpl; import org.apache.webbeans.event.EventMetadataImpl; @@ -68,7 +69,10 @@ public class WebappBeanManager extends BeanManagerImpl { public void fireEvent(final Object event, final EventMetadataImpl metadata, final boolean isLifecycleEvent) { getNotificationManager().fireEvent(event, metadata, isLifecycleEvent); if (isEvent(event)) { - getParentBm().getNotificationManager().fireEvent(event, metadata, isLifecycleEvent); + final BeanManagerImpl parentBm = getParentBm(); + if (parentBm != null) { + parentBm.getNotificationManager().fireEvent(event, metadata, isLifecycleEvent); + } } } @@ -90,7 +94,10 @@ public class WebappBeanManager extends BeanManagerImpl { set.addAll(getNotificationManager().resolveObservers(event, metadata, false)); if (isEvent(event)) { - set.addAll(getParentBm().getNotificationManager().resolveObservers(event, metadata, false)); + final BeanManagerImpl parentBm = getParentBm(); + if (parentBm != null) { + set.addAll(parentBm.getNotificationManager().resolveObservers(event, metadata, false)); + } } // else nothing since extensions are loaded by classloader so we already have it return set; @@ -103,18 +110,22 @@ public class WebappBeanManager extends BeanManagerImpl { return null; } + final BeanManagerImpl parentBm = getParentBm(); final Boolean existing = USE_PARENT_BM.get(); if (existing != null && existing) { // shortcut the whole logic to keep the threadlocal set up correctly - return getParentBm().getInjectableReference(injectionPoint, ctx); + if (parentBm == null) { + return null; + } + return parentBm.getInjectableReference(injectionPoint, ctx); } // we can do it cause there is caching but we shouldn't - easy way to overide OWB actually final Bean<Object> injectedBean = (Bean<Object>)getInjectionResolver().getInjectionPointBean(injectionPoint); try { - if (injectedBean != null && injectedBean == getParentBm().getInjectionResolver().getInjectionPointBean(injectionPoint)) { + if (parentBm != null && injectedBean != null && injectedBean == parentBm.getInjectionResolver().getInjectionPointBean(injectionPoint)) { USE_PARENT_BM.set(true); try { - return getParentBm().getInjectableReference(injectionPoint, ctx); + return parentBm.getInjectableReference(injectionPoint, ctx); } finally { USE_PARENT_BM.remove(); } @@ -268,7 +279,8 @@ public class WebappBeanManager extends BeanManagerImpl { } public BeanManagerImpl getParentBm() { - return webappCtx.getParent().getBeanManagerImpl(); + final WebBeansContext parent = webappCtx.getParent(); + return parent != null ? parent.getBeanManagerImpl() : null; } @Override @@ -304,7 +316,7 @@ public class WebappBeanManager extends BeanManagerImpl { @Override public Bean<?> getPassivationCapableBean(final String id) { final Bean<?> bean = super.getPassivationCapableBean(id); - if (bean == null) { + if (bean == null && getParentBm() != null) { return getParentBm().getPassivationCapableBean(id); } return bean; @@ -318,9 +330,12 @@ public class WebappBeanManager extends BeanManagerImpl { private Set<Bean<?>> mergeBeans() { final Set<Bean<?>> allBeans = new CopyOnWriteArraySet<>(); // override parent one with a "webapp" bean list - for (final Bean<?> bean : getParentBm().getBeans()) { - if (filter.accept(bean)) { - allBeans.add(bean); + final BeanManagerImpl parentBm = getParentBm(); + if (parentBm != null) { + for (final Bean<?> bean : parentBm.getBeans()) { + if (filter.accept(bean)) { + allBeans.add(bean); + } } } allBeans.addAll(super.getBeans());
