package net.ftlines.wicket.cdi;
import java.util.Collections;
import java.util.Map;
import java.util.WeakHashMap;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionTarget;
import org.apache.wicket.util.collections.ClassMetaCache;
{
private static final Object lock = new Object();
private static volatile Map<BeanManager, ClassMetaCache<NonContextual<?>>> cache = Collections.emptyMap();
final InjectionTarget<T> it;
final BeanManager manager;
public static void undeploy(BeanManager beanManager)
{
if (cache.containsKey(beanManager))
{
synchronized (lock)
{
Map<BeanManager, ClassMetaCache<NonContextual<?>>> newCache = new WeakHashMap<BeanManager, ClassMetaCache<NonContextual<?>>>(
cache);
newCache.remove(beanManager);
cache = Collections.unmodifiableMap(newCache);
}
}
}
public static <T> NonContextual<T>
of(Class<?
extends T> clazz, BeanManager manager)
{
ClassMetaCache<NonContextual<?>> meta = getCache(manager);
@SuppressWarnings("unchecked")
NonContextual<T> nc = (NonContextual<T>)meta.get(clazz);
if (nc == null)
{
nc = new NonContextual<T>(manager, clazz);
meta.put(clazz, nc);
}
return nc;
}
private static ClassMetaCache<NonContextual<?>>
getCache(BeanManager manager)
{
ClassMetaCache<NonContextual<?>> meta = cache.get(manager);
if (meta == null)
{
synchronized (lock)
{
meta = cache.get(manager);
if (meta == null)
{
meta = new ClassMetaCache<NonContextual<?>>();
Map<BeanManager, ClassMetaCache<NonContextual<?>>> newCache = new WeakHashMap<BeanManager, ClassMetaCache<NonContextual<?>>>(
cache);
newCache.put(manager, meta);
cache = Collections.unmodifiableMap(newCache);
}
}
}
return meta;
}
@SuppressWarnings("unchecked")
private NonContextual(BeanManager manager, Class<?
extends T> clazz)
{
this.manager = manager;
AnnotatedType<? extends T> type = manager.createAnnotatedType(clazz);
this.it = (InjectionTarget<T>)manager.createInjectionTarget(type);
}
{
CreationalContext<T> cc = manager.createCreationalContext(null);
it.inject(instance, cc);
it.postConstruct(instance);
}
public void inject(T instance)
{
CreationalContext<T> cc = manager.createCreationalContext(null);
it.inject(instance, cc);
}
{
it.preDestroy(instance);
}
}