Search in sources :

Example 11 with AnnotationMetadataHierarchy

use of io.micronaut.inject.annotation.AnnotationMetadataHierarchy in project micronaut-core by micronaut-projects.

the class BeanDefinitionWriter method isInterceptedLifeCycleByType.

private boolean isInterceptedLifeCycleByType(AnnotationMetadata annotationMetadata, String interceptType) {
    return isLifeCycleCache.computeIfAbsent(interceptType, s -> {
        if (this.beanTypeElement.isAssignable("io.micronaut.aop.Interceptor")) {
            // interceptor beans cannot have lifecycle methods intercepted
            return false;
        }
        final Element originatingElement = getOriginatingElements()[0];
        final boolean isFactoryMethod = (originatingElement instanceof MethodElement && !(originatingElement instanceof ConstructorElement));
        final boolean isProxyTarget = annotationMetadata.booleanValue(AnnotationUtil.ANN_AROUND, "proxyTarget").orElse(false) || isFactoryMethod;
        // for beans that are @Around(proxyTarget=false) only the generated AOP impl should be intercepted
        final boolean isAopType = StringUtils.isNotEmpty(interceptedType);
        final boolean isConstructorInterceptionCandidate = (isProxyTarget && !isAopType) || (isAopType && !isProxyTarget);
        final boolean hasAroundConstruct;
        final AnnotationValue<Annotation> interceptorBindings = annotationMetadata.getAnnotation(AnnotationUtil.ANN_INTERCEPTOR_BINDINGS);
        List<AnnotationValue<Annotation>> interceptorBindingAnnotations;
        if (interceptorBindings != null) {
            interceptorBindingAnnotations = interceptorBindings.getAnnotations(AnnotationMetadata.VALUE_MEMBER);
            hasAroundConstruct = interceptorBindingAnnotations.stream().anyMatch(av -> av.stringValue("kind").map(k -> k.equals(interceptType)).orElse(false));
        } else {
            interceptorBindingAnnotations = Collections.emptyList();
            hasAroundConstruct = false;
        }
        if (isConstructorInterceptionCandidate) {
            return hasAroundConstruct;
        } else if (hasAroundConstruct) {
            AnnotationMetadata typeMetadata = annotationMetadata;
            if (!isSuperFactory && typeMetadata instanceof AnnotationMetadataHierarchy) {
                typeMetadata = ((AnnotationMetadataHierarchy) typeMetadata).getRootMetadata();
                final AnnotationValue<Annotation> av = typeMetadata.getAnnotation(AnnotationUtil.ANN_INTERCEPTOR_BINDINGS);
                if (av != null) {
                    interceptorBindingAnnotations = av.getAnnotations(AnnotationMetadata.VALUE_MEMBER);
                } else {
                    interceptorBindingAnnotations = Collections.emptyList();
                }
            }
            // if no other AOP advice is applied
            return interceptorBindingAnnotations.stream().noneMatch(av -> av.stringValue("kind").map(k -> k.equals("AROUND")).orElse(false));
        } else {
            return false;
        }
    });
}
Also used : ConstructorElement(io.micronaut.inject.ast.ConstructorElement) Bindable(io.micronaut.core.bind.annotation.Bindable) Arrays(java.util.Arrays) DefaultBeanContext(io.micronaut.context.DefaultBeanContext) Internal(io.micronaut.core.annotation.Internal) VISITORS(io.micronaut.inject.visitor.BeanElementVisitor.VISITORS) InstantiationUtils(io.micronaut.core.reflect.InstantiationUtils) Duration(java.time.Duration) Map(java.util.Map) PropertyMetadata(io.micronaut.inject.configuration.PropertyMetadata) Property(io.micronaut.context.annotation.Property) AnnotationMetadataWriter(io.micronaut.inject.annotation.AnnotationMetadataWriter) AnnotationMetadataHierarchy(io.micronaut.inject.annotation.AnnotationMetadataHierarchy) Provided(io.micronaut.context.annotation.Provided) Singleton(jakarta.inject.Singleton) Set(java.util.Set) Bean(io.micronaut.context.annotation.Bean) Stream(java.util.stream.Stream) AnnotationValue(io.micronaut.core.annotation.AnnotationValue) ProxyBeanDefinition(io.micronaut.inject.ProxyBeanDefinition) MethodElement(io.micronaut.inject.ast.MethodElement) SignatureVisitor(org.objectweb.asm.signature.SignatureVisitor) EachProperty(io.micronaut.context.annotation.EachProperty) BeanFactory(io.micronaut.inject.BeanFactory) MutableAnnotationMetadata(io.micronaut.inject.annotation.MutableAnnotationMetadata) JavaModelUtils(io.micronaut.inject.processing.JavaModelUtils) ClassWriter(org.objectweb.asm.ClassWriter) BeanRegistration(io.micronaut.context.BeanRegistration) Parameter(io.micronaut.context.annotation.Parameter) AnnotationMetadataProvider(io.micronaut.core.annotation.AnnotationMetadataProvider) AbstractExecutableMethod(io.micronaut.context.AbstractExecutableMethod) Qualifier(io.micronaut.context.Qualifier) Toggleable(io.micronaut.core.util.Toggleable) DefaultAnnotationMetadata(io.micronaut.inject.annotation.DefaultAnnotationMetadata) ConstructorElement(io.micronaut.inject.ast.ConstructorElement) Constructor(java.lang.reflect.Constructor) TreeSet(java.util.TreeSet) ParameterElement(io.micronaut.inject.ast.ParameterElement) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) TypedElement(io.micronaut.inject.ast.TypedElement) ConfigurationProperties(io.micronaut.context.annotation.ConfigurationProperties) AbstractConstructorInjectionPoint(io.micronaut.context.AbstractConstructorInjectionPoint) Nullable(io.micronaut.core.annotation.Nullable) BeanElement(io.micronaut.inject.ast.beans.BeanElement) Argument(io.micronaut.core.type.Argument) IOException(java.io.IOException) VisitorContext(io.micronaut.inject.visitor.VisitorContext) AnnotationValueBuilder(io.micronaut.core.annotation.AnnotationValueBuilder) BeanDefinition(io.micronaut.inject.BeanDefinition) ValidatedBeanDefinition(io.micronaut.inject.ValidatedBeanDefinition) ElementQuery(io.micronaut.inject.ast.ElementQuery) BeanElementVisitor(io.micronaut.inject.visitor.BeanElementVisitor) MethodVisitor(org.objectweb.asm.MethodVisitor) BeanElementVisitorContext(io.micronaut.inject.visitor.BeanElementVisitorContext) BeanContext(io.micronaut.context.BeanContext) ArrayUtils(io.micronaut.core.util.ArrayUtils) FieldElement(io.micronaut.inject.ast.FieldElement) ConfigurationInject(io.micronaut.context.annotation.ConfigurationInject) Type(org.objectweb.asm.Type) ExecutableMethodsDefinition(io.micronaut.inject.ExecutableMethodsDefinition) DefaultScope(io.micronaut.context.annotation.DefaultScope) EachBean(io.micronaut.context.annotation.EachBean) ConfigurationBuilder(io.micronaut.context.annotation.ConfigurationBuilder) Locale(java.util.Locale) BeanResolutionContext(io.micronaut.context.BeanResolutionContext) NameUtils(io.micronaut.core.naming.NameUtils) AbstractInitializableBeanDefinition(io.micronaut.context.AbstractInitializableBeanDefinition) ClassVisitor(org.objectweb.asm.ClassVisitor) Method(java.lang.reflect.Method) AnyQualifier(io.micronaut.inject.qualifiers.AnyQualifier) ClassUtils(io.micronaut.core.reflect.ClassUtils) ConstructorInjectionPoint(io.micronaut.inject.ConstructorInjectionPoint) DefaultArgument(io.micronaut.core.type.DefaultArgument) Predicate(java.util.function.Predicate) Collection(java.util.Collection) Qualifiers(io.micronaut.inject.qualifiers.Qualifiers) Collectors(java.util.stream.Collectors) DisposableBeanDefinition(io.micronaut.inject.DisposableBeanDefinition) StringUtils(io.micronaut.core.util.StringUtils) List(java.util.List) AnnotationUtil(io.micronaut.core.annotation.AnnotationUtil) BeanElementBuilder(io.micronaut.inject.ast.beans.BeanElementBuilder) Annotation(java.lang.annotation.Annotation) Optional(java.util.Optional) NotNull(org.jetbrains.annotations.NotNull) BeanConstructor(io.micronaut.core.beans.BeanConstructor) Label(org.objectweb.asm.Label) ClassElement(io.micronaut.inject.ast.ClassElement) HashMap(java.util.HashMap) PrimitiveElement(io.micronaut.inject.ast.PrimitiveElement) ExecutableMethod(io.micronaut.inject.ExecutableMethod) HashSet(java.util.HashSet) Primary(io.micronaut.context.annotation.Primary) PropertyElement(io.micronaut.inject.ast.PropertyElement) Repeatable(java.lang.annotation.Repeatable) InitializingBeanDefinition(io.micronaut.inject.InitializingBeanDefinition) Any(io.micronaut.context.annotation.Any) ConfigurationReader(io.micronaut.context.annotation.ConfigurationReader) OutputStream(java.io.OutputStream) TypeVariableResolver(io.micronaut.core.type.TypeVariableResolver) Element(io.micronaut.inject.ast.Element) Iterator(java.util.Iterator) AdvisedBeanType(io.micronaut.inject.AdvisedBeanType) Value(io.micronaut.context.annotation.Value) MemberElement(io.micronaut.inject.ast.MemberElement) ReflectionUtils(io.micronaut.core.reflect.ReflectionUtils) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) NonNull(io.micronaut.core.annotation.NonNull) ParametrizedBeanFactory(io.micronaut.inject.ParametrizedBeanFactory) PropertySource(io.micronaut.context.annotation.PropertySource) CollectionUtils(io.micronaut.core.util.CollectionUtils) ConfigurationMetadataBuilder(io.micronaut.inject.configuration.ConfigurationMetadataBuilder) InjectScope(io.micronaut.context.annotation.InjectScope) AnnotationMetadata(io.micronaut.core.annotation.AnnotationMetadata) Comparator(java.util.Comparator) Collections(java.util.Collections) MethodElement(io.micronaut.inject.ast.MethodElement) ConstructorElement(io.micronaut.inject.ast.ConstructorElement) ParameterElement(io.micronaut.inject.ast.ParameterElement) TypedElement(io.micronaut.inject.ast.TypedElement) BeanElement(io.micronaut.inject.ast.beans.BeanElement) FieldElement(io.micronaut.inject.ast.FieldElement) ClassElement(io.micronaut.inject.ast.ClassElement) PrimitiveElement(io.micronaut.inject.ast.PrimitiveElement) PropertyElement(io.micronaut.inject.ast.PropertyElement) Element(io.micronaut.inject.ast.Element) MemberElement(io.micronaut.inject.ast.MemberElement) MethodElement(io.micronaut.inject.ast.MethodElement) AnnotationValue(io.micronaut.core.annotation.AnnotationValue) AnnotationMetadataHierarchy(io.micronaut.inject.annotation.AnnotationMetadataHierarchy) Annotation(java.lang.annotation.Annotation) MutableAnnotationMetadata(io.micronaut.inject.annotation.MutableAnnotationMetadata) DefaultAnnotationMetadata(io.micronaut.inject.annotation.DefaultAnnotationMetadata) AnnotationMetadata(io.micronaut.core.annotation.AnnotationMetadata)

