All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.infinispan.cdi.util.defaultbean.DefaultObserverMethod Maven / Gradle / Ivy

There is a newer version: 9.1.7.Final
Show newest version
package org.infinispan.cdi.util.defaultbean;

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Set;

import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.ObserverMethod;

import org.infinispan.cdi.util.ForwardingObserverMethod;
import org.infinispan.cdi.util.InjectableMethod;
import org.infinispan.cdi.util.ParameterValueRedefiner;

class DefaultObserverMethod extends ForwardingObserverMethod {

    private final ObserverMethod originalObserverMethod;
    private final InjectableMethod observerMethod;
    private final BeanManager beanManager;
    private final Type declaringBeanType;
    private final Annotation[] declaringBeanQualifiers;
    private final Set qualifiers;

    private static final Annotation[] EMPTY_QUALIFIER_ARRAY = {};

    static  DefaultObserverMethod of(ObserverMethod originalObserverMethod, AnnotatedMethod observerMethod, Set declaringBeanQualifiers, Set qualifiers, Bean defaultBean, BeanManager beanManager) {
        return new DefaultObserverMethod(originalObserverMethod, observerMethod, declaringBeanQualifiers, qualifiers, defaultBean, beanManager);
    }

    DefaultObserverMethod(ObserverMethod originalObserverMethod, AnnotatedMethod observerMethod, Set declaringBeanQualifiers, Set qualifiers, Bean defaultBean, BeanManager beanManager) {
        this.originalObserverMethod = originalObserverMethod;
        this.observerMethod = new InjectableMethod(observerMethod, defaultBean, beanManager);
        this.beanManager = beanManager;
        this.declaringBeanQualifiers = declaringBeanQualifiers.toArray(EMPTY_QUALIFIER_ARRAY);
        this.declaringBeanType = originalObserverMethod.getBeanClass();
        this.qualifiers = qualifiers;
    }

    @Override
    protected ObserverMethod delegate() {
        return originalObserverMethod;
    }

    @Override
    public Set getObservedQualifiers() {
        return qualifiers;
    }

    @Override
    public void notify(final T event) {
        Bean declaringBean = beanManager.resolve(beanManager.getBeans(declaringBeanType, declaringBeanQualifiers));
        final CreationalContext creationalContext = createCreationalContext(declaringBean);
        try {
            Object instance = beanManager.getReference(declaringBean, declaringBeanType, creationalContext);
            if (instance == null) {
                return;
            }
            observerMethod.invoke(instance, creationalContext, new ParameterValueRedefiner() {

                public Object redefineParameterValue(ParameterValue value) {
                    if (value.getInjectionPoint().getAnnotated().isAnnotationPresent(Observes.class)) {
                        return event;
                    } else {
                        return value.getDefaultValue(creationalContext);
                    }
                }
            });

        } finally {
            // Generic beans are always dependent scoped
            if (creationalContext != null) {
                creationalContext.release();
            }
        }

    }

    private CreationalContext createCreationalContext(Bean declaringBean) {
        if (getReception().equals(Reception.ALWAYS)) {
            return beanManager.createCreationalContext(declaringBean);
        } else {
            return null;
        }
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof DefaultObserverMethod) {
            DefaultObserverMethod that = (DefaultObserverMethod) obj;
            return this.delegate().equals(that.delegate()) && this.getObservedType().equals(that.getObservedType()) && this.getObservedQualifiers().equals(that.getObservedQualifiers());
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        int hash = 2;
        hash = 31 * hash + this.getObservedType().hashCode();
        hash = 31 * hash + this.getObservedQualifiers().hashCode();
        return hash;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy