Repository: tomee Updated Branches: refs/heads/master 21dfa9a72 -> 81384b706
http://git-wip-us.apache.org/repos/asf/tomee/blob/180f5c5f/examples/cdi-produces-field/README.adoc ---------------------------------------------------------------------- diff --git a/examples/cdi-produces-field/README.adoc b/examples/cdi-produces-field/README.adoc new file mode 100644 index 0000000..b4096b3 --- /dev/null +++ b/examples/cdi-produces-field/README.adoc @@ -0,0 +1,302 @@ += CDI Field Producer +:index-group: CDI +:jbake-type: page +:jbake-status: published + +This example shows the usage of the @Produces annotation. @Produces is a CDI mechanism which allows defining a source + for injection. This example shows one of two ways of declaring a producer. Instead of a producer method (see CDI-produces-disposes example) +a producer field can be used. A producer field can be used instead of a simple getter method. It could be used to +inject resources, such as persistence contexts. One caveat to using producer fields over producer + methods is that a @Disposes method cannot be used in conjunction with @Produces field. + +For the purposes of this example, the type is hard-coded to a specific value. +A Logger implementation shall contain a list of LogHandlers. We shall have three implementations of the LogHandler interface. + +* A DatabaseHandler +* A FileHandler +* A ConsoleHandler + +The DatabaseHandler would seemingly write the logs to a database. The FileHandler would write the same logs to a file. +The ConsoleHandler would just print the logs to a console (Standard out). This example is just an illustration of how +the concepts within CDI work and is not intended to provide a logging framework design/implementation. + +== ConsoleHandler + +.... +package org.superbiz.cdi.produces.field; + +public class ConsoleHandler implements LogHandler { + + private String name; + + public ConsoleHandler(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + public void writeLog(String s) { + System.out.printf("##### Handler: %s, Writing to the console!\n", getName()); + } +} +.... + +== DatabaseHandler + +.... +package org.superbiz.cdi.produces.field; + +public class DatabaseHandler implements LogHandler { + + private String name; + + public DatabaseHandler(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + public void writeLog(String s) { + System.out.printf("##### Handler: %s, Writing to the database!\n", getName()); + // Use connection to write log to database + } +} +.... + +== FileHandler + +.... +package org.superbiz.cdi.produces.field; + +public class FileHandler implements LogHandler { + + private String name; + + public FileHandler(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + public void writeLog(String s) { + System.out.printf("##### Handler: %s, Writing to the file!\n", getName()); + // Write to log file + } +} +.... + +== LogFactory + +.... +package org.superbiz.cdi.produces.field; + +import javax.enterprise.inject.Produces; + +public class LogFactory { + + private int type = 2; + + @Produces + LogHandler handler; + + public LogFactory(){ + handler = getLogHandler(); + } + + public LogHandler getLogHandler() { + switch (type) { + case 1: + return new FileHandler("@Produces created FileHandler!"); + case 2: + return new DatabaseHandler("@Produces created DatabaseHandler!"); + case 3: + default: + return new ConsoleHandler("@Produces created ConsoleHandler!"); + } + + } +} +.... + +== Logger + +.... +package org.superbiz.cdi.produces.field; + +public interface Logger { + + public void log(String s); + + public LogHandler getHandler(); +} +.... + +== LoggerImpl + +.... +package org.superbiz.cdi.produces.field; + +import javax.inject.Inject; +import javax.inject.Named; + +@Named("logger") +public class LoggerImpl implements Logger { + + @Inject + private LogHandler handler; + + @Override + public void log(String s) { + getHandler().writeLog(s); + } + + public LogHandler getHandler() { + return handler; + } +} +.... + +== LogHandler + +.... +package org.superbiz.cdi.produces.field; + +public interface LogHandler { + + public String getName(); + + public void writeLog(String s); +} +.... + +== beans.xml + +.... +<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee + http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> + +</beans> +.... + +== LoggerTest + +.... +package org.superbiz.cdi.produces.field; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import javax.ejb.embeddable.EJBContainer; +import javax.inject.Inject; +import javax.naming.Context; + +import static junit.framework.Assert.assertNotNull; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class LoggerTest { + + @Inject + Logger logger; + + private Context ctxt; + + @Before + public void setUp() { + try { + ctxt = EJBContainer.createEJBContainer().getContext(); + ctxt.bind("inject", this); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @After + public void cleanUp() { + try { + ctxt.unbind("inject"); + ctxt.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void testLogHandler() { + assertNotNull(logger); + assertFalse("Handler should not be a ConsoleHandler", logger.getHandler() instanceof ConsoleHandler); + assertFalse("Handler should not be a FileHandler", logger.getHandler() instanceof FileHandler); + assertTrue("Handler should be a DatabaseHandler", logger.getHandler() instanceof DatabaseHandler); + logger.log("##### Testing write\n"); + logger = null; + } + +} +.... + += Running + +.... +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.superbiz.cdi.produces.field.LoggerTest +INFO - ******************************************************************************** +INFO - OpenEJB http://tomee.apache.org/ +INFO - Startup: Thu May 10 01:28:19 CDT 2012 +INFO - Copyright 1999-2012 (C) Apache OpenEJB Project, All Rights Reserved. +INFO - Version: 7.0.0-SNAPSHOT +INFO - Build date: 20120510 +INFO - Build time: 04:06 +INFO - ******************************************************************************** +INFO - openejb.home = /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field +INFO - openejb.base = /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field +INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@a81b1fb +INFO - succeeded in installing singleton service +INFO - Using 'javax.ejb.embeddable.EJBContainer=true' +INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed. +INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) +INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) +INFO - Creating TransactionManager(id=Default Transaction Manager) +INFO - Creating SecurityService(id=Default Security Service) +INFO - Inspecting classpath for applications: 26 urls. Consider adjusting your exclude/include. Current settings: openejb.deployments.classpath.exclude='', openejb.deployments.classpath.include='.*' +INFO - Searched 26 classpath urls in 2015 milliseconds. Average 77 milliseconds per url. +INFO - Beginning load: /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field/target/classes +INFO - Configuring enterprise application: /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field +INFO - Auto-deploying ejb cdi-produces-field.Comp: EjbDeployment(deployment-id=cdi-produces-field.Comp) +INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) +INFO - Auto-creating a container for bean cdi-produces-field.Comp: Container(type=MANAGED, id=Default Managed Container) +INFO - Creating Container(id=Default Managed Container) +INFO - Using directory /tmp for stateful session passivation +INFO - Enterprise application "/home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field" loaded. +INFO - Assembling app: /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field +INFO - ignoreXmlConfiguration == true +INFO - ignoreXmlConfiguration == true +INFO - existing thread singleton service in SystemInstance() org.apache.openejb.cdi.ThreadSingletonServiceImpl@a81b1fb +INFO - OpenWebBeans Container is starting... +INFO - Adding OpenWebBeansPlugin : [CdiPlugin] +INFO - All injection points were validated successfully. +INFO - OpenWebBeans Container has started, it took [69] ms. +INFO - Deployed Application(path=/home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field) +##### Handler: @Produces created DatabaseHandler!, Writing to the database! +INFO - Undeploying app: /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.79 sec + +Results : + +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 +.... http://git-wip-us.apache.org/repos/asf/tomee/blob/180f5c5f/examples/cdi-produces-field/README.md ---------------------------------------------------------------------- diff --git a/examples/cdi-produces-field/README.md b/examples/cdi-produces-field/README.md deleted file mode 100644 index 6db838d..0000000 --- a/examples/cdi-produces-field/README.md +++ /dev/null @@ -1,285 +0,0 @@ -index-group=Unrevised -type=page -status=published -title=CDI field producer -~~~~~~ - -This example shows the usage of the @Produces annotation. @Produces is a CDI mechanism which allows defining a source - for injection. This example shows one of two ways of declaring a producer. Instead of a producer method (see CDI-produces-disposes example) -a producer field can be used. A producer field can be used instead of a simple getter method. It could be used to -inject resources, such as persistence contexts. One caveat to using producer fields over producer - methods is that a @Disposes method cannot be used in conjunction with @Produces field. - -For the purposes of this example, the type is hard-coded to a specific value. -A Logger implementation shall contain a list of LogHandlers. We shall have three implementations of the LogHandler interface. - - * A DatabaseHandler - * A FileHandler - * A ConsoleHandler - -The DatabaseHandler would seemingly write the logs to a database. The FileHandler would write the same logs to a file. -The ConsoleHandler would just print the logs to a console (Standard out). This example is just an illustration of how -the concepts within CDI work and is not intended to provide a logging framework design/implementation. - -## ConsoleHandler - - package org.superbiz.cdi.produces.field; - - public class ConsoleHandler implements LogHandler { - - private String name; - - public ConsoleHandler(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public void writeLog(String s) { - System.out.printf("##### Handler: %s, Writing to the console!\n", getName()); - } - } - -## DatabaseHandler - - package org.superbiz.cdi.produces.field; - - public class DatabaseHandler implements LogHandler { - - private String name; - - public DatabaseHandler(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public void writeLog(String s) { - System.out.printf("##### Handler: %s, Writing to the database!\n", getName()); - // Use connection to write log to database - } - } - -## FileHandler - - package org.superbiz.cdi.produces.field; - - public class FileHandler implements LogHandler { - - private String name; - - public FileHandler(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public void writeLog(String s) { - System.out.printf("##### Handler: %s, Writing to the file!\n", getName()); - // Write to log file - } - } - -## LogFactory - - package org.superbiz.cdi.produces.field; - - import javax.enterprise.inject.Produces; - - public class LogFactory { - - private int type = 2; - - @Produces - LogHandler handler; - - public LogFactory(){ - handler = getLogHandler(); - } - - public LogHandler getLogHandler() { - switch (type) { - case 1: - return new FileHandler("@Produces created FileHandler!"); - case 2: - return new DatabaseHandler("@Produces created DatabaseHandler!"); - case 3: - default: - return new ConsoleHandler("@Produces created ConsoleHandler!"); - } - - } - } - -## Logger - - package org.superbiz.cdi.produces.field; - - public interface Logger { - - public void log(String s); - - public LogHandler getHandler(); - } - -## LoggerImpl - - package org.superbiz.cdi.produces.field; - - import javax.inject.Inject; - import javax.inject.Named; - - @Named("logger") - public class LoggerImpl implements Logger { - - @Inject - private LogHandler handler; - - @Override - public void log(String s) { - getHandler().writeLog(s); - } - - public LogHandler getHandler() { - return handler; - } - } - -## LogHandler - - package org.superbiz.cdi.produces.field; - - public interface LogHandler { - - public String getName(); - - public void writeLog(String s); - } - -## beans.xml - - <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee - http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> - - </beans> - -## LoggerTest - - package org.superbiz.cdi.produces.field; - - import org.junit.After; - import org.junit.Before; - import org.junit.Test; - - import javax.ejb.embeddable.EJBContainer; - import javax.inject.Inject; - import javax.naming.Context; - - import static junit.framework.Assert.assertNotNull; - import static org.junit.Assert.assertFalse; - import static org.junit.Assert.assertTrue; - - public class LoggerTest { - - @Inject - Logger logger; - - private Context ctxt; - - @Before - public void setUp() { - try { - ctxt = EJBContainer.createEJBContainer().getContext(); - ctxt.bind("inject", this); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @After - public void cleanUp() { - try { - ctxt.unbind("inject"); - ctxt.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Test - public void testLogHandler() { - assertNotNull(logger); - assertFalse("Handler should not be a ConsoleHandler", logger.getHandler() instanceof ConsoleHandler); - assertFalse("Handler should not be a FileHandler", logger.getHandler() instanceof FileHandler); - assertTrue("Handler should be a DatabaseHandler", logger.getHandler() instanceof DatabaseHandler); - logger.log("##### Testing write\n"); - logger = null; - } - - } - -# Running - - - ------------------------------------------------------- - T E S T S - ------------------------------------------------------- - Running org.superbiz.cdi.produces.field.LoggerTest - INFO - ******************************************************************************** - INFO - OpenEJB http://tomee.apache.org/ - INFO - Startup: Thu May 10 01:28:19 CDT 2012 - INFO - Copyright 1999-2012 (C) Apache OpenEJB Project, All Rights Reserved. - INFO - Version: 7.0.0-SNAPSHOT - INFO - Build date: 20120510 - INFO - Build time: 04:06 - INFO - ******************************************************************************** - INFO - openejb.home = /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field - INFO - openejb.base = /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field - INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@a81b1fb - INFO - succeeded in installing singleton service - INFO - Using 'javax.ejb.embeddable.EJBContainer=true' - INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed. - INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) - INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) - INFO - Creating TransactionManager(id=Default Transaction Manager) - INFO - Creating SecurityService(id=Default Security Service) - INFO - Inspecting classpath for applications: 26 urls. Consider adjusting your exclude/include. Current settings: openejb.deployments.classpath.exclude='', openejb.deployments.classpath.include='.*' - INFO - Searched 26 classpath urls in 2015 milliseconds. Average 77 milliseconds per url. - INFO - Beginning load: /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field/target/classes - INFO - Configuring enterprise application: /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field - INFO - Auto-deploying ejb cdi-produces-field.Comp: EjbDeployment(deployment-id=cdi-produces-field.Comp) - INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) - INFO - Auto-creating a container for bean cdi-produces-field.Comp: Container(type=MANAGED, id=Default Managed Container) - INFO - Creating Container(id=Default Managed Container) - INFO - Using directory /tmp for stateful session passivation - INFO - Enterprise application "/home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field" loaded. - INFO - Assembling app: /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field - INFO - ignoreXmlConfiguration == true - INFO - ignoreXmlConfiguration == true - INFO - existing thread singleton service in SystemInstance() org.apache.openejb.cdi.ThreadSingletonServiceImpl@a81b1fb - INFO - OpenWebBeans Container is starting... - INFO - Adding OpenWebBeansPlugin : [CdiPlugin] - INFO - All injection points were validated successfully. - INFO - OpenWebBeans Container has started, it took [69] ms. - INFO - Deployed Application(path=/home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field) - ##### Handler: @Produces created DatabaseHandler!, Writing to the database! - INFO - Undeploying app: /home/daniel/projects/openejb/source/openejb/examples/cdi-produces-field - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.79 sec - - Results : - - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 - http://git-wip-us.apache.org/repos/asf/tomee/blob/180f5c5f/examples/cdi-request-scope/README.adoc ---------------------------------------------------------------------- diff --git a/examples/cdi-request-scope/README.adoc b/examples/cdi-request-scope/README.adoc new file mode 100644 index 0000000..c995db3 --- /dev/null +++ b/examples/cdi-request-scope/README.adoc @@ -0,0 +1,162 @@ += CDI @RequestScoped +:index-group: CDI +:jbake-type: page +:jbake-status: published + +This example show the use of `@RequestScoped` annotation for injected objects. An object +which is defined as `@RequestScoped` is created once for every request and is shared by all the +beans that inject it throughout a same request. + +== Example + +This example depicts a similar scenario to cdi-application-scope. A restaurant guest orders +a soup from the waiter. The order is passed to the chef who prepares it and passes it back +the waiter who in turn delivers it to the guest. + +=== Waiter + +The `Waiter` session bean receives a request from the test class via the `orderSoup()` method. +A `Soup` insance will be created in this method and will be shared throughout the request with +the `Chef` bean. The method passes the request to the `Chef` bean. It then returns the name of +the soup to the test class. + +.... +@Stateless +public class Waiter { + + @Inject + private Soup soup; + + @EJB + private Chef chef; + + public String orderSoup(String name){ + soup.setName(name); + return chef.prepareSoup().getName(); + } +} +.... + +=== Soup + +The `Soup` class is an injectable POJO, defined as `@RequestScoped`. This means that an instance +will be created only once for every request and will be shared by all the beans injecting it. + +.... +@RequestScoped +public class Soup { + + private String name = "Soup of the day"; + + @PostConstruct + public void afterCreate() { + System.out.println("Soup created"); + } + + public String getName() { + return name; + } + + public void setName(String name){ + this.name = name; + } +} +.... + +=== Chef + +The `Chef` class is a simple session bean with an injected `Soup` field. Normally, the soup +parameter would be passed as a `prepareSoup()` argument, but for the need of this example +it's passed by the request context. + +.... +@Stateless +public class Chef { + + @Inject + private Soup soup; + + public Soup prepareSoup() { + return soup; + } +} +.... + +== Test Case + +This is the entry class for this example. + +.... +public class RestaurantTest { + + private static String TOMATO_SOUP = "Tomato Soup"; + private EJBContainer container; + + @EJB + private Waiter joe; + + @Before + public void startContainer() throws Exception { + container = EJBContainer.createEJBContainer(); + container.getContext().bind("inject", this); + } + + @Test + public void orderSoup(){ + String soup = joe.orderSoup(TOMATO_SOUP); + assertEquals(TOMATO_SOUP, soup); + soup = joe.orderSoup(POTATO_SOUP); + assertEquals(POTATO_SOUP, soup); + } + + @After + public void closeContainer() throws Exception { + container.close(); + } +} +.... + +== Running + +In the output you can see that there were two `Soup` instances created - one for +each request. + +.... +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.superbiz.cdi.requestscope.RestaurantTest +Apache OpenEJB 7.0.0-SNAPSHOT build: 20111224-11:09 +http://tomee.apache.org/ +INFO - openejb.home = C:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope +INFO - openejb.base = C:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope +INFO - Using 'javax.ejb.embeddable.EJBContainer=true' +INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) +INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) +INFO - Found EjbModule in classpath: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope\target\classes +INFO - Beginning load: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope\target\classes +INFO - Configuring enterprise application: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope +INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) +INFO - Auto-creating a container for bean cdi-request-scope.Comp: Container(type=MANAGED, id=Default Managed Container) +INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) +INFO - Auto-creating a container for bean Chef: Container(type=STATELESS, id=Default Stateless Container) +INFO - Enterprise application "c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope" loaded. +INFO - Assembling app: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope +INFO - Jndi(name="java:global/cdi-request-scope/Chef!org.superbiz.cdi.requestscope.Chef") +INFO - Jndi(name="java:global/cdi-request-scope/Chef") +INFO - Jndi(name="java:global/cdi-request-scope/Waiter!org.superbiz.cdi.requestscope.Waiter") +INFO - Jndi(name="java:global/cdi-request-scope/Waiter") +INFO - Created Ejb(deployment-id=Chef, ejb-name=Chef, container=Default Stateless Container) +INFO - Created Ejb(deployment-id=Waiter, ejb-name=Waiter, container=Default Stateless Container) +INFO - Started Ejb(deployment-id=Chef, ejb-name=Chef, container=Default Stateless Container) +INFO - Started Ejb(deployment-id=Waiter, ejb-name=Waiter, container=Default Stateless Container) +INFO - Deployed Application(path=c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope) +Soup created +Soup created +INFO - Undeploying app: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.412 sec + +Results : + +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 +.... http://git-wip-us.apache.org/repos/asf/tomee/blob/180f5c5f/examples/cdi-request-scope/README.md ---------------------------------------------------------------------- diff --git a/examples/cdi-request-scope/README.md b/examples/cdi-request-scope/README.md deleted file mode 100644 index 1236fbb..0000000 --- a/examples/cdi-request-scope/README.md +++ /dev/null @@ -1,153 +0,0 @@ -index-group=CDI -type=page -status=published -title=CDI @RequestScoped -~~~~~~ - -This example show the use of `@RequestScoped` annotation for injected objects. An object -which is defined as `@RequestScoped` is created once for every request and is shared by all the -beans that inject it throughout a same request. - -# Example - -This example depicts a similar scenario to cdi-application-scope. A restaurant guest orders -a soup from the waiter. The order is passed to the chef who prepares it and passes it back -the waiter who in turn delivers it to the guest. - -## Waiter - -The `Waiter` session bean receives a request from the test class via the `orderSoup()` method. -A `Soup` insance will be created in this method and will be shared throughout the request with -the `Chef` bean. The method passes the request to the `Chef` bean. It then returns the name of -the soup to the test class. - - @Stateless - public class Waiter { - - @Inject - private Soup soup; - - @EJB - private Chef chef; - - public String orderSoup(String name){ - soup.setName(name); - return chef.prepareSoup().getName(); - } - } - -## Soup - -The `Soup` class is an injectable POJO, defined as `@RequestScoped`. This means that an instance -will be created only once for every request and will be shared by all the beans injecting it. - - @RequestScoped - public class Soup { - - private String name = "Soup of the day"; - - @PostConstruct - public void afterCreate() { - System.out.println("Soup created"); - } - - public String getName() { - return name; - } - - public void setName(String name){ - this.name = name; - } - } - -## Chef - -The `Chef` class is a simple session bean with an injected `Soup` field. Normally, the soup -parameter would be passed as a `prepareSoup()` argument, but for the need of this example -it's passed by the request context. - - @Stateless - public class Chef { - - @Inject - private Soup soup; - - public Soup prepareSoup() { - return soup; - } - } - -# Test Case - -This is the entry class for this example. - - public class RestaurantTest { - - private static String TOMATO_SOUP = "Tomato Soup"; - private EJBContainer container; - - @EJB - private Waiter joe; - - @Before - public void startContainer() throws Exception { - container = EJBContainer.createEJBContainer(); - container.getContext().bind("inject", this); - } - - @Test - public void orderSoup(){ - String soup = joe.orderSoup(TOMATO_SOUP); - assertEquals(TOMATO_SOUP, soup); - soup = joe.orderSoup(POTATO_SOUP); - assertEquals(POTATO_SOUP, soup); - } - - @After - public void closeContainer() throws Exception { - container.close(); - } - } - -# Running - -In the output you can see that there were two `Soup` instances created - one for -each request. - - ------------------------------------------------------- - T E S T S - ------------------------------------------------------- - Running org.superbiz.cdi.requestscope.RestaurantTest - Apache OpenEJB 7.0.0-SNAPSHOT build: 20111224-11:09 - http://tomee.apache.org/ - INFO - openejb.home = C:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope - INFO - openejb.base = C:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope - INFO - Using 'javax.ejb.embeddable.EJBContainer=true' - INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) - INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) - INFO - Found EjbModule in classpath: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope\target\classes - INFO - Beginning load: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope\target\classes - INFO - Configuring enterprise application: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope - INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) - INFO - Auto-creating a container for bean cdi-request-scope.Comp: Container(type=MANAGED, id=Default Managed Container) - INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) - INFO - Auto-creating a container for bean Chef: Container(type=STATELESS, id=Default Stateless Container) - INFO - Enterprise application "c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope" loaded. - INFO - Assembling app: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope - INFO - Jndi(name="java:global/cdi-request-scope/Chef!org.superbiz.cdi.requestscope.Chef") - INFO - Jndi(name="java:global/cdi-request-scope/Chef") - INFO - Jndi(name="java:global/cdi-request-scope/Waiter!org.superbiz.cdi.requestscope.Waiter") - INFO - Jndi(name="java:global/cdi-request-scope/Waiter") - INFO - Created Ejb(deployment-id=Chef, ejb-name=Chef, container=Default Stateless Container) - INFO - Created Ejb(deployment-id=Waiter, ejb-name=Waiter, container=Default Stateless Container) - INFO - Started Ejb(deployment-id=Chef, ejb-name=Chef, container=Default Stateless Container) - INFO - Started Ejb(deployment-id=Waiter, ejb-name=Waiter, container=Default Stateless Container) - INFO - Deployed Application(path=c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope) - Soup created - Soup created - INFO - Undeploying app: c:\Users\Daniel\workspaces\openejb\openejb\examples\cdi-request-scope - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.412 sec - - Results : - - Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 http://git-wip-us.apache.org/repos/asf/tomee/blob/180f5c5f/examples/cdi-session-scope/README.adoc ---------------------------------------------------------------------- diff --git a/examples/cdi-session-scope/README.adoc b/examples/cdi-session-scope/README.adoc new file mode 100644 index 0000000..8eb6aa7 --- /dev/null +++ b/examples/cdi-session-scope/README.adoc @@ -0,0 +1,124 @@ += CDI @SessionScoped +:index-group: CDI +:jbake-type: page +:jbake-status: published + +This example show the use of `@SessionScoped` annotation for injected objects. An object +which is defined as `@SessionScoped` is created once for every HTTPSession and is shared by all the +beans that inject it throughout the same HTTPSession. + +== Run the application: + + mvn clean install tomee:run + +== Example + +This example has an end point wherein a user provides a request parameter 'name' which is persisted as a feild in a session scoped bean SessionBean and +then retrieved through another endpoint. + +==== Request +---- +GET http://localhost:8080/cdi-session-scope-8.0.0-SNAPSHOT/set-name?name=Puneeth +---- +==== Response +---- +done, go to /name servlet +---- + +==== Request +---- +GET http://localhost:8080/cdi-session-scope-8.0.0-SNAPSHOT/name +---- +==== Response +---- +name = \{Puneeth} +---- + +=== SessionBean + +The annotation @SessionScoped specifies that a bean is session scoped ie there will be only one instance of the class associated with a particular +HTTPSession. + +@SessionScoped +public class SessionBean implements Serializable { + +.... +private String name; + +public String getName() { + return name; +} + +public void setName(String name) { + this.name = name; +} } +.... + +=== InputServlet + +InputServlet is a generic servlet which is mapped to the url pattern '/set-name'. +The session scoped bean 'SessionBean' has been injected into this servlet, and the incoming request parameter is set to the feild name of the bean. + +@WebServlet(name = "input-servlet", urlPatterns = {"/set-name"}) +public class InputServlet extends HttpServlet { + +.... +@Inject +private SessionBean bean; + +@Override +protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final String name = req.getParameter("name"); + if (name == null || name.isEmpty()) { + resp.getWriter().write("please add a parameter name=xxx"); + } else { + bean.setName(name); + resp.getWriter().write("done, go to /name servlet"); + } + +} } +.... + +=== AnswerBean + +AnswerBean is a request scoped bean with an injected 'SessionBean'. It has an postconstruct method wherein the value from the sessionBean is retrieved and set to a feild. + +public class AnswerBean { + +.... +@Inject +private SessionBean bean; + +private String value; + +@PostConstruct +public void init() { + value = '{' + bean.getName() + '}'; +} + +public String value() { + return value; +} } +.... + +=== OutputServlet + +OutputServlet is another servlet with 'AnswerBean' as an injected feild. When '/name' is called the value from 'Answerbean' is read and written to the response. + +@WebServlet(name = "output-servlet", urlPatterns = {"/name"}) +public class OutputServlet extends HttpServlet { + +.... +@Inject +private AnswerBean bean; + +@Override +protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + final String name = bean.value(); + if (name == null || name.isEmpty()) { + resp.getWriter().write("please go to servlet /set-name please"); + } else { + resp.getWriter().write("name = " + name); + } +} } +.... http://git-wip-us.apache.org/repos/asf/tomee/blob/180f5c5f/examples/cdi-session-scope/README.md ---------------------------------------------------------------------- diff --git a/examples/cdi-session-scope/README.md b/examples/cdi-session-scope/README.md deleted file mode 100644 index 3ca2080..0000000 --- a/examples/cdi-session-scope/README.md +++ /dev/null @@ -1,122 +0,0 @@ -index-group=Unrevised -type=page -status=unpublished -title=CDI @SessionScoped -~~~~~~ - -This example show the use of `@SessionScoped` annotation for injected objects. An object -which is defined as `@SessionScoped` is created once for every HTTPSession and is shared by all the -beans that inject it throughout the same HTTPSession. - -##### Run the application: - - mvn clean install tomee:run - -# Example - -This example has an end point wherein a user provides a request parameter 'name' which is persisted as a feild in a session scoped bean SessionBean and -then retrieved through another endpoint. - -#Request - -GET http://localhost:8080/cdi-session-scope-8.0.0-SNAPSHOT/set-name?name=Puneeth - -#Response - -done, go to /name servlet - -#Request - -GET http://localhost:8080/cdi-session-scope-8.0.0-SNAPSHOT/name - -#Response - -name = {Puneeth} - -##SessionBean - -The annotation @SessionScoped specifies that a bean is session scoped ie there will be only one instance of the class associated with a particular -HTTPSession. - -@SessionScoped -public class SessionBean implements Serializable { - - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} - -##InputServlet - -InputServlet is a generic servlet which is mapped to the url pattern '/set-name'. -The session scoped bean 'SessionBean' has been injected into this servlet, and the incoming request parameter is set to the feild name of the bean. - -@WebServlet(name = "input-servlet", urlPatterns = {"/set-name"}) -public class InputServlet extends HttpServlet { - - @Inject - private SessionBean bean; - - @Override - protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - final String name = req.getParameter("name"); - if (name == null || name.isEmpty()) { - resp.getWriter().write("please add a parameter name=xxx"); - } else { - bean.setName(name); - resp.getWriter().write("done, go to /name servlet"); - } - - } -} - -##AnswerBean - -AnswerBean is a request scoped bean with an injected 'SessionBean'. It has an postconstruct method wherein the value from the sessionBean is retrieved and set to a feild. - -public class AnswerBean { - - @Inject - private SessionBean bean; - - private String value; - - @PostConstruct - public void init() { - value = '{' + bean.getName() + '}'; - } - - public String value() { - return value; - } -} - -##OutputServlet - -OutputServlet is another servlet with 'AnswerBean' as an injected feild. When '/name' is called the value from 'Answerbean' is read and written to the response. - -@WebServlet(name = "output-servlet", urlPatterns = {"/name"}) -public class OutputServlet extends HttpServlet { - - @Inject - private AnswerBean bean; - - @Override - protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - final String name = bean.value(); - if (name == null || name.isEmpty()) { - resp.getWriter().write("please go to servlet /set-name please"); - } else { - resp.getWriter().write("name = " + name); - } - } -} - - -
