package org.jboss.resteasy.test.cdi.basic.resource; import org.jboss.resteasy.test.cdi.util.Constants; import org.jboss.resteasy.test.cdi.util.Counter; import org.jboss.resteasy.test.cdi.util.CounterBinding; import org.jboss.resteasy.test.cdi.util.Utilities; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.enterprise.context.Dependent; import javax.inject.Inject; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.HashMap; import java.util.logging.Logger; @Stateless @Dependent @Path("/") public class EJBBookResource implements EJBLocalResource, EJBRemoteResource { private static HashMap<Integer, EJBBook> books = new HashMap<>(); @Inject private Logger log; @Inject private Utilities utilities; @Inject @CounterBinding private Counter counter; @Inject private EJBBookReader readerCDI; // EJBBookReaderImpl implements @Local interface EJBBookReader @EJB private EJBBookReader readerEJB; @Inject private EJBBookWriterImpl writerCDI; // EJBBookWriterImpl has a no-interface view @EJB private EJBBookWriterImpl writerEJB; @GET @Override @Path("verifyScopes") @Produces(MediaType.TEXT_PLAIN) public int verifyScopes() { log.info("entering verifyScopes()"); log.info("EJBBookReader scope: " + utilities.getScope(EJBBookReader.class)); log.info("EJBBookReaderImpl scope: " + utilities.getScope(EJBBookReaderImpl.class)); log.info("EJBBookWriterImpl scope: " + utilities.getScope(EJBBookWriterImpl.class)); log.info("EJBLocalResource scope: " + utilities.getScope(EJBLocalResource.class)); log.info("EJBRemoteResource scope: " + utilities.getScope(EJBRemoteResource.class)); log.info("EJBBookResource scope: " + utilities.getScope(EJBBookResource.class)); boolean result = true; result &= utilities.isApplicationScoped(EJBBookReader.class); result &= utilities.isApplicationScoped(EJBBookWriterImpl.class); result &= utilities.isDependentScoped(EJBLocalResource.class); return result ? 200 : 500; } @GET @Override @Path("verifyInjection") @Produces(MediaType.TEXT_PLAIN) public int verifyInjection() { log.info("entering verifyInjection()"); log.info("readerCDI: " + readerCDI); log.info("readerEJB: " + readerEJB); log.info("writerCDI: " + writerCDI); log.info("writerEJB: " + writerEJB); boolean result = true; result &= readerCDI != null; result &= readerEJB != null; result &= writerCDI != null; result &= writerEJB != null; return result ? 200 : 500; } @POST @Path("create") @Consumes(Constants.MEDIA_TYPE_TEST_XML) @Produces(MediaType.TEXT_PLAIN) public int createBook(EJBBook book) { log.info("entering createBook()"); int id = counter.getNext(); book.setId(id); books.put(id, book); log.info("stored: " + id + "->" + book); return id; } @GET @Path("book/{id:[0-9][0-9]*}") @Produces(Constants.MEDIA_TYPE_TEST_XML) public EJBBook lookupBookById(@PathParam("id") int id) { log.info("entering lookupBookById(" + id + ")"); log.info("books: " + books); EJBBook book = books.get(id); if (book == null) { throw new WebApplicationException(Response.Status.NOT_FOUND); } return book; } @GET @Path("uses/{count}") @Produces(MediaType.TEXT_PLAIN) public int testUse(@PathParam("count") int count) { log.info("entering testUse()"); log.info("readerEJB uses: " + readerEJB.getUses()); log.info("writerEJB uses: " + writerEJB.getUses()); log.info("readerCDI uses: " + readerCDI.getUses()); log.info("writerCDI uses: " + writerCDI.getUses()); int readerUses = readerCDI.getUses(); int writerUses = writerCDI.getUses(); readerCDI.reset(); writerCDI.reset(); return (readerUses == count && writerUses == count) ? 200 : 500; } @GET @Path("reset") public void reset() { log.info("entering reset()"); counter.reset(); } }