package org.jboss.resteasy.test.cdi.injection.resource;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateful;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.util.HashMap;
import java.util.logging.Logger;
import static org.jboss.resteasy.test.cdi.injection.resource.ReverseInjectionResource.NON_CONTEXTUAL;
@Stateful
@ApplicationScoped
public class StatefulApplicationScopedEJBwithJaxRsComponents implements StatefulApplicationScopedEJBwithJaxRsComponentsInterface {
private static HashMap<String, HashMap<String, Object>> store = new HashMap<String, HashMap<String, Object>>();
private static int constructions;
private static int destructions;
@Inject
int secret;
public static int getConstructions() {
return constructions;
}
public static int getDestructions() {
return destructions;
}
@PostConstruct
public void postConstruct() {
constructions++;
log.info(this + " secret: " + secret);
}
@PreDestroy
public void preDestroy() {
destructions++;
}
@Inject
private Logger log;
@Inject
private CDIInjectionBookResource resource;
@Inject
private CDIInjectionBookReader reader;
@Inject
private CDIInjectionBookWriter writer;
@Override
public void setUp(String key) {
log.info("entering StatefulApplicationScopedEJBwithJaxRsComponents.setUp()");
HashMap<String, Object> substore = new HashMap<String, Object>();
substore.put("secret", resource.theSecret());
substore.put(CDIInjectionBookResource.BOOK_READER, reader);
substore.put(CDIInjectionBookResource.BOOK_WRITER, writer);
store.put(key, substore);
}
/**
* This is an SFSB. See discussion in ReverseInjectionEJBHolder.test().
* <p>
* If NON_CONTEXTUAL.equals(key), then this bean was obtained from JNDI, and
* it is not a CDI contextual object. It follows that it is not dependency
* scoped, which means it will not be recreated, with new injections, upon a
* second invocation.
* <p>
* Otherwise, it will be recreated, and CDI will redo the injections.
*/
@Override
public boolean test(String key) {
log.info("entering StatefulApplicationScopedEJBwithJaxRsComponents.test(" + key + ")");
HashMap<String, Object> substore = store.get(key);
int savedSecret = Integer.class.cast(substore.get("secret"));
log.info("stored resource secret = resource secret: " + (savedSecret == resource.theSecret()));
log.info("stored reader = reader: " + (substore.get(CDIInjectionBookResource.BOOK_READER) == reader));
log.info("stored writer = writer: " + (substore.get(CDIInjectionBookResource.BOOK_WRITER) == writer));
boolean result = true;
result &= reader == substore.get(CDIInjectionBookResource.BOOK_READER); // application scoped
result &= writer == substore.get(CDIInjectionBookResource.BOOK_WRITER); // application scoped
if (NON_CONTEXTUAL.equals(key)) {
result &= resource.theSecret() == savedSecret; // request scope not applicable
} else {
result &= resource.theSecret() != savedSecret; // request scoped
}
return result;
}
@Override
public Class<?> theClass() {
return StatefulApplicationScopedEJBwithJaxRsComponents.class;
}
@Override
public boolean theSame(ReverseInjectionEJBInterface ejb) {
if (ejb == null) {
return false;
}
Class<?> c = ejb.theClass();
if (!StatefulApplicationScopedEJBwithJaxRsComponents.class.equals(c)) {
log.info(ejb + " not instanceof StatefulApplicationScopedEJBwithJaxRsComponents: " + c);
return false;
}
log.info(this.secret + " " + ejb.theSecret());
return this.secret == ejb.theSecret();
}
@Override
public int theSecret() {
return secret;
}
}