Example 12 with AnnotationMetadataHierarchy

use of io.micronaut.inject.annotation.AnnotationMetadataHierarchy in project micronaut-core by micronaut-projects.

the class AbstractAnnotationMetadataWriter method initializeAnnotationMetadata.

/**
 * @param staticInit  The {@link GeneratorAdapter}
 * @param classWriter The {@link ClassWriter}
 * @param defaults    The annotation defaults
 */
protected void initializeAnnotationMetadata(GeneratorAdapter staticInit, ClassWriter classWriter, Map<String, Integer> defaults) {
    Type annotationMetadataType = Type.getType(AnnotationMetadata.class);
    classWriter.visitField(ACC_PUBLIC | ACC_FINAL | ACC_STATIC, FIELD_ANNOTATION_METADATA, annotationMetadataType.getDescriptor(), null, null);
    if (annotationMetadata instanceof DefaultAnnotationMetadata) {
        AnnotationMetadataWriter.instantiateNewMetadata(targetClassType, classWriter, staticInit, (DefaultAnnotationMetadata) annotationMetadata, defaults, loadTypeMethods);
    } else if (annotationMetadata instanceof AnnotationMetadataHierarchy) {
        AnnotationMetadataWriter.instantiateNewMetadataHierarchy(targetClassType, classWriter, staticInit, (AnnotationMetadataHierarchy) annotationMetadata, defaults, loadTypeMethods);
    } else {
        staticInit.getStatic(Type.getType(AnnotationMetadata.class), "EMPTY_METADATA", Type.getType(AnnotationMetadata.class));
    }
    staticInit.putStatic(targetClassType, FIELD_ANNOTATION_METADATA, annotationMetadataType);
}
Also used : Type(org.objectweb.asm.Type) DefaultAnnotationMetadata(io.micronaut.inject.annotation.DefaultAnnotationMetadata) AnnotationMetadataHierarchy(io.micronaut.inject.annotation.AnnotationMetadataHierarchy)

