blob: a918adace5dff1bd9c9388d723aaf9399dc7b6eb [file] [log] [blame]
<!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>Injeção do EntityManager</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Neste exemplo é mostrado o uso do <code>@PersistenceContext</code> para se ter um <code>EntityManager</code> com um
persistence context <code>EXTENDED</code>, injetado em um bean <code>@Stateful</code>. Um bean do tipo <code>@Entity</code> JPA, é
usado com o <code>EntityManager</code> para criar, inserir e alterar dados em um banco de dados.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_criando_uma_entidade_jpa">Criando uma entidade JPA</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A entidade por si é simples um pojo com a anotação <code>@Entity</code>. Nós criamos uma chamada <code>Movie</code> o qual nós queremos usar para armazenar registros de filmes.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>package org.superbiz.injection.jpa;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>import jakarta.persistence.Entity;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>@Entity
public class Movie {</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>@Id @GeneratedValue
private long id;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>private String director;
private String title;
private int year;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public Movie() {
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public long getId() {
return id;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void setId(long id) {
this.id = id;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public Movie(String director, String title, int year) {
this.director = director;
this.title = title;
this.year = year;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public String getDirector() {
return director;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void setDirector(String director) {
this.director = director;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public String getTitle() {
return title;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void setTitle(String title) {
this.title = title;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public int getYear() {
return year;
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre> public void setYear(int year) {
this.year = year;
}
}</pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_configuração_do_entitymanager_através_do_arquivo_persistence_xml">Configuração do EntityManager através do arquivo persistence.xml</h2>
<div class="sectionbody">
<div class="paragraph">
<p>A entidade <code>Movie</code> acima foi criada, removida, atualizada ou deletada através do objeto <code>EntityManager</code>. O <code>EntityManager</code> por si só é
configurado através do arquivo <code>META-INF/persistence.xml</code> que é colocado no mesmo jar que a entidade <code>Movie</code>.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"&gt;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;persistence-unit name="movie-unit"&gt;
&lt;jta-data-source&gt;movieDatabase&lt;/jta-data-source&gt;
&lt;non-jta-data-source&gt;movieDatabaseUnmanaged&lt;/non-jta-data-source&gt;
&lt;class&gt;org.superbiz.injection.jpa.Movie&lt;/class&gt;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre> &lt;properties&gt;
&lt;property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/&gt;
&lt;/properties&gt;
&lt;/persistence-unit&gt;
&lt;/persistence&gt;</pre>
</div>
</div>
<div class="paragraph">
<p>Informo que a entidade <code>Movie</code> está listada através do elemento <code>&lt;class&gt;</code>. Isto não é requerido, mas pode nos ajudar
quando testamos ou quando a classe <code>Movie</code> estiver localizada em um jar e que o jar contenha o arquivo <code>persistence.xml</code>.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_injeção_através_do_persistencecontext">Injeção através do @PersistenceContext</h2>
<div class="sectionbody">
<div class="paragraph">
<p>O <code>EntityManager</code> por si só, é criado como um contêiner e a informação é usada no <code>persistence.xml</code>, e ai para se usar isto
em tempo de execução, nós simplesmente precisamos requisitar que isto seja injetado dentro de seus componentes.
Nós iremos fazer isso através do <code>@PersistenceContext</code>.</p>
</div>
<div class="paragraph">
<p>A anotação <code>@PersistenceContext</code>, precisa de alguma forma ser usada em qualquer bean CDI, EJB, Servlet, Servlet Listener, Servlet Filter, ou JSF ManagedBean.
Se você não usa EJB, você precisa ter de utilizar um <code>UserTransaction</code>, para criar e submeter transações manualmente.
Uma transação é requerida, para alguém que utilizou de métodos de criação, atualização ou deleção para trabalhar com o EntityManager.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>package org.superbiz.injection.jpa;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>import jakarta.ejb.Stateful;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.PersistenceContextType;
import jakarta.persistence.Query;
import java.util.List;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>@Stateful
public class Movies {</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>@PersistenceContext(unitName = "movie-unit", type = PersistenceContextType.EXTENDED)
private EntityManager entityManager;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void addMovie(Movie movie) throws Exception {
entityManager.persist(movie);
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void deleteMovie(Movie movie) throws Exception {
entityManager.remove(movie);
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre> public List&lt;Movie&gt; getMovies() throws Exception {
Query query = entityManager.createQuery("SELECT m from Movie as m");
return query.getResultList();
}
}</pre>
</div>
</div>
<div class="paragraph">
<p>Por um motivo particular o <code>EntityManager</code> é injetado como um persistence context <code>EXTENDED</code>, qual o simples meio para que o <code>EntityManager</code>
seja criado quando o bean <code>@Stateful</code> é criado e destruído, quando o bean <code>@Stateful</code> é destruído. Simplesmente, o dado é colocado
no <code>EntityManager</code> que é cacheado para o tempo de vida do bean <code>@Stateful</code>.</p>
</div>
<div class="paragraph">
<p>O uso de persistence contexts <code>EXTENDED</code> está <strong>somente</strong> disponível para beans <code>@Stateful</code>. Veja na página [Conceitos JPA](../../jpa-concepts.html)
para um alto nível de explicação do que o "persistence context" é realmente, e de que forma isto é importante para o JPA.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_executando_o_teste_moviestest">Executando o teste MoviesTest</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Testar JPA é muito fácil, nós podemos simplesmente usar a API <code>EJBContainer</code> para criar um contêiner no nosso caso de teste.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>package org.superbiz.injection.jpa;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>import junit.framework.TestCase;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>import jakarta.ejb.embeddable.EJBContainer;
import javax.naming.Context;
import java.util.List;
import java.util.Properties;</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>//START SNIPPET: code
public class MoviesTest extends TestCase {</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>public void test() throws Exception {</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>final Properties p = new Properties();
p.put("movieDatabase", "new://Resource?type=DataSource");
p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>final Context context = EJBContainer.createEJBContainer(p).getContext();</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Movies movies = (Movies) context.lookup("java:global/injection-of-entitymanager/Movies");</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>movies.addMovie(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
movies.addMovie(new Movie("Joel Coen", "Fargo", 1996));
movies.addMovie(new Movie("Joel Coen", "The Big Lebowski", 1998));</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>List&lt;Movie&gt; list = movies.getMovies();
assertEquals("List.size()", 3, list.size());</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>for (Movie movie : list) {
movies.deleteMovie(movie);
}</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre> assertEquals("Movies.getMovies()", 0, movies.getMovies().size());
}
}</pre>
</div>
</div>
</div>
</div>
<h1 id="_rodando_a_aplicação" class="sect0">Rodando a aplicação</h1>
<div class="paragraph">
<p>Quando nós executarmos nosso caso de teste, veremos uma saída semelhante com a seguinte.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.superbiz.injection.jpa.MoviesTest
Apache OpenEJB 4.0.0-beta-1 build: 20111002-04:06
http://tomee.apache.org/
INFO - openejb.home = /Users/dblevins/examples/injection-of-entitymanager
INFO - openejb.base = /Users/dblevins/examples/injection-of-entitymanager
INFO - Using 'jakarta.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 - Configuring Service(id=movieDatabase, type=Resource, provider-id=Default JDBC Database)
INFO - Found EjbModule in classpath: /Users/dblevins/examples/injection-of-entitymanager/target/classes
INFO - Beginning load: /Users/dblevins/examples/injection-of-entitymanager/target/classes
INFO - Configuring enterprise application: /Users/dblevins/examples/injection-of-entitymanager
INFO - Configuring Service(id=Default Stateful Container, type=Container, provider-id=Default Stateful Container)
INFO - Auto-creating a container for bean Movies: Container(type=STATEFUL, id=Default Stateful Container)
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean org.superbiz.injection.jpa.MoviesTest: Container(type=MANAGED, id=Default Managed Container)
INFO - Configuring PersistenceUnit(name=movie-unit)
INFO - Auto-creating a Resource with id 'movieDatabaseNonJta' of type 'DataSource for 'movie-unit'.
INFO - Configuring Service(id=movieDatabaseNonJta, type=Resource, provider-id=movieDatabase)
INFO - Adjusting PersistenceUnit movie-unit &lt;non-jta-data-source&gt; to Resource ID 'movieDatabaseNonJta' from 'movieDatabaseUnmanaged'
INFO - Enterprise application "/Users/dblevins/examples/injection-of-entitymanager" loaded.
INFO - Assembling app: /Users/dblevins/examples/injection-of-entitymanager
INFO - PersistenceUnit(name=movie-unit, provider=org.apache.openjpa.persistence.PersistenceProviderImpl) - provider time 462ms
INFO - Jndi(name="java:global/injection-of-entitymanager/Movies!org.superbiz.injection.jpa.Movies")
INFO - Jndi(name="java:global/injection-of-entitymanager/Movies")
INFO - Jndi(name="java:global/EjbModule1461341140/org.superbiz.injection.jpa.MoviesTest!org.superbiz.injection.jpa.MoviesTest")
INFO - Jndi(name="java:global/EjbModule1461341140/org.superbiz.injection.jpa.MoviesTest")
INFO - Created Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container)
INFO - Created Ejb(deployment-id=org.superbiz.injection.jpa.MoviesTest, ejb-name=org.superbiz.injection.jpa.MoviesTest, container=Default Managed Container)
INFO - Started Ejb(deployment-id=Movies, ejb-name=Movies, container=Default Stateful Container)
INFO - Started Ejb(deployment-id=org.superbiz.injection.jpa.MoviesTest, ejb-name=org.superbiz.injection.jpa.MoviesTest, container=Default Managed Container)
INFO - Deployed Application(path=/Users/dblevins/examples/injection-of-entitymanager)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.301 sec</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Results :</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Tests run: 1, Failures: 0, Errors: 0, Skipped: 0</pre>
</div>
</div>
<div class="sect1">
<h2 id="_teste_de_performance">Teste de Performance</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_pré_requisitos">Pré-requisitos</h3>
<div class="ulist">
<ul>
<li>
<p>Oralce DB</p>
<div class="ulist">
<ul>
<li>
<p>Atualize seu arquivo maven <code>setings.xml</code> para conter na seção <code>&lt;servers&gt;</code> a seguinte entrada:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;server&gt;
&lt;id&gt;maven.oracle.com &lt;/id&gt;
&lt;username&gt;YourOracleAccountUsername&lt;/username&gt;
&lt;password&gt;YourOracleAccountPassword&lt;/password&gt;
&lt;configuration&gt;
&lt;basicAuthScope&gt;
&lt;host&gt;ANY &lt;/host&gt;
&lt;port&gt;ANY &lt;/port&gt;
&lt;realm&gt;OAM 11g &lt;/realm&gt;
&lt;/basicAuthScope&gt;
&lt;httpConfiguration&gt;
&lt;all&gt;
&lt;params&gt;
&lt;property&gt;
&lt;name&gt;http.protocol.allow-circular-redirects &lt;/name&gt;
&lt;value&gt;%b,true &lt;/value&gt;
&lt;/property&gt;
&lt;/params&gt;
&lt;/all&gt;
&lt;/httpConfiguration&gt;
&lt;/configuration&gt;
&lt;/server&gt;
```</pre>
</div>
</div>
</li>
<li>
<p>Atualize o arquivo <code>pom.xml</code>, na seção <code>&lt;dependency&gt;</code> com a entrada:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;dependency&gt;
&lt;groupId&gt;com.oracle.jdbc&lt;/groupId&gt;
&lt;artifactId&gt;ojdbc8&lt;/artifactId&gt;
&lt;version&gt;18.3.0.0&lt;/version&gt;
&lt;scope&gt;provided&lt;/scope&gt;
&lt;/dependency&gt;
```</pre>
</div>
</div>
</li>
<li>
<p>Atualize o arquivo <code>pom.xml</code>, seção <code>&lt;repositories&gt;</code> com a entrada:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;repository&gt;
&lt;id&gt;maven.oracle.com&lt;/id&gt;
&lt;name&gt;oracle-maven-repo&lt;/name&gt;
&lt;url&gt;https://maven.oracle.com&lt;/url&gt;
&lt;layout&gt;default&lt;/layout&gt;
&lt;releases&gt;
&lt;enabled&gt;true&lt;/enabled&gt;
&lt;updatePolicy&gt;always&lt;/updatePolicy&gt;
&lt;/releases&gt;
&lt;/repository&gt;
```</pre>
</div>
</div>
</li>
<li>
<p>Atualize o arquivo <code>pom.xml</code>, depois da seção <code>&lt;/repositories&gt;</code>, adicionando a entrada:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;pluginRepositories&gt;
&lt;pluginRepository&gt;
&lt;id&gt;maven.oracle.com&lt;/id&gt;
&lt;name&gt;oracle-maven-repo&lt;/name&gt;
&lt;url&gt;https://maven.oracle.com&lt;/url&gt;
&lt;layout&gt;default&lt;/layout&gt;
&lt;releases&gt;
&lt;enabled&gt;true&lt;/enabled&gt;
&lt;updatePolicy&gt;always&lt;/updatePolicy&gt;
&lt;/releases&gt;
&lt;/pluginRepository&gt;
&lt;/pluginRepositories&gt;
```</pre>
</div>
</div>
</li>
<li>
<p>Atualize o arquivo <code>pom.xml</code>, adicionando o tipo de jar JDBC para o tomee-maven-plugin:</p>
<div class="literalblock">
<div class="content">
<pre>```xml
&lt;plugin&gt;
&lt;groupId&gt;org.apache.tomee.maven&lt;/groupId&gt;
&lt;artifactId&gt;tomee-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;${tomee.version}&lt;/version&gt;
&lt;configuration&gt;
&lt;tomeeVersion&gt;${tomee.version}&lt;/tomeeVersion&gt;
&lt;tomeeClassifier&gt;plume&lt;/tomeeClassifier&gt;
&lt;tomeeHttpPort&gt;9080&lt;/tomeeHttpPort&gt;
&lt;tomeeShutdownPort&gt;9005&lt;/tomeeShutdownPort&gt;
&lt;libs&gt;
&lt;lib&gt;com.oracle.jdbc:ojdbc8:18.3.0.0&lt;/lib&gt;
&lt;/libs&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
```</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Para além dessas informações sobre configuração do Oracle JDBC no Maven, você pode verificar em [Oracle Article](https://blogs.oracle.com/dev2dev/get-oracle-jdbc-drivers-and-ucp-from-oracle-maven-repository-without-ides)</pre>
</div>
</div>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_rodando_a_aplicação_2">Rodando a aplicação</h3>
<div class="paragraph">
<p>Em um terminal</p>
</div>
<div class="literalblock">
<div class="content">
<pre>mvn clean install tomee:run</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_rodando_o_grinder_console">Rodando o Grinder console</h3>
<div class="paragraph">
<p>Em um terminal execute:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>./grinder.sh</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>Uma vez que o painel de controle UI está disponível, pressione o botão `Start the worker processes`</pre>
</div>
</div>
<div class="literalblock">
<div class="content">
<pre>O teste de carga vai continuar enquanto você não pressionar no painel de controle o botão `Stop the worker processes and the agent processes`</pre>
</div>
</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/" 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 &copy; 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>