Added: tomee/site/trunk/content/master/pt/examples/cdi-produces-disposes.html URL: http://svn.apache.org/viewvc/tomee/site/trunk/content/master/pt/examples/cdi-produces-disposes.html?rev=1866555&view=auto ============================================================================== --- tomee/site/trunk/content/master/pt/examples/cdi-produces-disposes.html (added) +++ tomee/site/trunk/content/master/pt/examples/cdi-produces-disposes.html Sat Sep 7 14:25:49 2019 @@ -0,0 +1,532 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Apache TomEE</title> + <meta name="description" + content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." /> + <meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" /> + <meta name="author" content="Luka Cvetinovic for Codrops" /> + <link rel="icon" href="../../../favicon.ico"> + <link rel="icon" type="image/png" href="../../../favicon.png"> + <meta name="msapplication-TileColor" content="#80287a"> + <meta name="theme-color" content="#80287a"> + <link rel="stylesheet" type="text/css" href="../../../css/normalize.css"> + <link rel="stylesheet" type="text/css" href="../../../css/bootstrap.css"> + <link rel="stylesheet" type="text/css" href="../../../css/owl.css"> + <link rel="stylesheet" type="text/css" href="../../../css/animate.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/font-awesome-4.1.0/css/font-awesome.min.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/eleganticons/et-icons.css"> + <link rel="stylesheet" type="text/css" href="../../../css/jqtree.css"> + <link rel="stylesheet" type="text/css" href="../../../css/idea.css"> + <link rel="stylesheet" type="text/css" href="../../../css/cardio.css"> + + <script type="text/javascript"> + + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-2717626-1']); + _gaq.push(['_setDomainName', 'apache.org']); + _gaq.push(['_trackPageview']); + + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + + </script> +</head> + +<body> + <div class="preloader"> + <img src="../../../img/loader.gif" alt="Preloader image"> + </div> + <nav class="navbar"> + <div class="container"> + <div class="row"> <div class="col-md-12"> + + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="/"> + <span> + + + <img src="../../../img/logo-active.png"> + + + </span> + Apache TomEE + </a> + </div> + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav navbar-right main-nav"> + <li><a href="../../../docs.html">Documentation</a></li> + <li><a href="../../../community/index.html">Community</a></li> + <li><a href="../../../security/security.html">Security</a></li> + <li><a href="../../../download-ng.html">Downloads</a></li> + </ul> + </div> + <!-- /.navbar-collapse --> + </div></div> + </div> + <!-- /.container-fluid --> + </nav> + + + <div id="main-block" class="container main-block"> + <div class="row title"> + <div class="col-md-12"> + <div class='page-header'> + + <h1>CDI Produces Disposes</h1> + </div> + </div> + </div> + <div class="row"> + + <div class="col-md-12"> + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Esté exemplo demostra como as anotações @Produces e @Disposes trabalham. Um LogFactory cria uma instância do LogHandler +dependendo de um atributo "type". Para o propósito deste exemplo, o type é hard-coded para especificar um valor. +Uma implementação Logger deve conter uma lista de LogHandlers.</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>Teremos três implementações da interface LogHandler:</pre> +</div> +</div> +<div class="ulist"> +<ul> +<li> +<p>Uma DatabaseHandler</p> +</li> +<li> +<p>Uma FileHandler</p> +</li> +<li> +<p>Uma ConsoleHandler</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>O DatabaseHandler aparentemente gravaria os logs em um banco de dados.</p> +</div> +<div class="paragraph"> +<p>O FileHandler gravaria os logs em um arquivo.</p> +</div> +<div class="paragraph"> +<p>O ConsoleHandler apenas imprimiria os logs para um console (saÃda padrão).</p> +</div> +<div class="paragraph"> +<p>Esté exemplo é apenas uma ilustração de como os conceitos dentro do CDI funcionam e não destina-se a fornecer uma implementação/design de um framework de log.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_consolehandler">ConsoleHandler</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.disposes; + +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()); + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_databasehandler">DatabaseHandler</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.disposes; + +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 conexão para gravar log no banco de dados + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_filehandler">FileHandler</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.disposes; + +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()); + // Escreva para o arquivo de log + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_logfactory">LogFactory</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.disposes; + +import javax.enterprise.inject.Disposes; +import javax.enterprise.inject.Produces; + +public class LogFactory { + + private int type = 2; + + @Produces + 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!"); + } + } + + public void closeLogHandler(@Disposes LogHandler handler) { + switch (type) { + case 1: + System.out.println("Closing File handler!"); + break; + case 2: + System.out.println("Closing DB handler!"); + break; + case 3: + default: + System.out.println("Closing Console handler!"); + } + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_logger">Logger</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.disposes; + +public interface Logger { + + public void log(String s); + + public LogHandler getHandler(); +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_loggerimpl">LoggerImpl</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.disposes; + +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; + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_loghandler">LogHandler</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.disposes; + +public interface LogHandler { + + public String getName(); + + public void writeLog(String s); +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_beans_xml">beans.xml</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre><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></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_loggertest">LoggerTest</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.disposes; + +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; + } + +}</pre> +</div> +</div> +</div> +</div> +<h1 id="_executando" class="sect0">Executando</h1> +<div class="literalblock"> +<div class="content"> +<pre>------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.superbiz.cdi.produces.disposes.LoggerTest +Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06 +http://tomee.apache.org/ +INFO - openejb.home = /Users/dblevins/examples/cdi-produces-disposes +INFO - openejb.base = /Users/dblevins/examples/cdi-produces-disposes +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: /Users/dblevins/examples/cdi-produces-disposes/target/classes +INFO - Beginning load: /Users/dblevins/examples/cdi-produces-disposes/target/classes +INFO - Configuring enterprise application: /Users/dblevins/examples/cdi-produces-disposes +INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) +INFO - Auto-creating a container for bean cdi-produces-disposes.Comp: Container(type=MANAGED, id=Default Managed Container) +INFO - Enterprise application "/Users/dblevins/examples/cdi-produces-disposes" loaded. +INFO - Assembling app: /Users/dblevins/examples/cdi-produces-disposes +INFO - Jndi(name="java:global/cdi-produces-disposes/cdi-produces-disposes.Comp!org.apache.openejb.BeanContext$Comp") +INFO - Jndi(name="java:global/cdi-produces-disposes/cdi-produces-disposes.Comp") +INFO - Jndi(name="java:global/EjbModule10202458/org.superbiz.cdi.produces.disposes.LoggerTest!org.superbiz.cdi.produces.disposes.LoggerTest") +INFO - Jndi(name="java:global/EjbModule10202458/org.superbiz.cdi.produces.disposes.LoggerTest") +INFO - Created Ejb(deployment-id=cdi-produces-disposes.Comp, ejb-name=cdi-produces-disposes.Comp, container=Default Managed Container) +INFO - Created Ejb(deployment-id=org.superbiz.cdi.produces.disposes.LoggerTest, ejb-name=org.superbiz.cdi.produces.disposes.LoggerTest, container=Default Managed Container) +INFO - Started Ejb(deployment-id=cdi-produces-disposes.Comp, ejb-name=cdi-produces-disposes.Comp, container=Default Managed Container) +INFO - Started Ejb(deployment-id=org.superbiz.cdi.produces.disposes.LoggerTest, ejb-name=org.superbiz.cdi.produces.disposes.LoggerTest, container=Default Managed Container) +INFO - Deployed Application(path=/Users/dblevins/examples/cdi-produces-disposes) +##### Handler: @Produces created DatabaseHandler!, Writing to the database! +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.02 sec + +Results : + +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0</pre> +</div> +</div> + </div> + + </div> + </div> +<footer> + <div class="container"> + <div class="row"> + <div class="col-sm-6 text-center-mobile"> + <h3 class="white">Be simple. Be certified. Be Tomcat.</h3> + <h5 class="light regular light-white">"A good application in a good server"</h5> + <ul class="social-footer"> + <li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li> + <li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li> + <li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li> + </ul> + </div> + <div class="col-sm-6 text-center-mobile"> + <div class="row opening-hours"> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/docs/documentation.html" class="white">Documentation</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li> + <li><a href="../../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li> + <li><a href="../../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li> + <li><a href="../../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/examples/" class="white">Examples</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li> + <li><a href="../../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li> + <li><a href="../../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li> + <li><a href="../../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../community/index.html" class="white">Community</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../community/contributors.html" class="regular light-white">Contributors</a></li> + <li><a href="../../../community/social.html" class="regular light-white">Social</a></li> + <li><a href="../../../community/sources.html" class="regular light-white">Sources</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../security/index.html" class="white">Security</a></h5> + <ul class="list-unstyled"> + <li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li> + <li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li> + <li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li> + </ul> + </div> + </div> + </div> + </div> + <div class="row bottom-footer text-center-mobile"> + <div class="col-sm-12 light-white"> + <p>Copyright © 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p> + </div> + </div> + </div> + </footer> + <!-- Holder for mobile navigation --> + <div class="mobile-nav"> + <ul> + <li><a hef="../../../latest/docs/admin/index.html">Administrators</a> + <li><a hef="../../../latest/docs/developer/index.html">Developers</a> + <li><a hef="../../../latest/docs/advanced/index.html">Advanced</a> + <li><a hef="../../../community/index.html">Community</a> + </ul> + <a href="#" class="close-link"><i class="arrow_up"></i></a> + </div> + <!-- Scripts --> + <script src="../../../js/jquery-1.11.1.min.js"></script> + <script src="../../../js/owl.carousel.min.js"></script> + <script src="../../../js/bootstrap.min.js"></script> + <script src="../../../js/wow.min.js"></script> + <script src="../../../js/typewriter.js"></script> + <script src="../../../js/jquery.onepagenav.js"></script> + <script src="../../../js/tree.jquery.js"></script> + <script src="../../../js/highlight.pack.js"></script> + <script src="../../../js/main.js"></script> + </body> + +</html> +
Added: tomee/site/trunk/content/master/pt/examples/cdi-produces-field.html URL: http://svn.apache.org/viewvc/tomee/site/trunk/content/master/pt/examples/cdi-produces-field.html?rev=1866555&view=auto ============================================================================== --- tomee/site/trunk/content/master/pt/examples/cdi-produces-field.html (added) +++ tomee/site/trunk/content/master/pt/examples/cdi-produces-field.html Sat Sep 7 14:25:49 2019 @@ -0,0 +1,526 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Apache TomEE</title> + <meta name="description" + content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." /> + <meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" /> + <meta name="author" content="Luka Cvetinovic for Codrops" /> + <link rel="icon" href="../../../favicon.ico"> + <link rel="icon" type="image/png" href="../../../favicon.png"> + <meta name="msapplication-TileColor" content="#80287a"> + <meta name="theme-color" content="#80287a"> + <link rel="stylesheet" type="text/css" href="../../../css/normalize.css"> + <link rel="stylesheet" type="text/css" href="../../../css/bootstrap.css"> + <link rel="stylesheet" type="text/css" href="../../../css/owl.css"> + <link rel="stylesheet" type="text/css" href="../../../css/animate.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/font-awesome-4.1.0/css/font-awesome.min.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/eleganticons/et-icons.css"> + <link rel="stylesheet" type="text/css" href="../../../css/jqtree.css"> + <link rel="stylesheet" type="text/css" href="../../../css/idea.css"> + <link rel="stylesheet" type="text/css" href="../../../css/cardio.css"> + + <script type="text/javascript"> + + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-2717626-1']); + _gaq.push(['_setDomainName', 'apache.org']); + _gaq.push(['_trackPageview']); + + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + + </script> +</head> + +<body> + <div class="preloader"> + <img src="../../../img/loader.gif" alt="Preloader image"> + </div> + <nav class="navbar"> + <div class="container"> + <div class="row"> <div class="col-md-12"> + + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="/"> + <span> + + + <img src="../../../img/logo-active.png"> + + + </span> + Apache TomEE + </a> + </div> + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav navbar-right main-nav"> + <li><a href="../../../docs.html">Documentation</a></li> + <li><a href="../../../community/index.html">Community</a></li> + <li><a href="../../../security/security.html">Security</a></li> + <li><a href="../../../download-ng.html">Downloads</a></li> + </ul> + </div> + <!-- /.navbar-collapse --> + </div></div> + </div> + <!-- /.container-fluid --> + </nav> + + + <div id="main-block" class="container main-block"> + <div class="row title"> + <div class="col-md-12"> + <div class='page-header'> + + <h1>CDI Field Producer</h1> + </div> + </div> + </div> + <div class="row"> + + <div class="col-md-12"> + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Este exemplo mostra o uso da anotação <code>@Produces</code>. <code>@Produces</code> é um mecanismo do CDI que permite definir uma fonte para injeção. Este exemplo mostra uma das duas formas de declarar um producer. Ao invés de um produces method (veja no exemplo CDI-produces-disposes), um producer field pode ser usado. Um producer field pode ser usado ao invés de um simples método getter. Isso pode ser usado para injetar recursos como, contexto de persistência. Uma ressalva para o uso de produces fields sobre produces method é que um método <code>@Disposes</code> não pode ser usado junto de um <code>@Produces</code> field.</p> +</div> +<div class="paragraph"> +<p>Para o proposito deste exemplo, <code>type</code> é hard-coded em um valor especifico. Uma implementação de Logger deve conter uma lista de LogHandlers. Nós devemos ter três implementações da interface LogHandler.</p> +</div> +<div class="ulist"> +<ul> +<li> +<p>Uma DatabaseHandler</p> +</li> +<li> +<p>Uma FileHandler</p> +</li> +<li> +<p>Uma ConsoleHandler</p> +</li> +</ul> +</div> +<div class="paragraph"> +<p>A implementação DatabaseHandler aparentemente gravaria os logs em um banco de dados. O FileHandler gravaria os mesmos logs em um arquivo. E o ConsoleHandler apenas imprimiria os logs no console. Este exemplo é apenas uma ilustração de como os conceitos dentro do CDI funcionam e não tem a intenção de fornecer uma implementação/design de estrutura de log.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_consolehandler">ConsoleHandler</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>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()); + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_databasehandler">DatabaseHandler</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>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 + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_filehandler">FileHandler</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>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()); + // Escreve para o arquivo de log + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_logfactory">LogFactory</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>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!"); + } + + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_logger">Logger</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.field; + +public interface Logger { + + public void log(String s); + + public LogHandler getHandler(); +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_loggerimpl">LoggerImpl</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>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; + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_loghandler">LogHandler</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>package org.superbiz.cdi.produces.field; + +public interface LogHandler { + + public String getName(); + + public void writeLog(String s); +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_beans_xml">beans.xml</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre><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></pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_loggertest">LoggerTest</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>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; + } + +}</pre> +</div> +</div> +</div> +</div> +<h1 id="_executando" class="sect0">Executando</h1> +<div class="literalblock"> +<div class="content"> +<pre>------------------------------------------------------- + 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</pre> +</div> +</div> + </div> + + </div> + </div> +<footer> + <div class="container"> + <div class="row"> + <div class="col-sm-6 text-center-mobile"> + <h3 class="white">Be simple. Be certified. Be Tomcat.</h3> + <h5 class="light regular light-white">"A good application in a good server"</h5> + <ul class="social-footer"> + <li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li> + <li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li> + <li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li> + </ul> + </div> + <div class="col-sm-6 text-center-mobile"> + <div class="row opening-hours"> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/docs/documentation.html" class="white">Documentation</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li> + <li><a href="../../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li> + <li><a href="../../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li> + <li><a href="../../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/examples/" class="white">Examples</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li> + <li><a href="../../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li> + <li><a href="../../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li> + <li><a href="../../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../community/index.html" class="white">Community</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../community/contributors.html" class="regular light-white">Contributors</a></li> + <li><a href="../../../community/social.html" class="regular light-white">Social</a></li> + <li><a href="../../../community/sources.html" class="regular light-white">Sources</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../security/index.html" class="white">Security</a></h5> + <ul class="list-unstyled"> + <li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li> + <li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li> + <li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li> + </ul> + </div> + </div> + </div> + </div> + <div class="row bottom-footer text-center-mobile"> + <div class="col-sm-12 light-white"> + <p>Copyright © 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p> + </div> + </div> + </div> + </footer> + <!-- Holder for mobile navigation --> + <div class="mobile-nav"> + <ul> + <li><a hef="../../../latest/docs/admin/index.html">Administrators</a> + <li><a hef="../../../latest/docs/developer/index.html">Developers</a> + <li><a hef="../../../latest/docs/advanced/index.html">Advanced</a> + <li><a hef="../../../community/index.html">Community</a> + </ul> + <a href="#" class="close-link"><i class="arrow_up"></i></a> + </div> + <!-- Scripts --> + <script src="../../../js/jquery-1.11.1.min.js"></script> + <script src="../../../js/owl.carousel.min.js"></script> + <script src="../../../js/bootstrap.min.js"></script> + <script src="../../../js/wow.min.js"></script> + <script src="../../../js/typewriter.js"></script> + <script src="../../../js/jquery.onepagenav.js"></script> + <script src="../../../js/tree.jquery.js"></script> + <script src="../../../js/highlight.pack.js"></script> + <script src="../../../js/main.js"></script> + </body> + +</html> + Added: tomee/site/trunk/content/master/pt/examples/cdi-qualifier.html URL: http://svn.apache.org/viewvc/tomee/site/trunk/content/master/pt/examples/cdi-qualifier.html?rev=1866555&view=auto ============================================================================== --- tomee/site/trunk/content/master/pt/examples/cdi-qualifier.html (added) +++ tomee/site/trunk/content/master/pt/examples/cdi-qualifier.html Sat Sep 7 14:25:49 2019 @@ -0,0 +1,295 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Apache TomEE</title> + <meta name="description" + content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." /> + <meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" /> + <meta name="author" content="Luka Cvetinovic for Codrops" /> + <link rel="icon" href="../../../favicon.ico"> + <link rel="icon" type="image/png" href="../../../favicon.png"> + <meta name="msapplication-TileColor" content="#80287a"> + <meta name="theme-color" content="#80287a"> + <link rel="stylesheet" type="text/css" href="../../../css/normalize.css"> + <link rel="stylesheet" type="text/css" href="../../../css/bootstrap.css"> + <link rel="stylesheet" type="text/css" href="../../../css/owl.css"> + <link rel="stylesheet" type="text/css" href="../../../css/animate.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/font-awesome-4.1.0/css/font-awesome.min.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/eleganticons/et-icons.css"> + <link rel="stylesheet" type="text/css" href="../../../css/jqtree.css"> + <link rel="stylesheet" type="text/css" href="../../../css/idea.css"> + <link rel="stylesheet" type="text/css" href="../../../css/cardio.css"> + + <script type="text/javascript"> + + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-2717626-1']); + _gaq.push(['_setDomainName', 'apache.org']); + _gaq.push(['_trackPageview']); + + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + + </script> +</head> + +<body> + <div class="preloader"> + <img src="../../../img/loader.gif" alt="Preloader image"> + </div> + <nav class="navbar"> + <div class="container"> + <div class="row"> <div class="col-md-12"> + + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="/"> + <span> + + + <img src="../../../img/logo-active.png"> + + + </span> + Apache TomEE + </a> + </div> + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav navbar-right main-nav"> + <li><a href="../../../docs.html">Documentation</a></li> + <li><a href="../../../community/index.html">Community</a></li> + <li><a href="../../../security/security.html">Security</a></li> + <li><a href="../../../download-ng.html">Downloads</a></li> + </ul> + </div> + <!-- /.navbar-collapse --> + </div></div> + </div> + <!-- /.container-fluid --> + </nav> + + + <div id="main-block" class="container main-block"> + <div class="row title"> + <div class="col-md-12"> + <div class='page-header'> + + <h1>CDI @Qualifier</h1> + </div> + </div> + </div> + <div class="row"> + + <div class="col-md-12"> + <div class="sect1"> +<h2 id="_introdução">Introdução</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>As vezes precisamos escrever várias implementações para uma interface de regras de negócios, para aumentar o desacoplamento vamos injetar apenas a interface e o CDI vai escolher a implementação correta, para ajudar o CDI com esta escolha nós criamos os <strong>qualificadores</strong>.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_exemplo">Exemplo</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Neste exemplo, temos uma interface <code>Payment</code> e suas implementações: +* Cash +* CreditCard</p> +</div> +<div class="paragraph"> +<p>Em nosso teste (Payment Test) nós injetamos somente a interface Payment, sem o recurso Qualificador, o CDI não saberia qual implementação injetar no teste.</p> +</div> +<div class="paragraph"> +<p>Nós criamos um <strong>qualificador</strong> chamado <code>PaymentQualifier</code> um único qualificador com uma diferença, a anotação <code>@Qualifier</code>.</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>@Retention(RUNTIME) +@Target({ TYPE, FIELD, METHOD }) +@Qualifier +public @interface PaymentQualifier { + + PaymentType type(); +}</pre> +</div> +</div> +<div class="paragraph"> +<p>Este qualificador tem um método chamado <code>type()</code>, esse método ajudará o CDI a injetar corretamente a implementação. veja este enum:</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>public enum PaymentType { + + CASH, + CREDITCARD +}</pre> +</div> +</div> +<div class="paragraph"> +<p>agora veja uma implementação</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>@PaymentQualifier(type=PaymentType.CASH) +public class Cash implements Payment { + + @Override + public String pay() { + + return "cash"; + } +}</pre> +</div> +</div> +<div class="paragraph"> +<p>Cada implementação deve ser marcada com este qualificador.</p> +</div> +<div class="paragraph"> +<p>Como injetar ? veja a simplicidade</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>public class PaymentTest { + + private static EJBContainer container; + + @Inject + @PaymentQualifier(type=PaymentType.CREDITCARD) //qualificador informando o CDI sobre a implementação correta + private Payment paymentCreditCard; + + @Inject + @PaymentQualifier(type=PaymentType.CASH) //qualificador informando o CDI sobre a implementação correta + private Payment paymentCash; + + @BeforeClass + public static void start() { + container = EJBContainer.createEJBContainer(); + } + + @Before + public void setUp() throws Exception { + container.getContext().bind("inject", this); + } + + @Test + public void mustReturnCreditCard() { + + assertEquals(paymentCreditCard.pay(), "creditCard"); + } + + @Test + public void mustReturnCash() { + + assertEquals(paymentCash.pay(), "cash"); + } + + @AfterClass + public static void stop() { + container.close(); + } +}</pre> +</div> +</div> +</div> +</div> + </div> + + </div> + </div> +<footer> + <div class="container"> + <div class="row"> + <div class="col-sm-6 text-center-mobile"> + <h3 class="white">Be simple. Be certified. Be Tomcat.</h3> + <h5 class="light regular light-white">"A good application in a good server"</h5> + <ul class="social-footer"> + <li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li> + <li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li> + <li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li> + </ul> + </div> + <div class="col-sm-6 text-center-mobile"> + <div class="row opening-hours"> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/docs/documentation.html" class="white">Documentation</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li> + <li><a href="../../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li> + <li><a href="../../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li> + <li><a href="../../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/examples/" class="white">Examples</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li> + <li><a href="../../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li> + <li><a href="../../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li> + <li><a href="../../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../community/index.html" class="white">Community</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../community/contributors.html" class="regular light-white">Contributors</a></li> + <li><a href="../../../community/social.html" class="regular light-white">Social</a></li> + <li><a href="../../../community/sources.html" class="regular light-white">Sources</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../security/index.html" class="white">Security</a></h5> + <ul class="list-unstyled"> + <li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li> + <li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li> + <li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li> + </ul> + </div> + </div> + </div> + </div> + <div class="row bottom-footer text-center-mobile"> + <div class="col-sm-12 light-white"> + <p>Copyright © 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p> + </div> + </div> + </div> + </footer> + <!-- Holder for mobile navigation --> + <div class="mobile-nav"> + <ul> + <li><a hef="../../../latest/docs/admin/index.html">Administrators</a> + <li><a hef="../../../latest/docs/developer/index.html">Developers</a> + <li><a hef="../../../latest/docs/advanced/index.html">Advanced</a> + <li><a hef="../../../community/index.html">Community</a> + </ul> + <a href="#" class="close-link"><i class="arrow_up"></i></a> + </div> + <!-- Scripts --> + <script src="../../../js/jquery-1.11.1.min.js"></script> + <script src="../../../js/owl.carousel.min.js"></script> + <script src="../../../js/bootstrap.min.js"></script> + <script src="../../../js/wow.min.js"></script> + <script src="../../../js/typewriter.js"></script> + <script src="../../../js/jquery.onepagenav.js"></script> + <script src="../../../js/tree.jquery.js"></script> + <script src="../../../js/highlight.pack.js"></script> + <script src="../../../js/main.js"></script> + </body> + +</html> + Added: tomee/site/trunk/content/master/pt/examples/cdi-realm.html URL: http://svn.apache.org/viewvc/tomee/site/trunk/content/master/pt/examples/cdi-realm.html?rev=1866555&view=auto ============================================================================== --- tomee/site/trunk/content/master/pt/examples/cdi-realm.html (added) +++ tomee/site/trunk/content/master/pt/examples/cdi-realm.html Sat Sep 7 14:25:49 2019 @@ -0,0 +1,393 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Apache TomEE</title> + <meta name="description" + content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." /> + <meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" /> + <meta name="author" content="Luka Cvetinovic for Codrops" /> + <link rel="icon" href="../../../favicon.ico"> + <link rel="icon" type="image/png" href="../../../favicon.png"> + <meta name="msapplication-TileColor" content="#80287a"> + <meta name="theme-color" content="#80287a"> + <link rel="stylesheet" type="text/css" href="../../../css/normalize.css"> + <link rel="stylesheet" type="text/css" href="../../../css/bootstrap.css"> + <link rel="stylesheet" type="text/css" href="../../../css/owl.css"> + <link rel="stylesheet" type="text/css" href="../../../css/animate.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/font-awesome-4.1.0/css/font-awesome.min.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/eleganticons/et-icons.css"> + <link rel="stylesheet" type="text/css" href="../../../css/jqtree.css"> + <link rel="stylesheet" type="text/css" href="../../../css/idea.css"> + <link rel="stylesheet" type="text/css" href="../../../css/cardio.css"> + + <script type="text/javascript"> + + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-2717626-1']); + _gaq.push(['_setDomainName', 'apache.org']); + _gaq.push(['_trackPageview']); + + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + + </script> +</head> + +<body> + <div class="preloader"> + <img src="../../../img/loader.gif" alt="Preloader image"> + </div> + <nav class="navbar"> + <div class="container"> + <div class="row"> <div class="col-md-12"> + + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="/"> + <span> + + + <img src="../../../img/logo-active.png"> + + + </span> + Apache TomEE + </a> + </div> + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav navbar-right main-nav"> + <li><a href="../../../docs.html">Documentation</a></li> + <li><a href="../../../community/index.html">Community</a></li> + <li><a href="../../../security/security.html">Security</a></li> + <li><a href="../../../download-ng.html">Downloads</a></li> + </ul> + </div> + <!-- /.navbar-collapse --> + </div></div> + </div> + <!-- /.container-fluid --> + </nav> + + + <div id="main-block" class="container main-block"> + <div class="row title"> + <div class="col-md-12"> + <div class='page-header'> + + <h1>CDI Realm</h1> + </div> + </div> + </div> + <div class="row"> + + <div class="col-md-12"> + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Este exemplo mostra como proteger o acesso a um web resource fornecido por um servlet. Para isso, +usaremos realms.</p> +</div> +<div class="paragraph"> +<p>Um <a href="https://javaee.github.io/tutorial/security-intro005.html#BNBXJ">realm</a>, no ecossistema JavaEE, é +um domÃnio de politica de segurança definido para um web server ou um application server. Um realm +contém uma coleção de usuários, que podem ou não ser atribuÃdos a um grupo.</p> +</div> +<div class="paragraph"> +<p>Um realm, basicamente, especifica uma lista de usuários e funções. à um "banco de dados" de usuários +com senhas associadas e possÃveis papeis. A especificação de servlet não especifica uma API para +definir uma lista de usuários e funções para um determinado aplicativo. Por essa razão, o Tomcat +servlet container define uma interface, <code>org.apache.catalina.Realm</code>. Mais informações podem ser +encontradas <a href="https://tomcat.apache.org/tomcat-9.0-doc/realm-howto.html">aqui</a>.</p> +</div> +<div class="paragraph"> +<p>No servidor de aplicação TomEE, o mecanismo usado pelo Tomcat para definir um realm para um servlet +é reutilizado e aprimorado. Mais informações podem ser encontradas <a href="https://www.tomitribe.com/blog/tomee-security-episode-1-apache-tomcat-and-apache-tomee-security-under-the-covers">aqui</a>.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_exemplo">Exemplo</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Este exemplo mostra um secured servlet (servlet seguro/protegido) usando um realm. O secured servlet +tem uma funcionalidade simples, apenas ilustrar os conceitos aqui explicados:</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet("/servlet") +public class SecuredServlet extends HttpServlet { + @Override + protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { + resp.getWriter().write("Servlet!"); + } +}</pre> +</div> +</div> +<div class="paragraph"> +<p>Para proteger este servlet, adicionaremos a seguinte classe:</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>import javax.enterprise.context.RequestScoped; +import java.security.Principal; + +@RequestScoped // just to show we can be bound to the request but @ApplicationScoped is what makes sense +public class AuthBean { + public Principal authenticate(final String username, String password) { + if (("userA".equals(username) || "userB".equals(username)) && "test".equals(password)) { + return new Principal() { + @Override + public String getName() { + return username; + } + + @Override + public String toString() { + return username; + } + }; + } + return null; + } + + public boolean hasRole(final Principal principal, final String role) { + return principal != null && ( + principal.getName().equals("userA") && (role.equals("admin") + || role.equals("user")) + || principal.getName().equals("userB") && (role.equals("user")) + ); + } +}</pre> +</div> +</div> +<div class="paragraph"> +<p>A classe define dois métodos: <code>authenticate</code> e <code>hasRole</code>. +Ambos métodos vão ser utilizados pela classe <code>LazyRealm</code>, implementada no servidor de aplicação TomEE. +Este realm é configurado no arquivo <code>webapp/META-INF/context.xml</code>:</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre><Context preemptiveAuthentication="true"> + <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" /> + <Realm className="org.apache.tomee.catalina.realm.LazyRealm" + cdi="true" realmClass="org.superbiz.AuthBean"/> +</Context></pre> +</div> +</div> +<div class="paragraph"> +<p>A classe <code>AuthBean</code> define um "banco de dados" com dois usuários: userA (papel de admin) e +userB (papel de usuário), ambos possuem a senha test. +A classe <code>org.apache.tomee.catalina.realm.LazyRealm</code> vai carregar nossa classe <code>AuthBean</code> e vai usa-la +para verificar se um usuário tem acesso ao conteúdo fornecido pelo nosso servlet.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_testes">Testes</h2> +<div class="sectionbody"> +<div class="literalblock"> +<div class="content"> +<pre>import org.apache.http.HttpHost; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.AuthCache; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.apache.openejb.arquillian.common.IO; +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.asset.FileAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +@RunWith(Arquillian.class) +public class AuthBeanTest { + @Deployment(testable = false) + public static WebArchive createDeployment() { + return ShrinkWrap.create(WebArchive.class, "low-typed-realm.war") + .addClasses(SecuredServlet.class, AuthBean.class) + .addAsManifestResource(new FileAsset(new File("src/main/webapp/META-INF/context.xml")), "context.xml") + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); + } + + @ArquillianResource + private URL webapp; + + @Test + public void success() throws IOException { + assertEquals("200 Servlet!", get("userA", "test")); + } + + @Test + public void failure() throws IOException { + assertThat(get("userA", "oops, wrong password"), startsWith("401")); + } + + private String get(final String user, final String password) { + final BasicCredentialsProvider basicCredentialsProvider = new BasicCredentialsProvider(); + basicCredentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, password)); + final CloseableHttpClient client = HttpClients.custom() + .setDefaultCredentialsProvider(basicCredentialsProvider).build(); + + final HttpHost httpHost = new HttpHost(webapp.getHost(), webapp.getPort(), webapp.getProtocol()); + final AuthCache authCache = new BasicAuthCache(); + final BasicScheme basicAuth = new BasicScheme(); + authCache.put(httpHost, basicAuth); + final HttpClientContext context = HttpClientContext.create(); + context.setAuthCache(authCache); + + final HttpGet get = new HttpGet(webapp.toExternalForm() + "servlet"); + CloseableHttpResponse response = null; + try { + response = client.execute(httpHost, get, context); + return response.getStatusLine().getStatusCode() + " " + EntityUtils.toString(response.getEntity()); + } catch (final IOException e) { + throw new IllegalStateException(e); + } finally { + try { + IO.close(response); + } catch (final IOException e) { + // no-op + } + } + } +}</pre> +</div> +</div> +<div class="paragraph"> +<p>O teste usa o Arquillian para iniciar o servidor de aplicação e carregar o servlet. +Existem dois métodos de teste: <code>success</code>, onde nosso servlet é acessado com o usuário e senha corretos, +e <code>failure</code>, onde nosso servlet é acessado com uma senha incorreta.</p> +</div> +<div class="paragraph"> +<p>O exemplo completo pode ser encontrado <a href="https://github.com/apache/tomee/tree/master/examples/cdi-realm">aqui</a>. +à um projeto Maven, e o teste pode ser executado com o comando <code>mvn clean install</code>.</p> +</div> +</div> +</div> + </div> + + </div> + </div> +<footer> + <div class="container"> + <div class="row"> + <div class="col-sm-6 text-center-mobile"> + <h3 class="white">Be simple. Be certified. Be Tomcat.</h3> + <h5 class="light regular light-white">"A good application in a good server"</h5> + <ul class="social-footer"> + <li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li> + <li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li> + <li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li> + </ul> + </div> + <div class="col-sm-6 text-center-mobile"> + <div class="row opening-hours"> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/docs/documentation.html" class="white">Documentation</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li> + <li><a href="../../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li> + <li><a href="../../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li> + <li><a href="../../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/examples/" class="white">Examples</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li> + <li><a href="../../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li> + <li><a href="../../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li> + <li><a href="../../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../community/index.html" class="white">Community</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../community/contributors.html" class="regular light-white">Contributors</a></li> + <li><a href="../../../community/social.html" class="regular light-white">Social</a></li> + <li><a href="../../../community/sources.html" class="regular light-white">Sources</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../security/index.html" class="white">Security</a></h5> + <ul class="list-unstyled"> + <li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li> + <li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li> + <li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li> + </ul> + </div> + </div> + </div> + </div> + <div class="row bottom-footer text-center-mobile"> + <div class="col-sm-12 light-white"> + <p>Copyright © 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p> + </div> + </div> + </div> + </footer> + <!-- Holder for mobile navigation --> + <div class="mobile-nav"> + <ul> + <li><a hef="../../../latest/docs/admin/index.html">Administrators</a> + <li><a hef="../../../latest/docs/developer/index.html">Developers</a> + <li><a hef="../../../latest/docs/advanced/index.html">Advanced</a> + <li><a hef="../../../community/index.html">Community</a> + </ul> + <a href="#" class="close-link"><i class="arrow_up"></i></a> + </div> + <!-- Scripts --> + <script src="../../../js/jquery-1.11.1.min.js"></script> + <script src="../../../js/owl.carousel.min.js"></script> + <script src="../../../js/bootstrap.min.js"></script> + <script src="../../../js/wow.min.js"></script> + <script src="../../../js/typewriter.js"></script> + <script src="../../../js/jquery.onepagenav.js"></script> + <script src="../../../js/tree.jquery.js"></script> + <script src="../../../js/highlight.pack.js"></script> + <script src="../../../js/main.js"></script> + </body> + +</html> + Added: tomee/site/trunk/content/master/pt/examples/cdi-request-scope.html URL: http://svn.apache.org/viewvc/tomee/site/trunk/content/master/pt/examples/cdi-request-scope.html?rev=1866555&view=auto ============================================================================== --- tomee/site/trunk/content/master/pt/examples/cdi-request-scope.html (added) +++ tomee/site/trunk/content/master/pt/examples/cdi-request-scope.html Sat Sep 7 14:25:49 2019 @@ -0,0 +1,368 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Apache TomEE</title> + <meta name="description" + content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." /> + <meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" /> + <meta name="author" content="Luka Cvetinovic for Codrops" /> + <link rel="icon" href="../../../favicon.ico"> + <link rel="icon" type="image/png" href="../../../favicon.png"> + <meta name="msapplication-TileColor" content="#80287a"> + <meta name="theme-color" content="#80287a"> + <link rel="stylesheet" type="text/css" href="../../../css/normalize.css"> + <link rel="stylesheet" type="text/css" href="../../../css/bootstrap.css"> + <link rel="stylesheet" type="text/css" href="../../../css/owl.css"> + <link rel="stylesheet" type="text/css" href="../../../css/animate.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/font-awesome-4.1.0/css/font-awesome.min.css"> + <link rel="stylesheet" type="text/css" href="../../../fonts/eleganticons/et-icons.css"> + <link rel="stylesheet" type="text/css" href="../../../css/jqtree.css"> + <link rel="stylesheet" type="text/css" href="../../../css/idea.css"> + <link rel="stylesheet" type="text/css" href="../../../css/cardio.css"> + + <script type="text/javascript"> + + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-2717626-1']); + _gaq.push(['_setDomainName', 'apache.org']); + _gaq.push(['_trackPageview']); + + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + + </script> +</head> + +<body> + <div class="preloader"> + <img src="../../../img/loader.gif" alt="Preloader image"> + </div> + <nav class="navbar"> + <div class="container"> + <div class="row"> <div class="col-md-12"> + + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="/"> + <span> + + + <img src="../../../img/logo-active.png"> + + + </span> + Apache TomEE + </a> + </div> + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav navbar-right main-nav"> + <li><a href="../../../docs.html">Documentation</a></li> + <li><a href="../../../community/index.html">Community</a></li> + <li><a href="../../../security/security.html">Security</a></li> + <li><a href="../../../download-ng.html">Downloads</a></li> + </ul> + </div> + <!-- /.navbar-collapse --> + </div></div> + </div> + <!-- /.container-fluid --> + </nav> + + + <div id="main-block" class="container main-block"> + <div class="row title"> + <div class="col-md-12"> + <div class='page-header'> + + <h1>CDI @RequestScoped</h1> + </div> + </div> + </div> + <div class="row"> + + <div class="col-md-12"> + <div id="preamble"> +<div class="sectionbody"> +<div class="paragraph"> +<p>Este exemplo mostra o uso da anotação <code>@RequestScoped</code> para objetos injetados. Um objeto que é +definido como <code>@RequestScoped</code> é criado uma vez para cada requisição e é compartilhado por todos os +beans que o injetam através do mesmo request.</p> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_exemplo">Exemplo</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Este exemplo retrata um cenário similar ao cdi-application-scope. O visitante de um restaurante +pede uma sopa ao garçom. O pedido é passado para o chefe que prepara o prato e o devolve ao garçom +que entrega para o visitante.</p> +</div> +<div class="sect2"> +<h3 id="_waiter_garçom">Waiter (garçom)</h3> +<div class="paragraph"> +<p>O <code>Waiter</code> session bean recebe uma requisição através do método <code>orderSoup()</code> da classe de teste. +Uma instância de <code>Soup</code> será criada nesse método e ela será compartilhada em toda a requisição com o +bean <code>Chef</code>. O método passa o request para o bean <code>Chef</code>. Ele então retorna o nome da sopa para a +classe de teste.</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>@Stateless +public class Waiter { + + @Inject + private Soup soup; + + @EJB + private Chef chef; + + public String orderSoup(String name){ + soup.setName(name); + return chef.prepareSoup().getName(); + } +}</pre> +</div> +</div> +</div> +<div class="sect2"> +<h3 id="_soup_sopa">Soup (sopa)</h3> +<div class="paragraph"> +<p>A classe <code>Soup</code> é um POJO injetável, definida como <code>@RequestScoped</code>. Isso significa que uma instância +será criada apenas uma vez para cada request e será compartilhada por todos os beans que a injetam.</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>@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; + } +}</pre> +</div> +</div> +</div> +<div class="sect2"> +<h3 id="_chef">Chef</h3> +<div class="paragraph"> +<p>A classe <code>Chef</code> é um simples session bean com um campo <code>Soup</code> injetado. Normalmente, o parâmetro soup +seria passado para o <code>prepareSoup()</code> como argumento, mas para as necessidades deste exemplo será +passado pelo contexto da requisição.</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>@Stateless +public class Chef { + + @Inject + private Soup soup; + + public Soup prepareSoup() { + return soup; + } +}</pre> +</div> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_caso_de_teste">Caso de teste</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Esta é a classe de entrada para este exemplo.</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>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(); + } +}</pre> +</div> +</div> +</div> +</div> +<div class="sect1"> +<h2 id="_executando">Executando</h2> +<div class="sectionbody"> +<div class="paragraph"> +<p>Na saida você pode ver que existem duas instâncias de <code>Soup</code> criadas - uma para cada requisição.</p> +</div> +<div class="literalblock"> +<div class="content"> +<pre>------------------------------------------------------- + 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</pre> +</div> +</div> +</div> +</div> + </div> + + </div> + </div> +<footer> + <div class="container"> + <div class="row"> + <div class="col-sm-6 text-center-mobile"> + <h3 class="white">Be simple. Be certified. Be Tomcat.</h3> + <h5 class="light regular light-white">"A good application in a good server"</h5> + <ul class="social-footer"> + <li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li> + <li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li> + <li><a href="https://plus.google.com/communities/105208241852045684449"><i class="fa fa-google-plus"></i></a></li> + </ul> + </div> + <div class="col-sm-6 text-center-mobile"> + <div class="row opening-hours"> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/docs/documentation.html" class="white">Documentation</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li> + <li><a href="../../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li> + <li><a href="../../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li> + <li><a href="../../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../latest/examples/" class="white">Examples</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li> + <li><a href="../../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li> + <li><a href="../../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li> + <li><a href="../../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../community/index.html" class="white">Community</a></h5> + <ul class="list-unstyled"> + <li><a href="../../../community/contributors.html" class="regular light-white">Contributors</a></li> + <li><a href="../../../community/social.html" class="regular light-white">Social</a></li> + <li><a href="../../../community/sources.html" class="regular light-white">Sources</a></li> + </ul> + </div> + <div class="col-sm-3 text-center-mobile"> + <h5><a href="../../../security/index.html" class="white">Security</a></h5> + <ul class="list-unstyled"> + <li><a href="http://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li> + <li><a href="http://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li> + <li><a href="http://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li> + </ul> + </div> + </div> + </div> + </div> + <div class="row bottom-footer text-center-mobile"> + <div class="col-sm-12 light-white"> + <p>Copyright © 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p> + </div> + </div> + </div> + </footer> + <!-- Holder for mobile navigation --> + <div class="mobile-nav"> + <ul> + <li><a hef="../../../latest/docs/admin/index.html">Administrators</a> + <li><a hef="../../../latest/docs/developer/index.html">Developers</a> + <li><a hef="../../../latest/docs/advanced/index.html">Advanced</a> + <li><a hef="../../../community/index.html">Community</a> + </ul> + <a href="#" class="close-link"><i class="arrow_up"></i></a> + </div> + <!-- Scripts --> + <script src="../../../js/jquery-1.11.1.min.js"></script> + <script src="../../../js/owl.carousel.min.js"></script> + <script src="../../../js/bootstrap.min.js"></script> + <script src="../../../js/wow.min.js"></script> + <script src="../../../js/typewriter.js"></script> + <script src="../../../js/jquery.onepagenav.js"></script> + <script src="../../../js/tree.jquery.js"></script> + <script src="../../../js/highlight.pack.js"></script> + <script src="../../../js/main.js"></script> + </body> + +</html> +
