/*
* JBoss, Home of Professional Open Source
* Copyright 2016, Red Hat, Inc., and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.cdi.tck.tests.extensions.configurators.observerMethod;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.enterprise.event.TransactionPhase;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ObserverMethod;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.enterprise.inject.spi.ProcessObserverMethod;
public class AfterBeanDiscoveryObserver implements Extension {
private ObserverMethod<Fruit> fruitObserverMethod;
public static AtomicBoolean newBananaObserverNotified = new AtomicBoolean(false);
public static AtomicBoolean newMelonObserverNotified = new AtomicBoolean(false);
public static AtomicBoolean newPeachObserverNotified = new AtomicBoolean(false);
public static AtomicBoolean newPapayaObserverNotified = new AtomicBoolean(false);
AnnotatedMethod<? super FruitObserver> peachObserver;
void processAnnotatedType(@Observes ProcessAnnotatedType<FruitObserver> pat) {
peachObserver = pat.getAnnotatedType().getMethods().stream()
.filter(annotatedMethod -> annotatedMethod.getJavaMember().getName().equals("observesPeach")).findAny().get();
}
void processObserverMethod(@Observes ProcessObserverMethod<Fruit, FruitObserver> event) {
fruitObserverMethod = event.getObserverMethod();
}
void observesABD(@Observes AfterBeanDiscovery abd) throws NoSuchMethodException {
// read from ObserverMethod
abd.<Fruit>addObserverMethod().read(fruitObserverMethod).beanClass(FruitObserver.class).observedType(Banana.class)
.addQualifiers(Ripe.RipeLiteral.INSTANCE, Any.Literal.INSTANCE)
.notifyWith((b) -> {
newBananaObserverNotified.set(true);
});
// read from Method
Method melonMethod = FruitObserver.class.getMethod("observesMelon", Melon.class);
abd.addObserverMethod().read(melonMethod).observedType(Melon.class).notifyWith(m -> {
newMelonObserverNotified.set(true);
});
// read from AnnotatedMethod
abd.addObserverMethod().read(peachObserver).beanClass(FruitObserver.class).observedType(Peach.class).notifyWith((a) -> {
newPeachObserverNotified.set(true);
});
abd.addObserverMethod(new ObserverMethod<Cherry>() {
@Override
public Class<?> getBeanClass() {
return FruitObserver.class;
}
@Override
public Type getObservedType() {
return Cherry.class;
}
@Override
public Set<Annotation> getObservedQualifiers() {
return Collections.emptySet();
}
@Override
public Reception getReception() {
return Reception.ALWAYS;
}
@Override
public TransactionPhase getTransactionPhase() {
return TransactionPhase.IN_PROGRESS;
}
@Override
public void notify(Cherry cherry) {
}
});
abd.addObserverMethod().observedType(Papaya.class).reception(Reception.ALWAYS).notifyWith(eventContext -> newPapayaObserverNotified.set(true));
}
public static void reset() {
newMelonObserverNotified.set(false);
newBananaObserverNotified.set(false);
newPeachObserverNotified.set(false);
}
}