in webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanAttributesBuilder.java [301:398]
protected void defineScope(Class<?> declaringClass, boolean onlyScopedBeans, String errorMessage)
{
Annotation[] annotations = AnnotationUtil.asArray(annotated.getAnnotations());
boolean found = false;
List<ExternalScope> additionalScopes = webBeansContext.getBeanManagerImpl().getAdditionalScopes();
for (Annotation annotation : annotations)
{
if (declaringClass != null && AnnotationUtil.getDeclaringClass(annotation, declaringClass) != null && !AnnotationUtil.isDeclaringClass(declaringClass, annotation))
{
continue;
}
Class<? extends Annotation> annotationType = annotation.annotationType();
if (!webBeansContext.getBeanManagerImpl().isScope(annotationType))
{
continue;
}
/*Normal scope*/
Annotation var = annotationType.getAnnotation(NormalScope.class);
/*Pseudo scope*/
Annotation pseudo = annotationType.getAnnotation(Scope.class);
if (var == null && pseudo == null)
{
// check for additional scopes registered via a CDI Extension
for (ExternalScope additionalScope : additionalScopes)
{
if (annotationType.equals(additionalScope.getScope()))
{
// create a proxy which implements the given annotation
Annotation scopeAnnotation = additionalScope.getScopeAnnotation();
if (additionalScope.isNormal())
{
var = scopeAnnotation;
}
else
{
pseudo = scopeAnnotation;
}
}
}
}
if (var != null)
{
if(pseudo != null)
{
throw new WebBeansConfigurationException("Not to define both @Scope and @NormalScope on bean : " + ClassUtil.getClass(annotated.getBaseType()).getName());
}
if (found)
{
throw new WebBeansConfigurationException(errorMessage);
}
found = true;
scope = annotation.annotationType();
}
else
{
if(pseudo != null)
{
if (found)
{
throw new WebBeansConfigurationException(errorMessage);
}
found = true;
scope = annotation.annotationType();
}
}
}
if (found && annotated.getAnnotation(Interceptor.class) != null && scope != Dependent.class)
{
throw new WebBeansConfigurationException("An Interceptor must declare any other Scope than @Dependent: " + ClassUtil.getClass(annotated.getBaseType()).getName());
}
if (found && annotated.getAnnotation(Decorator.class) != null && scope != Dependent.class)
{
throw new WebBeansConfigurationException("A Decorator must declare any other Scope than @Dependent: " + ClassUtil.getClass(annotated.getBaseType()).getName());
}
if (!found && declaringClass != null && !hasDeclaredNonInheritedScope(declaringClass))
{
defineScope(declaringClass.getSuperclass(), onlyScopedBeans, errorMessage);
}
else if (!found)
{
defineDefaultScope(errorMessage, onlyScopedBeans);
}
}