throw new WebBeansDeploymentException(exception);
}
}
if (!specialized.getTypes().containsAll(superBean.getTypes()))
{
throw new DefinitionException("@Specialized Class : " + specializedClass.getName()
+ " must have all bean types of its super class");
}
webBeansContext.getBeanManagerImpl().getNotificationManager().disableOverriddenObservers(superClass);
// Recursively configure super class first if super class is also a special bean.
// So the name and bean meta data could be populated to this beanclass.
if (beanClasses.contains(superClass) && ((AbstractOwbBean<?>)superBean).isEnabled())
{
configureSpecializations(superClass, beanClasses);
}
if (!AnnotationUtil.hasClassAnnotation(specializedClass, Alternative.class))
{
//disable superbean if the current bean is not an alternative
((AbstractOwbBean<?>)superBean).setEnabled(false);
}
else if(altManager.isClassAlternative(specializedClass))
{
//disable superbean if the current bean is an enabled alternative
((AbstractOwbBean<?>)superBean).setEnabled(false);
}
AbstractOwbBean<?> comp = (AbstractOwbBean<?>)specialized;
if (comp.isSpecializedBean())
{
// This comp is already configured in previous invocation
// return directly, else Exception might be fired when set
// bean name again.
return;
}
//Check types of the beans
if(comp.getClass() != superBean.getClass())
{
throw new InconsistentSpecializationException("@Specialized Class : " + specializedClass.getName()
+ " and its super class may be the same type of bean,i.e, ManagedBean, SessionBean etc.");
}
if(superBean.getName() != null)
{
if (!superBean.getName().equals(comp.getName()))
{
throw new InconsistentSpecializationException("@Specialized Class : " + specializedClass.getName()
+ " may not explicitly declare a bean name");
}
}
comp.setSpecializedBean(true);
final Map<Class<?>, ProducerMethodBean<?>> parentProducers = new HashMap<Class<?>, ProducerMethodBean<?>>();
final Map<Class<?>, ProducerMethodBean<?>> beanProducers = new HashMap<Class<?>, ProducerMethodBean<?>>();
for (Bean<?> bean: webBeansContext.getBeanManagerImpl().getComponents())
{
if (bean instanceof ProducerMethodBean)
{
final ProducerMethodBean<?> producerBean = (ProducerMethodBean<?>)bean;
final Class<?> returnType = producerBean.getReturnType();
if (producerBean.getBeanClass() == superBean.getBeanClass() && producerBean.getProducer() instanceof ProducerMethodProducer)
{
final ProducerMethodProducer<?, ?> producer = (ProducerMethodProducer<?, ?>) producerBean.getProducer();
producer.specializeBy((Bean) comp);
if (beanProducers.keySet().contains(returnType))
{
beanProducers.get(returnType).setSpecializedBean(true);
}
else
{
parentProducers.put(returnType, producerBean);
}
}
else if (specializedClass == bean.getBeanClass())
{
if (parentProducers.keySet().contains(returnType))
{
producerBean.setSpecializedBean(true);
}
else
{
beanProducers.put(returnType, producerBean);
}
}
}
}
}
else
{
throw new DefinitionException("WebBean component class : " + specializedClass.getName()
+ " is not enabled for specialized by the " + specializedClass + " class");
}
}
}