package org.jboss.resteasy.test.cdi.extensions.resource;
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
import java.lang.annotation.Annotation;
import java.util.HashMap;
public class ScopeExtensionPlannedObsolescenceContext implements Context {
private HashMap<Contextual<?>, Wrapper<?>> map = new HashMap<Contextual<?>, Wrapper<?>>();
@Override
public Class<? extends Annotation> getScope() {
return ScopeExtensionPlannedObsolescenceScope.class;
}
@Override
public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext) {
@SuppressWarnings("unchecked")
Wrapper<T> w = (Wrapper<T>) map.get(contextual);
if (w != null) {
T o = w.object;
Class<?> c = o.getClass();
ScopeExtensionPlannedObsolescenceScope scope = c.getAnnotation(ScopeExtensionPlannedObsolescenceScope.class);
if (scope == null) {
throw new RuntimeException("Error");
}
if (++w.counter > scope.value()) {
contextual.destroy(o, creationalContext);
creationalContext.release();
o = contextual.create(creationalContext);
map.put(contextual, new Wrapper<T>(creationalContext, o));
}
return o;
} else {
T o = contextual.create(creationalContext);
map.put(contextual, new Wrapper<T>(creationalContext, o));
return o;
}
}
/**
* Technically, this version of get() should not create a new object, but,
* for purposes of the test, we destroy and recreate an object when it is
* obsolete.
*/
@Override
public <T> T get(Contextual<T> contextual) {
@SuppressWarnings("unchecked")
Wrapper<T> w = (Wrapper<T>) map.get(contextual);
if (w == null) {
return null;
}
T o = w.object;
Class<?> c = o.getClass();
ScopeExtensionPlannedObsolescenceScope scope = c.getAnnotation(ScopeExtensionPlannedObsolescenceScope.class);
if (scope == null) {
throw new RuntimeException("Error");
}
CreationalContext<T> creationalContext = w.creationalContext;
if (++w.counter > scope.value()) {
contextual.destroy(o, creationalContext);
creationalContext.release();
map.remove(contextual);
// o = contextual.create(creationalContext);
// map.put(contextual, new Wrapper<T>(creationalContext, o));
o = null;
}
return o;
}
@Override
public boolean isActive() {
// TODO How should this be determined?
return true;
}
static class Wrapper<T> {
int counter;
CreationalContext<T> creationalContext;
T object;
Wrapper(final CreationalContext<T> creationalContext, final T object) {
this.creationalContext = creationalContext;
this.object = object;
counter = 1;
}
}
}