<!DOCTYPE html>
<html lang="en">
  <head>

    <meta charset="UTF-8">
      <title></title>
    <meta name="description" content="Apache TomEE">
    <meta name="author" content="Apache TomEE">
    <meta name="google-translate-customization" content="f36a520c08f4c9-0a04e86a9c075ce9-g265f3196f697cf8f-10">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">

    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <!-- Le styles -->
    <link href="./../resources/css/bootstrap.css" rel="stylesheet">
    <link href="./../resources/css/prettify.css" rel="stylesheet">
    <!--link href="./../resources/css/bootstrap-mods.css" rel="stylesheet"-->
    <link href="./../resources/css/main.css" rel="stylesheet">
    <link href="./../resources/font-awesome-4.6.3/css/font-awesome.min.css" rel="stylesheet">

    <script type="text/javascript">
        var t = encodeURIComponent(document.title.replace(/^\s+|\s+$/g,""));
        var u = encodeURIComponent(""+document.URL);
    
      function fbshare () {
          window.open(
                  "http://www.facebook.com/sharer/sharer.php?u="+u,
                  'Share on Facebook',
                  'width=640,height=426');
      };
      function gpshare () {
          window.open(
                  "https://plus.google.com/share?url="+u,
                  'Share on Google+',
                  'width=584,height=385');
      };
      function twshare () {
          window.open(
                  "https://twitter.com/intent/tweet?url="+u+"&text="+t,
                  'Share on Twitter',
                  'width=800,height=526');
      };
      function pinshare () {
          window.open("//www.pinterest.com/pin/create/button/?url="+u+"&media=http%3A%2F%2Ftomee.apache.org%2Fresources%2Fimages%2Ffeather-logo.png&description="+t,
                  'Share on Pinterest',
                  'width=800,height=526');
      };
    </script>

    <!-- Le fav and touch icons -->
    <link rel="shortcut icon" href="./../favicon.ico">
    <link rel="apple-touch-icon" href="./../resources/images/apple-touch-icon.png">
    <link rel="apple-touch-icon" sizes="72x72" href="./../resources/images/apple-touch-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="114x114" href="./../resources/images/apple-touch-icon-114x114.png">

    <script src="./../resources/js/prettify.js" type="text/javascript"></script>
    <script src="./../resources/js/jquery-latest.js"></script>
    <script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
    <script src="./../resources/js/common.js"></script>
    <script src="./../resources/js/prettyprint.js"></script>
    <!--script src="//assets.pinterest.com/js/pinit.js" type="text/javascript" async></script//-->
    
    <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="topbar" data-dropdown="dropdown">
      <div class="fill">
        <div class="container">
          <a class="brand" href="./../index.html">Apache TomEE</a>
          <ul class="nav">
              <li class="dropdown">
                  <a class="dropdown-toggle" data-toggle="dropdown" href="#">
                  Apache
                      <b class="caret"></b>
                  </a>
                  <ul class="dropdown-menu">
                     <!-- <li><a href="./../misc/whoweare.html">Who we are?</a></li> -->
                     <!-- <li><a href="./../misc/heritage.html">Heritage</a></li> -->
                     <li><a href="http://www.apache.org">Apache Home</a></li>
                     <!-- <li><a href="./../misc/resources.html">Resources</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"/>
                     <li><a href="http://www.apache.org/security">Security</a></li>
                  </ul>
              </li>
              <li><a href="./../index.html">Home</a></li>
              <li><a href="./../downloads.html">Downloads</a></li>
              <li><a href="./../documentation.html">Documentation</a></li>
              <li><a href="./../examples-trunk/index.html">Examples</a></li>
              <li><a href="./../support.html">Support</a></li>
              <li><a href="./../contribute.html">Contribute</a></li>
              <li><a href="./../security/index.html">Security</a></li>
          </ul>

            <!-- Google CSE Search Box Begins  -->
            <FORM class="pull-right" id="searchbox_010475492895890475512:_t4iqjrgx90" action="http://www.google.com/cse">
                <INPUT type="hidden" name="cx" value="010475492895890475512:_t4iqjrgx90">
                <INPUT type="hidden" name="cof" value="FORID:0">
                <INPUT size="18" width="130" style="width:130px" name="q" type="text" placeholder="Search">
            </FORM>
            <!--<SCRIPT type="text/javascript" src="http://www.google.com/coop/cse/brand?form=searchbox_010475492895890475512:_t4iqjrgx90"></SCRIPT>-->
            <!-- Google CSE Search Box Ends -->
        </div>
      </div>
    </div>

    <div class="container">
    