Aggregations

AnnotationMetadataHierarchy (io.micronaut.inject.annotation.AnnotationMetadataHierarchy)12 ClassElement (io.micronaut.inject.ast.ClassElement)7 AnnotationMetadata (io.micronaut.core.annotation.AnnotationMetadata)5 AnnotationValue (io.micronaut.core.annotation.AnnotationValue)4 DefaultAnnotationMetadata (io.micronaut.inject.annotation.DefaultAnnotationMetadata)4 BeanDefinitionWriter (io.micronaut.inject.writer.BeanDefinitionWriter)4 Type (org.objectweb.asm.Type)4 Internal (io.micronaut.core.annotation.Internal)3 NonNull (io.micronaut.core.annotation.NonNull)3 Argument (io.micronaut.core.type.Argument)3 ParameterElement (io.micronaut.inject.ast.ParameterElement)3 BeanRegistration (io.micronaut.context.BeanRegistration)2 DefaultBeanContext (io.micronaut.context.DefaultBeanContext)2 Nullable (io.micronaut.core.annotation.Nullable)2 CollectionUtils (io.micronaut.core.util.CollectionUtils)2 AdvisedBeanType (io.micronaut.inject.AdvisedBeanType)2 MutableAnnotationMetadata (io.micronaut.inject.annotation.MutableAnnotationMetadata)2 Collection (java.util.Collection)2 Collections (java.util.Collections)2 HashSet (java.util.HashSet)2