/*
* JBoss, Home of Professional Open Source
* Copyright 2013, 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.lifecycle.atd;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.literal.InjectLiteral;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.AfterTypeDiscovery;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.enterprise.inject.spi.ProcessProducer;
import org.jboss.cdi.tck.tests.extensions.lifecycle.atd.lib.Bar;
import org.jboss.cdi.tck.tests.extensions.lifecycle.atd.lib.Baz;
import org.jboss.cdi.tck.tests.extensions.lifecycle.atd.lib.Boss;
import org.jboss.cdi.tck.tests.extensions.lifecycle.atd.lib.Foo;
import org.jboss.cdi.tck.tests.extensions.lifecycle.atd.lib.Pro;
/**
* @author Martin Kouba
* @author Tomas Remes
*/
public class AfterTypeDiscoveryObserver implements Extension {
private List<Class<?>> interceptors = null;
private List<Class<?>> alternatives = null;
private List<Class<?>> decorators = null;
private boolean bossObserved = false;
private boolean processProducerEventFiredForProducerMethod = false;
private boolean processProducerEventFiredForProducerField = false;
private DeltaAlternativeBean deltaAlternative = new DeltaAlternativeBean();
private DeltaInterceptorBean deltaInterceptor = new DeltaInterceptorBean();
private DeltaDecoratorBean deltaDecorator;
public void observeAfterTypeDiscovery(@Observes AfterTypeDiscovery event, BeanManager beanManager) {
event.getAlternatives().add(DeltaAlternative.class);
event.getInterceptors().add(DeltaInterceptor.class);
event.getDecorators().add(DeltaDecorator.class);
interceptors = Collections.unmodifiableList(new ArrayList<Class<?>>(event.getInterceptors()));
alternatives = Collections.unmodifiableList(new ArrayList<Class<?>>(event.getAlternatives()));
decorators = Collections.unmodifiableList(new ArrayList<Class<?>>(event.getDecorators()));
event.addAnnotatedType(beanManager.createAnnotatedType(Boss.class), AfterTypeDiscoveryObserver.class.getName());
// Bravo interceptor removed
for (Iterator<Class<?>> iterator = event.getInterceptors().iterator(); iterator.hasNext(); ) {
if (BravoInterceptor.class.equals(iterator.next())) {
iterator.remove();
}
}
// The order of decorators reverted
Collections.reverse(event.getDecorators());
// Remove first alternative - AlphaAlternative
event.getAlternatives().remove(0);
// add Baz annotatedType via AnnotatedTypeConfigurator
event.addAnnotatedType(Baz.class, AfterTypeDiscoveryObserver.class.getName() + ":" + Baz.class.getName())
.add(Pro.ProLiteral.INSTANCE)
.add(RequestScoped.Literal.INSTANCE)
.filterFields(annotatedField -> annotatedField.getJavaMember().getType().equals(Instance.class)).findFirst().get()
.add(InjectLiteral.INSTANCE)
.add(Pro.ProLiteral.INSTANCE);
}
public void observeAfterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager beanManager) {
AnnotatedType<DeltaDecorator> type = beanManager.createAnnotatedType(DeltaDecorator.class);
deltaDecorator = new DeltaDecoratorBean(type.getFields().iterator().next(), beanManager);
event.addBean(deltaAlternative);
event.addBean(deltaInterceptor);
event.addBean(deltaDecorator);
}
public void observeProcessAnnotatedType(@Observes ProcessAnnotatedType<DeltaDecorator> event) {
event.veto();
}
public void observeBossAnnotatedType(@Observes ProcessAnnotatedType<Boss> event) {
bossObserved = true;
}
public void observeProcessProducerForProducerField(@Observes ProcessProducer<Boss, Foo> event) {
processProducerEventFiredForProducerField = true;
}
public void observeProcessProducerForProducerMethod(@Observes ProcessProducer<Boss, Bar> event) {
processProducerEventFiredForProducerMethod = true;
}
public List<Class<?>> getInterceptors() {
return interceptors;
}
public List<Class<?>> getAlternatives() {
return alternatives;
}
public List<Class<?>> getDecorators() {
return decorators;
}
public boolean isBossObserved() {
return bossObserved;
}
public boolean isProcessProcuderFieldObserved() {
return processProducerEventFiredForProducerField;
}
public boolean isProcessProcuderMethodObserved() {
return processProducerEventFiredForProducerMethod;
}
}