<div class="page-header">
    <small><a href="./../index.html">Home</a>&nbsp;&raquo&nbsp;<a href="./../application-composer/">Application Composer</a></small><br>
    <h1>

        <div style="float: right; position: relative; bottom: -10px; ">
            <a onclick="javascript:gpshare()" class="gp-share sprite" title="Share on Google+">share [gp]</a>
            <a onclick="javascript:fbshare()" class="fb-share sprite" title="Share on Facebook">share [fb]</a>
            <a onclick="javascript:twshare()" class="tw-share sprite" title="Share on Twitter">share [tw]</a>
            <a onclick="javascript:pinshare()" class="pin-share sprite" title="Share on Pinterest">share [pin]</a>
            <a data-toggle="modal" href="#edit" class="edit-page" title="Contribute to this Page">contribute</a>
        </div>
    </h1>
</div>

<h1>Application Composer Getting Started</h1>

<p>ApplicationComposer API is mainly contained in <code>org.apache.openejb.testing</code> package
(historically, today we would have called the package <code>org.apache.tomee.applicationcomposer</code>).</p>

<h2>Dependencies</h2>

<p>To start using ApplicationComposer you need to add some dependencies.</p>

<p>The minimum required one is <code>openejb-core</code>:</p>

<pre><code>&lt;dependency&gt;
  &lt;groupId&gt;org.apache.openejb&lt;/groupId&gt;
  &lt;artifactId&gt;openejb-core&lt;/artifactId&gt;
  &lt;version&gt;${openejb.version&gt;&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>

<p>If you need JAXRS services you'll add (or replace thanks to transitivity of maven) <code>openejb-cxf-rs</code>:</p>

<pre><code>&lt;dependency&gt;
  &lt;groupId&gt;org.apache.openejb&lt;/groupId&gt;
  &lt;artifactId&gt;openejb-cxf-rs&lt;/artifactId&gt;
  &lt;version&gt;${openejb.version&gt;&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>

<p>If you need JAXWS services you'll add (or replace thanks to transitivity of maven) <code>openejb-cxf</code>:</p>

<pre><code>&lt;dependency&gt;
  &lt;groupId&gt;org.apache.openejb&lt;/groupId&gt;
  &lt;artifactId&gt;openejb-cxf&lt;/artifactId&gt;
  &lt;version&gt;${openejb.version&gt;&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>

<p>etc...</p>

<h2>ApplicationComposer Components</h2>

<h3>@Module</h3>

<p>An ApplicationComposer needs at minimum a module (the application you need to deploy).</p>

<p>To do so you have two cases:</p>

<ul>
<li>before TomEE 2.x: you can only write method(s) decorated with <code>@Module</code></li>
<li>since TomEE 2.x: you can skip it and use <code>@Classes</code> directly on the ApplicationComposer class as a shortcut for:</p>

<p>@Module
public WebApp app() {
    return new WebApp();
}</li>
</ul>

<p>The expected returned type of these methods are in <code>org.apache.openejb.jee</code> package:</p>

<ul>
<li><code>Application</code>: entry point to create an ear</li>
<li><code>WebApp</code>: a web application</li>
<li><code>EjbJar</code>: an ejb module</li>
<li><code>EnterpriseBean</code> children: a simple EJB</li>
<li><code>Persistence</code>: a persistence module with multiple units</li>
<li><code>PersistenceUnit</code>: a simple unit (automatically wrapped in a <code>Persistence</code>)</li>
<li><code>Connector</code>: a JCA connector module</li>
<li><code>Beans</code>: a CDI module,</li>
<li><code>Class[]</code> or <code>Class</code>: a set of classes scanned to discover annotations</li>
</ul>

<p>Note that for easiness <code>@Classes</code> was added to be able to describe a module and some scanned classes. For instance the
following snippet will create a web application with classes C1, C2 as CDI beans and E1 as an EJB automatically:</p>

<pre><code>@Module
@Classes(cdi = true, value = { C1.class, C2.class, E1.class })
public WebApp app() {
    return new WebApp();
}
</code></pre>

<h3>@Configuration</h3>

<p>Often you need to customize a bit the container or at least create some resources like test databases.
To do so you can create a method returning <code>Properties</code> which will be the container properties.</p>

<p>Note: to simplify writing properties you can use <code>PropertiesBuilder</code> util class which is just a fluent API
to write properties.</p>

<p>In these properties you can reuse OpenEJB/TomEE property syntax for resources.</p>

<p>Here is a sample:</p>

<pre><code>@Configuration
public Properties configuration() {
    return new PropertiesBuilder()
        .p("db", "new://Resource?type=DataSource")
        .p("db.JdbcUrld", "jdbc:hsqldb:mem:test")
        .build();
}
</code></pre>

<p>Since TomEE 2.x you can also put properties on ApplicationComposer class using <code>@ContainerProperties</code> API:</p>

<pre><code>@ContainerProperties({
  @ContainerProperties.Property(name = "db", value = "new://Resource?type=DataSource"),
  @ContainerProperties.Property(name = "db.JdbcUrl", value = "jdbc:hsqldb:mem:test")
})
public class MyAppComposer() {
  // ...
}
</code></pre>

<h3>@Component</h3>

<p>Sometimes you need to customize a container component. The most common use case is the security service
to mock a little bit authorization if you don't care in your test.</p>

<p>To do so just write a method decorated with <code>@Component</code> returning the instance you desire.</p>

<p>Components in TomEE are stored in a container Map and the key needs to be a <code>Class</code>. This one is deduced from the returned
type of the <code>@Component</code> method:</p>

<pre><code>@Component
public SecurityService mockSecurity() {
    return new MySecurityService();
}
</code></pre>

<h2>How to run it?</h2>

<h3>JUnit</h3>

<p>If you use JUnit you have mainly 2 solutions to run you "model" using the ApplicationComposer:</p>

<ul>
<li>using <code>ApplicationComposer</code> runner:</p>

<p>@RunWith(ApplicationComposer.class)
public class MyTest {
    // ...
}</li>
<li>using <code>ApplicationComposerRule</code> rule:</p>

<p>public class MyTest {
    @Rule // or @ClassRule if you want the container/application lifecycle be bound to the class and not test methods
    public final ApplicationComposerRule rule = new ApplicationComposerRule(this);
}</li>
</ul>

<p>Tip: since TomEE 2.x ApplicationComposerRule is decomposed in 2 rules if you need: <code>ContainerRule</code> and <code>DeployApplication</code>.
Using JUnit <code>RuleChain</code> you can chain them to get the samebehavior as <code>ApplicationComposerRule</code> or better deploy
multiple ApplicationComposer models and controlling their deployment ordering (to mock a remote service for instance).</p>

<p>Finally just write <code>@Test</code> method using test class injections as if the test class was a managed bean!</p>

<h3>TestNG</h3>

<p>TestNG integration is quite simple today and mainly <code>ApplicationComposerListener</code> class you can configure
as a listener to get ApplicationComposer features.</p>

<p>Finally just write TestNG <code>@Test</code> method using test class injections as if the test class was a managed bean!</p>

<h3>Standalone</h3>

<p>Since TomEE 2.x you can also use <code>ApplicationComposers</code> to directly run you ApplicationComposer model
as a standalone application:</p>

<pre><code>public class MyApp {
    public static void main(String[] args) {
        ApplicationComposers.run(MyApp.class, args);
    }

    // @Module, @Configuration etc...
}
</code></pre>

<p>Tip: if <code>MyApp</code> has <code>@PostConstruct</code> methods they will be respected and if <code>MyApp</code> has a constructor taking an array
of String it will be instantiated getting the second parameter as argument (ie you can propagate your main parameter
to your model to modify your application depending it!)</p>

<h2>JUnit Sample</h2>

<pre><code>@Classes(cdi = true, value = { MyService.class, MyOtherService.class })
@ContainerProperties(@ContainerProperties.Property(name = "myDb", value = "new://Resource?type=DataSource"))
@RunWith(ApplicationComposer.class)
public class MyTest {
    @Resource(name = "myDb")
    private DataSource ds;

    @Inject
    private MyService service;

    @Test
    public void myTest() {
        // do test using injections
    }
}
</code></pre>

<h2>Going further</h2>

<p>If you want to learn more about ApplicationComposer see <a href="advanced.html">Advanced</a> page.</p>




        <div id="edit" class="modal hide fade in" style="display: none; ">
            <div class="modal-header">
                <a class="close" data-dismiss="modal">x</a>

                <h3>Thank you for contributing to the documentation!</h3>
            </div>
            <div class="modal-body">
                <h4>Any help with the documentation is greatly appreciated.</h4>
                <p>All edits are reviewed before going live, so feel free to do much more than fix typos or links.  If you see a page that could benefit from an entire rewrite, we'd be thrilled to review it.  Don't be surprised if we like it so much we ask you for help with other pages :)</p>
                <small>NOTICE: unless indicated otherwise on the pages in question, all editable content available from apache.org is presumed to be licensed under the Apache License (AL) version 2.0 and hence all submissions to apache.org treated as formal Contributions under the license terms.</small>
                <!--[if gt IE 6]>
                <h4>Internet Explorer Users</h4>
                <p>If you are not an Apache committer, click the Yes link and enter a <i>anonymous</i> for the username and leave the password empty</p>
                <![endif]-->

            </div>
            <div class="modal-footer">
                Do you have an Apache ID?
                <a href="javascript:void(location.href='https://cms.apache.org/redirect?uri='+escape(location.href))" class="btn">Yes</a>
                <a href="javascript:void(location.href='https://anonymous:@cms.apache.org/redirect?uri='+escape(location.href))" class="btn">No</a>
            </div>
        </div>
        <script src="./../resources/js/bootstrap-modal.js"></script>

        <footer>
            <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>
        </footer>

    </div> <!-- /container -->

    <!-- Javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="./../resources/js/bootstrap-dropdown.js"></script>

  </body>
</html>
