@SuppressWarnings("PMD.DoubleCheckedLocking") @Override public BeanManagerImpl getBeanManagerImpl() { if (bm == null) { // should be done in the constructor synchronized (this) { if (bm == null) { bm = new WebappBeanManager(this); } } } return bm; }
protected void afterStartApplication(final Object startupObject) { if (WebappBeanManager.class.isInstance(beanManager)) { WebappBeanManager.class.cast(beanManager).afterStart(); } }
@Override public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(final T event, final EventMetadataImpl metadata) { final Set<ObserverMethod<? super T>> set = new HashSet<>(); set.addAll(getNotificationManager().resolveObservers(event, metadata, false)); if (isEvent(event)) { 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; }
@Override public Bean<?> getPassivationCapableBean(final String id) { final Bean<?> bean = super.getPassivationCapableBean(id); if (bean == null && getParentBm() != null) { return getParentBm().getPassivationCapableBean(id); } return bean; }
@Override public Object getInjectableReference(final InjectionPoint injectionPoint, final CreationalContext<?> ctx) { Asserts.assertNotNull(injectionPoint, "injectionPoint parameter"); if(injectionPoint == null) { 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 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 (parentBm != null && injectedBean != null && injectedBean == parentBm.getInjectionResolver().getInjectionPointBean(injectionPoint)) { USE_PARENT_BM.set(true); try { return parentBm.getInjectableReference(injectionPoint, ctx); } finally { USE_PARENT_BM.remove(); } } } catch (final UnsatisfiedResolutionException ure) { // skip, use this bean } return super.getInjectableReference(injectionPoint, ctx); }
public void afterStart() { started = true; deploymentBeans = mergeBeans(); webappCtx.getBeanManagerImpl().getInjectionResolver().clearCaches(); // to force new resolution with new beans }
WebappBeanManager.class.cast(beanManager).beforeStop();
private boolean hasBean(final String id) { return beanManager.getPassivationCapableBean(id) != null; } }
@Override public boolean accept(final Bean<?> bean) { if (BuiltInOwbBean.class.isInstance(bean) || ExtensionBean.class.isInstance(bean)) { return false; } if (OwbBean.class.isInstance(bean)) { final OwbBean owbBean = OwbBean.class.cast(bean); if (owbBean.isPassivationCapable()) { if (hasBean(owbBean.getId())) { return false; } } } else if (PassivationCapable.class.isInstance(bean)) { if (hasBean(PassivationCapable.class.cast(bean).getId())) { return false; } } final Set<Annotation> qualifiers = bean.getQualifiers(); return beanManager.getBeans( bean.getBeanClass(), qualifiers.isEmpty() ? EMPTY_ANNOTATIONS : qualifiers.toArray(new Annotation[qualifiers.size()])).isEmpty(); }
@Override public List<Interceptor<?>> resolveInterceptors(final InterceptionType type, final Annotation... interceptorBindings) { final List<Interceptor<?>> interceptors = super.resolveInterceptors(type, interceptorBindings); final List<Interceptor<?>> parentInterceptors = getParentBm().resolveInterceptors(type, interceptorBindings); for (final Interceptor<?> i : parentInterceptors) { if (!interceptors.contains(i)) { interceptors.add(i); } } return interceptors; }
public void afterStart() { started = true; deploymentBeans = mergeBeans(); webappCtx.getBeanManagerImpl().getInjectionResolver().clearCaches(); // to force new resolution with new beans }
WebappBeanManager.class.cast(beanManager).beforeStop();
@Override public void fireEvent(final Object event, final EventMetadataImpl metadata, final boolean isLifecycleEvent) { getNotificationManager().fireEvent(event, metadata, isLifecycleEvent); if (isEvent(event)) { final BeanManagerImpl parentBm = getParentBm(); if (parentBm != null) { parentBm.getNotificationManager().fireEvent(event, metadata, isLifecycleEvent); } } }
private Set<Bean<?>> mergeBeans() { final Set<Bean<?>> allBeans = new CopyOnWriteArraySet<Bean<?>>(); // override parent one with a "webapp" bean list for (final Bean<?> bean : getParentBm().getBeans()) { if (InheritedBeanFilter.INSTANCE.accept(bean)) { allBeans.add(bean); } } allBeans.addAll(super.getBeans()); return allBeans; }
@SuppressWarnings("PMD.DoubleCheckedLocking") @Override public BeanManagerImpl getBeanManagerImpl() { if (bm == null) { // should be done in the constructor synchronized (this) { if (bm == null) { bm = new WebappBeanManager(this); } } } return bm; }
((WebappBeanManager) beanManager).afterStart();
@Override public void fireEvent(final Object event, final EventMetadata metadata, final boolean isLifecycleEvent) { final Class<?> eventClass = event.getClass(); if (ClassUtil.isDefinitionContainsTypeVariables(ClassUtil.getClass(metadata.getType()))) { throw new IllegalArgumentException("Event class : " + event.getClass().getName() + " can not be defined as generic type"); } getNotificationManager().fireEvent(event, metadata, isLifecycleEvent); if (isEvent(eventClass)) { getParentBm().getNotificationManager().fireEvent(event, metadata, isLifecycleEvent); } }
@Override public Context getContext(final Class<? extends Annotation> scope) { try { return super.getContext(scope); } catch (final RuntimeException e) { try { return getParentBm().getContext(scope); } catch (final RuntimeException ignored) { throw e; } } }
@Override public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(final T event, final EventMetadata metadata) { final Class<?> eventClass = event.getClass(); if (ClassUtil.isDefinitionContainsTypeVariables(ClassUtil.getClass(metadata.getType()))) { throw new IllegalArgumentException("Event type can not contain type variables. Event class is : " + eventClass); } final Set<ObserverMethod<? super T>> set = new HashSet<ObserverMethod<? super T>>(); set.addAll(getNotificationManager().resolveObservers(event, metadata)); if (isEvent(eventClass)) { set.addAll(getParentBm().getNotificationManager().resolveObservers(event, metadata)); } // else nothing since extensions are loaded by classloader so we already have it return set; }
@Override public boolean isStereotype(final Class<? extends Annotation> annotationType) { try { return super.isStereotype(annotationType); } catch (final RuntimeException e) { try { return getParentBm().isStereotype(annotationType); } catch (final RuntimeException ignored) { throw e; } } }