package org.jboss.resteasy.test.cdi.extensions.resource;
import org.jboss.logging.Logger;
import org.jboss.resteasy.test.cdi.util.Utilities;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.InjectionTarget;
import javax.ws.rs.Path;
import javax.ws.rs.ext.Provider;
/**
* A BostonBean is just like other beans, only much, much better.
*
* BostonBeans are handled by the CDI extension BostonBeanExtension, and are implemented by classes
* annotated with @Boston.
*/
public class CDIExtensionsBostonBean<T> implements Bean<T> {
private static Logger log = Logger.getLogger(CDIExtensionsBostonBean.class);
private Class<T> clazz;
private String className;
private InjectionTarget<T> injectionTarget;
private Set<Type> types;
private Set<Annotation> qualifiers;
private Class<? extends Annotation> scope;
private Set<InjectionPoint> injectionPoints;
public CDIExtensionsBostonBean(final Class<T> clazz, final InjectionTarget<T> injectionTarget) {
this.clazz = clazz;
this.className = clazz.getSimpleName();
this.injectionTarget = injectionTarget;
types = Utilities.getTypeClosure(clazz);
qualifiers = Utilities.getQualifiers(clazz);
injectionPoints = injectionTarget.getInjectionPoints();
scope = Utilities.getScopeAnnotation(clazz);
if (scope == null) {
if (Utilities.isAnnotationPresent(clazz, Path.class)) {
scope = RequestScoped.class;
} else if (Utilities.isAnnotationPresent(clazz, Provider.class)) {
scope = ApplicationScoped.class;
} else {
scope = RequestScoped.class;
}
}
}
@Override
public T create(CreationalContext<T> creationalContext) {
log.info("BostonBean[" + className + "].create()");
T instance = injectionTarget.produce(creationalContext);
log.info("BostonBean[" + className + "].create() raw instance: " + instance);
injectionTarget.inject(instance, creationalContext);
injectionTarget.postConstruct(instance);
log.info("BostonBean[" + className + "].create(): cooked instance: " + instance);
return instance;
}
@Override
public void destroy(T instance, CreationalContext<T> creationalContext) {
log.info("BostonBean[" + className + "].destroy()");
creationalContext.release();
}
@Override
public Set<Type> getTypes() {
log.info("BostonBean[" + className + "].getTypes()");
return types;
}
@Override
public Set<Annotation> getQualifiers() {
log.info("BostonBean[" + className + "].getQualifiers()");
return qualifiers;
}
@Override
public Class<? extends Annotation> getScope() {
log.info("BostonBean[" + className + "].getScope()");
return scope;
}
@Override
public String getName() {
log.info("BostonBean[" + className + "].getName()");
return null;
}
@Override
public Set<Class<? extends Annotation>> getStereotypes() {
log.info("BostonBean[" + className + "].getStereotypes()");
return new HashSet<Class<? extends Annotation>>();
}
@Override
public Class<?> getBeanClass() {
log.info("BostonBean[" + className + "].getBeanClass()");
return clazz;
}
@Override
public boolean isAlternative() {
log.info("BostonBean[" + className + "].isAlternative()");
return false;
}
@Override
public boolean isNullable() {
log.info("BostonBean[" + className + "].isNullable()");
return false;
}
@Override
public Set<InjectionPoint> getInjectionPoints() {
log.info("BostonBean[" + className + "].getInjectionPoints()");
return injectionPoints;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("BostonBean[").append(clazz).append('\r').
append(" scope: ").append(scope).append('\r').
append(" types: ");
Iterator<Type> it1 = types.iterator();
while (it1.hasNext()) {
sb.append(it1.next()).append('\r').
append(" ");
}
sb.append('\r').
append(" qualifiers: ");
Iterator<Annotation> it2 = qualifiers.iterator();
while (it2.hasNext()) {
sb.append(it2.next()).append('\r').
append(" ");
}
sb.append('\r').
append(" injection points: ");
Iterator<InjectionPoint> it3 = getInjectionPoints().iterator();
while (it3.hasNext()) {
sb.append(it3.next()).append('\r').
append(" ");
}
sb.append('\r').
append("]");
return sb.toString();
}
}