Author: buildbot
Date: Sat Oct 19 09:02:49 2013
New Revision: 883263
Log:
Staging update by buildbot for openwebbeans
Added:
websites/staging/openwebbeans/trunk/content/testing_cdictrl.html
Modified:
websites/staging/openwebbeans/trunk/content/ (props changed)
Propchange: websites/staging/openwebbeans/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Sat Oct 19 09:02:49 2013
@@ -1 +1 @@
-1533708
+1533716
Added: websites/staging/openwebbeans/trunk/content/testing_cdictrl.html
==============================================================================
--- websites/staging/openwebbeans/trunk/content/testing_cdictrl.html (added)
+++ websites/staging/openwebbeans/trunk/content/testing_cdictrl.html Sat Oct 19
09:02:49 2013
@@ -0,0 +1,247 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta charset="utf-8">
+ <title>Apache OpenWebBeans</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="">
+
+ <!-- Le styles -->
+ <link href="./resources/css/bootstrap.css" rel="stylesheet">
+ <style type="text/css">
+ body {
+ padding-top: 60px;
+ padding-bottom: 40px;
+ }
+ </style>
+ <link
href="http://twitter.github.com/bootstrap/assets/css/bootstrap-responsive.css"
rel="stylesheet">
+ <link href="./resources/css/main.css" rel="stylesheet">
+
+</head>
+
+<body>
+
+<div class="navbar navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="btn btn-navbar" data-toggle="collapse"
data-target=".nav-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </a>
+ <a class="brand" href="index.html"><img
src="./resources/images/logo_dbg-small.png" height="25px"
+ alt="owb_logo_small"/></a>
+
+ <div class="nav-collapse">
+ <ul class="nav">
+ <li class="active"><a href="./index.html">Home</a></li>
+ <li><a href="./documentation.html">Documentation</a></li>
+ <li><a href="./source.html">Source</a></li>
+ <li><a href="./download.html">Download</a></li>
+ <li><a href="./community.html">Community</a></li>
+ <!-- <li><a href="./news.html">News</a></li> -->
+ <li class="dropdown">
+ <a class="dropdown-toggle"
+ data-toggle="dropdown"
+ href="#">
+ Misc
+ <b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li><a href="http://www.apache.org">Apache
Home</a></li>
+ <li><a href="./misc/contact.html">Contact</a></li>
+ <li><a href="./misc/legal.html">Legal</a></li>
+ <li><a
href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
+ <li><a
href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+ <!-- <li class="divider"/> -->
+ </ul>
+ </li>
+ </ul>
+ </div>
+ <!--/.nav-collapse -->
+ <form id="search-form" action="http://www.google.com/search"
method="get" class="navbar-search pull-right">
+ <input value="openwebbeans.apache.org" name="sitesearch"
type="hidden"/>
+ <input class="search-query" name="q" id="query" type="text"/>
+ </form>
+ <script type="text/javascript"
src="http://www.google.com/coop/cse/brand?form=search-form"></script>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+
+
+ <div id="OwbContent_" class="wiki-content">
+<h1 id="testing-your-application-with-apache-deltaspike-cdictrl">Testing your
application with Apache DeltaSpike CdiCtrl</h1>
+<h2 id="about-cdictrl">About CdiCtrl</h2>
+<p><code>CdiCtrl</code> is <em>not</em> part of Apache OpenWebBeans but a
module of
+<a href="http://deltaspike.apache.org">Apache DeltaSpike</a>. </p>
+<p>The <code>CdiCtrl</code> interface abstracts away all the logic to boot a
CDI Container
+and controls the lifecycle of it's Contexts (Request Context, Session Context,
etc).</p>
+<p>The actual CDI Container is determined by using the
<code>java.util.ServiceLoader</code>.
+There are a few different implementations available. Besides Apache
OpenWebBeans
+there are also plugins for JBoss Weld and <a
href="http://tomee.apache.org">Apache TomEE</a>. </p>
+<h2 id="why-use-cdictrl-for-your-unit-tests">Why use CdiCtrl for your unit
tests?</h2>
+<p>Whenever you need to write unit tests for a full application, then you will
need to
+have a CDI container scann all your classes, create <code>Bean<T></code>
from it and provide
+them for injection. All this can be done by either using JUnits
<code>@RunWith</code> or
+by simply creating a common base class for your unit tests which boots up the
+container on your test classpath.</p>
+<p>There is no need to restart the container for each and every of your unit
tests
+as this would cause a big performance loss. Instead it is usually sufficient
to
+use the CdiCtrls <code>ContextControl</code> mechanism to just stop and
restart the
+respective CDI Contexts.</p>
+<p>Such a base class could look roughly like the following:</p>
+<div class="codehilite"><pre><span class="kd">public</span> <span
class="kd">abstract</span> <span class="kd">class</span> <span
class="nc">ContainerTest</span> <span class="o">{</span>
+
+ <span class="kd">protected</span> <span class="kd">static</span> <span
class="kd">volatile</span> <span class="n">CdiContainer</span> <span
class="n">cdiContainer</span><span class="o">;</span>
+ <span class="c1">// nice to know, since testng executes tests in
parallel.</span>
+ <span class="kd">protected</span> <span class="kd">static</span> <span
class="kt">int</span> <span class="n">containerRefCount</span> <span
class="o">=</span> <span class="mi">0</span><span class="o">;</span>
+
+ <span class="kd">private</span> <span class="kd">static</span> <span
class="kd">final</span> <span class="n">Logger</span> <span
class="n">logger</span> <span class="o">=</span> <span
class="n">LoggerFactory</span><span class="o">.</span><span
class="na">getLogger</span><span class="o">(</span><span
class="n">ContainerTest</span><span class="o">.</span><span
class="na">class</span><span class="o">);</span>
+
+ <span class="kd">protected</span> <span class="n">ProjectStage</span>
<span class="nf">runInProjectStage</span><span class="o">()</span> <span
class="o">{</span>
+ <span class="k">return</span> <span class="n">ProjectStage</span><span
class="o">.</span><span class="na">UnitTest</span><span class="o">;</span>
+ <span class="o">}</span>
+
+ <span class="cm">/**</span>
+<span class="cm"> * Starts container</span>
+<span class="cm"> * @throws Exception in case of severe problem</span>
+<span class="cm"> */</span>
+ <span class="nd">@BeforeMethod</span>
+ <span class="kd">public</span> <span class="kd">final</span> <span
class="kt">void</span> <span class="nf">beforeMethod</span><span
class="o">()</span> <span class="kd">throws</span> <span
class="n">Exception</span> <span class="o">{</span>
+ <span class="n">containerRefCount</span><span class="o">++;</span>
+
+ <span class="k">if</span> <span class="o">(</span><span
class="n">cdiContainer</span> <span class="o">==</span> <span
class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="c1">// setting up the Apache DeltaSpike
ProjectStage</span>
+ <span class="n">ProjectStage</span> <span
class="n">projectStage</span> <span class="o">=</span> <span
class="n">runInProjectStage</span><span class="o">();</span>
+ <span class="n">ProjectStageProducer</span><span
class="o">.</span><span class="na">setProjectStage</span><span
class="o">(</span><span class="n">projectStage</span><span class="o">);</span>
+
+ <span class="n">cdiContainer</span> <span class="o">=</span> <span
class="n">CdiContainerLoader</span><span class="o">.</span><span
class="na">getCdiContainer</span><span class="o">();</span>
+
+ <span class="n">cdiContainer</span><span class="o">.</span><span
class="na">boot</span><span class="o">();</span>
+ <span class="n">cdiContainer</span><span class="o">.</span><span
class="na">getContextControl</span><span class="o">().</span><span
class="na">startContexts</span><span class="o">();</span>
+ <span class="o">}</span>
+ <span class="k">else</span> <span class="o">{</span>
+ <span class="n">cleanInstances</span><span class="o">();</span>
+ <span class="o">}</span>
+ <span class="o">}</span>
+
+
+ <span class="kd">public</span> <span class="kd">static</span> <span
class="n">CdiContainer</span> <span class="nf">getCdiContainer</span><span
class="o">()</span> <span class="o">{</span>
+ <span class="k">return</span> <span class="n">cdiContainer</span><span
class="o">;</span>
+ <span class="o">}</span>
+
+ <span class="cm">/**</span>
+<span class="cm"> * This will fill all the InjectionPoints of the current
test class for you</span>
+<span class="cm"> */</span>
+ <span class="nd">@BeforeClass</span>
+ <span class="kd">public</span> <span class="kd">final</span> <span
class="kt">void</span> <span class="nf">beforeClass</span><span
class="o">()</span> <span class="kd">throws</span> <span
class="n">Exception</span> <span class="o">{</span>
+ <span class="n">beforeMethod</span><span class="o">();</span>
+
+ <span class="c1">// perform injection into the very own test
class</span>
+ <span class="n">BeanManager</span> <span class="n">beanManager</span>
<span class="o">=</span> <span class="n">cdiContainer</span><span
class="o">.</span><span class="na">getBeanManager</span><span
class="o">();</span>
+
+ <span class="n">CreationalContext</span> <span
class="n">creationalContext</span> <span class="o">=</span> <span
class="n">beanManager</span><span class="o">.</span><span
class="na">createCreationalContext</span><span class="o">(</span><span
class="kc">null</span><span class="o">);</span>
+
+ <span class="n">AnnotatedType</span> <span
class="n">annotatedType</span> <span class="o">=</span> <span
class="n">beanManager</span><span class="o">.</span><span
class="na">createAnnotatedType</span><span class="o">(</span><span
class="k">this</span><span class="o">.</span><span
class="na">getClass</span><span class="o">());</span>
+ <span class="n">InjectionTarget</span> <span
class="n">injectionTarget</span> <span class="o">=</span> <span
class="n">beanManager</span><span class="o">.</span><span
class="na">createInjectionTarget</span><span class="o">(</span><span
class="n">annotatedType</span><span class="o">);</span>
+ <span class="n">injectionTarget</span><span class="o">.</span><span
class="na">inject</span><span class="o">(</span><span
class="k">this</span><span class="o">,</span> <span
class="n">creationalContext</span><span class="o">);</span>
+
+ <span class="c1">// this is a trick we use to have proper DB
transactions when using the entitymanager-per-request pattern</span>
+ <span class="n">cleanInstances</span><span class="o">();</span>
+ <span class="n">cleanUpDb</span><span class="o">();</span>
+ <span class="n">cleanInstances</span><span class="o">();</span>
+ <span class="o">}</span>
+
+ <span class="cm">/**</span>
+<span class="cm"> * Shuts down container.</span>
+<span class="cm"> * @throws Exception in case of severe problem</span>
+<span class="cm"> */</span>
+ <span class="nd">@AfterMethod</span>
+ <span class="kd">public</span> <span class="kd">final</span> <span
class="kt">void</span> <span class="nf">afterMethod</span><span
class="o">()</span> <span class="kd">throws</span> <span
class="n">Exception</span> <span class="o">{</span>
+ <span class="k">if</span> <span class="o">(</span><span
class="n">cdiContainer</span> <span class="o">!=</span> <span
class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="n">cleanInstances</span><span class="o">();</span>
+ <span class="n">containerRefCount</span><span class="o">--;</span>
+ <span class="o">}</span>
+ <span class="o">}</span>
+
+ <span class="cm">/**</span>
+<span class="cm"> * clean the NormalScoped contextual instances by
stopping and restarting</span>
+<span class="cm"> * some contexts. You could also restart the
ApplicationScoped context</span>
+<span class="cm"> * if you have some caches in your classes. </span>
+<span class="cm"> */</span>
+ <span class="kd">public</span> <span class="kd">final</span> <span
class="kt">void</span> <span class="nf">cleanInstances</span><span
class="o">()</span> <span class="kd">throws</span> <span
class="n">Exception</span> <span class="o">{</span>
+ <span class="n">cdiContainer</span><span class="o">.</span><span
class="na">getContextControl</span><span class="o">().</span><span
class="na">stopContext</span><span class="o">(</span><span
class="n">RequestScoped</span><span class="o">.</span><span
class="na">class</span><span class="o">);</span>
+ <span class="n">cdiContainer</span><span class="o">.</span><span
class="na">getContextControl</span><span class="o">().</span><span
class="na">startContext</span><span class="o">(</span><span
class="n">RequestScoped</span><span class="o">.</span><span
class="na">class</span><span class="o">);</span>
+ <span class="n">cdiContainer</span><span class="o">.</span><span
class="na">getContextControl</span><span class="o">().</span><span
class="na">stopContext</span><span class="o">(</span><span
class="n">SessionScoped</span><span class="o">.</span><span
class="na">class</span><span class="o">);</span>
+ <span class="n">cdiContainer</span><span class="o">.</span><span
class="na">getContextControl</span><span class="o">().</span><span
class="na">startContext</span><span class="o">(</span><span
class="n">SessionScoped</span><span class="o">.</span><span
class="na">class</span><span class="o">);</span>
+ <span class="o">}</span>
+
+ <span class="nd">@AfterSuite</span>
+ <span class="kd">public</span> <span class="kd">synchronized</span> <span
class="kt">void</span> <span class="nf">shutdownContainer</span><span
class="o">()</span> <span class="kd">throws</span> <span
class="n">Exception</span> <span class="o">{</span>
+ <span class="k">if</span> <span class="o">(</span><span
class="n">cdiContainer</span> <span class="o">!=</span> <span
class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="n">cdiContainer</span><span class="o">.</span><span
class="na">shutdown</span><span class="o">();</span>
+ <span class="n">cdiContainer</span> <span class="o">=</span> <span
class="kc">null</span><span class="o">;</span>
+ <span class="o">}</span>
+ <span class="o">}</span>
+
+ <span class="kd">public</span> <span class="kt">void</span> <span
class="nf">finalize</span><span class="o">()</span> <span
class="kd">throws</span> <span class="n">Throwable</span> <span
class="o">{</span>
+ <span class="n">shutdownContainer</span><span class="o">();</span>
+ <span class="kd">super</span><span class="o">.</span><span
class="na">finalize</span><span class="o">();</span>
+ <span class="o">}</span>
+
+
+ <span class="cm">/**</span>
+<span class="cm"> * Override this method for database clean up.</span>
+<span class="cm"> *</span>
+<span class="cm"> * @throws Exception in case of severe problem</span>
+<span class="cm"> */</span>
+ <span class="kd">protected</span> <span class="kt">void</span> <span
class="nf">cleanUpDb</span><span class="o">()</span> <span
class="kd">throws</span> <span class="n">Exception</span> <span
class="o">{</span>
+ <span class="c1">//Override in subclasses when needed</span>
+ <span class="o">}</span>
+
+ <span class="kd">protected</span> <span class="o"><</span><span
class="n">T</span><span class="o">></span> <span class="n">T</span> <span
class="n">getInstance</span><span class="o">(</span><span
class="n">Class</span><span class="o"><</span><span class="n">T</span><span
class="o">></span> <span class="n">type</span><span class="o">,</span> <span
class="n">Qualifier</span><span class="o">...</span> <span
class="n">qualifiers</span><span class="o">)</span> <span class="o">{</span>
+ <span class="k">return</span> <span class="n">BeanProvider</span><span
class="o">.</span><span class="na">getContextualReference</span><span
class="o">(</span><span class="n">type</span><span class="o">,</span> <span
class="n">qualifiers</span><span class="o">);</span>
+ <span class="o">}</span>
+
+<span class="o">}</span>
+</pre></div>
+ </div>
+
+ <hr>
+
+ <footer>
+ <p>
+ <a class="brand" href="http://www.apache.org"><img
src="http://www.apache.org/images/asf_logo_wide.png" height="55px"
alt="asf_feather"/></a>
+ </p>
+ <p>Copyright © 2008-2013 The Apache Software Foundation,
Licensed under the Apache License, Version 2.0.</p>
+ <p>OpenWebBeans, Apache and the Apache feather logo are trademarks
of The Apache Software Foundation.</p>
+ </footer>
+
+ </div> <!-- /container -->
+
+ <!-- Javascript
+ ================================================== -->
+ <!-- Placed at the end of the document so the pages load faster -->
+ <script src=".//resources/js/jquery.js"></script>
+ <script src=".//resources/js/bootstrap-transition.js"></script>
+ <script src=".//resources/js/bootstrap-alert.js"></script>
+ <script src=".//resources/js/bootstrap-modal.js"></script>
+ <script src=".//resources/js/bootstrap-dropdown.js"></script>
+ <script src=".//resources/js/bootstrap-scrollspy.js"></script>
+ <script src=".//resources/js/bootstrap-tab.js"></script>
+ <script src=".//resources/js/bootstrap-tooltip.js"></script>
+ <script src=".//resources/js/bootstrap-popover.js"></script>
+ <script src=".//resources/js/bootstrap-button.js"></script>
+ <script src=".//resources/js/bootstrap-collapse.js"></script>
+ <script src=".//resources/js/bootstrap-carousel.js"></script>
+ <script src=".//resources/js/bootstrap-typeahead.js"></script>
+
+</body></html>
+
+
+
+