You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/08/07 07:12:48 UTC

[04/10] isis-site git commit: ISIS-1521: docs

http://git-wip-us.apache.org/repos/asf/isis-site/blob/8b42f65e/content/guides/ugtst/ugtst.html
----------------------------------------------------------------------
diff --git a/content/guides/ugtst/ugtst.html b/content/guides/ugtst/ugtst.html
index f9b23fc..0179ec7 100644
--- a/content/guides/ugtst/ugtst.html
+++ b/content/guides/ugtst/ugtst.html
@@ -1347,30 +1347,75 @@ CustomerRepository customers;</code></pre>
           <p>Integration tests instantiate an Apache Isis "runtime" (as a singleton) within a JUnit test. Because (depending on the size of your app) it takes a little time to bootstrap Apache Isis, the framework caches the runtime on a thread-local from one test to the next.</p> 
          </div> 
          <div class="paragraph"> 
-          <p>Nevertheless, we do need to bootstrap the runtime for the very first test.</p> 
-         </div> 
-         <div class="paragraph"> 
-          <p>As of 1.9.0 the bootstrapping of integration tests and webapps has been simplified through the <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping"><code>AppManifest</code></a> class. Since this isn’t mandatory, for now we present both techniques.</p> 
+          <p>Newer releases of the framework reduce the amount of boilerplate to do this; this guide documents multiple versions.</p> 
          </div> 
          <div class="paragraph"> 
           <p>The example code in this section is taken from the app generated by the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>.</p> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_system_initializer">4.2.1. System Initializer</h4> 
+          <h4 id="_1_15_0_snapshot">4.2.1. 1.15.0-SNAPSHOT</h4> 
           <div class="paragraph"> 
-           <p>The bootstrapping itself is performed by a "system initializer" class. This is responsible for instantiating the Apache Isis runtime, and binding it to a thread-local.</p> 
+           <p>In <code>1.15.0-SNAPSHOT</code> the bootstrapping is accomplished using a combination of <code>AppManifestAbstract</code> (a framework-provided implementation of <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping"><code>AppManifest</code></a>) and <code>IntegrationTestAbstract2</code> superclass.</p> 
           </div> 
-          <div class="sect4"> 
-           <h5 id="_1_13_0_improved_intent">1.13.0 (Improved intent)</h5> 
-           <div class="paragraph"> 
-            <p>As of <code>1.13.0</code>, the <code>IsisConfigurationForJdoIntegTests</code> (which provides a number of configuration settings specifically for running integration tests) can be removed; instead all configuration properties can be defined through the <code>AppManifest</code>:</p> 
+          <div class="paragraph"> 
+           <p>For example, the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>'s integration tests all inherit from this class:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTestAbstract</span> <span class="directive">extends</span> IntegrationTestAbstract2 {
+
+    <span class="annotation">@BeforeClass</span>
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initSystem() {
+        bootstrapUsing(<span class="keyword">new</span> DomainAppAppManifest());
+    }
+
+}</code></pre> 
            </div> 
-           <div class="paragraph"> 
-            <p>For example:</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>where <code>DomainAppAppManifest</code> in turn is:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppAppManifest</span> <span class="directive">extends</span> AppManifestAbstract {
+
+    <span class="directive">public</span> <span class="directive">static</span> <span class="directive">final</span> Builder BUILDER = Builder.forModules(
+                    SimpleModuleDomSubmodule.class,
+                    DomainAppApplicationModuleFixtureSubmodule.class,
+                    DomainAppApplicationModuleServicesSubmodule.class
+            )
+            .withConfigurationPropertiesFile(DomainAppAppManifest.class,
+                    <span class="string"><span class="delimiter">"</span><span class="content">isis.properties</span><span class="delimiter">"</span></span>,
+                    <span class="string"><span class="delimiter">"</span><span class="content">authentication_shiro.properties</span><span class="delimiter">"</span></span>,
+                    <span class="string"><span class="delimiter">"</span><span class="content">persistor_datanucleus.properties</span><span class="delimiter">"</span></span>,
+                    <span class="string"><span class="delimiter">"</span><span class="content">viewer_restfulobjects.properties</span><span class="delimiter">"</span></span>,
+                    <span class="string"><span class="delimiter">"</span><span class="content">viewer_wicket.properties</span><span class="delimiter">"</span></span>
+            ).withAuthMechanism(<span class="string"><span class="delimiter">"</span><span class="content">shiro</span><span class="delimiter">"</span></span>);
+
+    <span class="directive">public</span> DomainAppAppManifest() {
+        <span class="local-variable">super</span>(BUILDER);
+    }
+}</code></pre> 
            </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppSystemInitializer</span> {
+          </div> 
+          <div class="paragraph"> 
+           <p>The <code>AppManifestAbstract</code> class (which is also used to bootstrap the regular app as well as integration tests) is discussed further <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping">here</a>, while the <code>IntegrationTestAbstract2</code> class is discussed further <a href="#_ugtst_integ-test-support_abstract-class">here</a>.</p> 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_1_13_0">4.2.2. 1.13.0</h4> 
+          <div class="paragraph"> 
+           <p>In <code>1.13.0</code> the bootstrapping itself is typically performed by a "system initializer" class. This is responsible for instantiating the Apache Isis runtime (based on a provided <code>AppManifest</code>) and binding it to a thread-local.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The <code>AppManifest.Util</code> class allows configuration properties for integration testing to be defined (replacing the <code>IsisConfigurationForJdoIntegTests</code> of earlier releases).</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>For example:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppSystemInitializer</span> {
     <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initIsft() {
         IsisSystemForTest isft = IsisSystemForTest.getElseNull();
         <span class="keyword">if</span>(isft == <span class="predefined-constant">null</span>) {
@@ -1392,20 +1437,62 @@ CustomerRepository customers;</code></pre>
         }
     }
 }</code></pre> 
-            </div> 
-           </div> 
-           <div class="paragraph"> 
-            <p>While the code is slightly longer than previously, the responsibilities for returning the configuration properties to use for the test now reside in a single location. The new <code>AppManifest.Util</code> class provides the helper methods to actually add in the appropriate config properties.</p> 
            </div> 
           </div> 
-          <div class="sect4"> 
-           <h5 id="_1_9_0_code_appmanifest_code">1.9.0 (<code>AppManifest</code>)</h5> 
-           <div class="paragraph"> 
-            <p>As of 1.9.0, the code (using <code>AppManifest</code>) is:</p> 
+          <div class="paragraph"> 
+           <p>The above code uses the <code>AppManifest.Util</code> helper class, which provides a number of static methods that can be used to set up <a href="#_ugtst_integ-test-support_configuration-properties">configuration properties</a> appropriate for integration testing (eg run using an in-memory database). This allows the responsibility of returning the configuration properties to belong exclusively to the <code>AppManifest</code>.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>There are three such static methods:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">interface</span> <span class="class">AppManifest</span> {
+  ...
+  public <span class="directive">static</span> <span class="type">class</span> <span class="class">Util</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>,<span class="predefined-type">String</span>&gt;
+        withJavaxJdoRunInMemoryProperties(<span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>, <span class="predefined-type">String</span>&gt; map) { ... }   <i class="conum" data-value="1"></i><b>(1)</b>
+    <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>,<span class="predefined-type">String</span>&gt;
+        withDataNucleusProperties(<span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>, <span class="predefined-type">String</span>&gt; map) { ... }           <i class="conum" data-value="2"></i><b>(2)</b>
+    <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>,<span class="predefined-type">String</span>&gt;
+        withIsisIntegTestProperties(<span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>, <span class="predefined-type">String</span>&gt; map) { ... }         <i class="conum" data-value="3"></i><b>(3)</b>
+  }
+}</code></pre> 
            </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppSystemInitializer</span> {
+          </div> 
+          <div class="colist arabic"> 
+           <table> 
+            <tbody>
+             <tr> 
+              <td><i class="conum" data-value="1"></i><b>1</b></td> 
+              <td>sets up the <code>javax.jdo.option.Connection*</code> properties so as to run against an in-memory instance of HSQLDB</td> 
+             </tr> 
+             <tr> 
+              <td><i class="conum" data-value="2"></i><b>2</b></td> 
+              <td>sets up DataNucleus to automatically create the databse schema, as well as a number of other standard properties (disable persistence by reachability, support mixed case identifiers, disable level 2 cache)</td> 
+             </tr> 
+             <tr> 
+              <td><i class="conum" data-value="3"></i><b>3</b></td> 
+              <td>sets up standard properties for the Apache Isis framework, most specifically to enable fixtures to be installed.</td> 
+             </tr> 
+            </tbody>
+           </table> 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_1_9_0">4.2.3. 1.9.0</h4> 
+          <div class="paragraph"> 
+           <p>In <code>1.9.0</code> the <code>AppManifest</code> was introduced as mechanism to specify all parts (domain code, framework components, configuation properties) that make up a running application.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The suggested way to use this concept was using a "system initializer" class. This uses a <code>IsisConfigurationForJdoIntegTests</code> class to bring together the configuration properties (discussed further <a href="#_ugtst_integ-test-support_configuration-properties">here</a>) to bootstrap the application.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>For example:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppSystemInitializer</span> {
     <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initIsft() {
         IsisSystemForTest isft = IsisSystemForTest.getElseNull();
         <span class="keyword">if</span>(isft == <span class="predefined-constant">null</span>) {
@@ -1419,14 +1506,14 @@ CustomerRepository customers;</code></pre>
         }
     }
 }</code></pre> 
-            </div> 
-           </div> 
-           <div class="paragraph"> 
-            <p>where <code>DomainAppAppManifest</code> in turn is defined as:</p> 
            </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppAppManifest</span> <span class="directive">implements</span> AppManifest {
+          </div> 
+          <div class="paragraph"> 
+           <p>where <code>DomainAppAppManifest</code> in turn is defined as:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppAppManifest</span> <span class="directive">implements</span> AppManifest {
     <span class="annotation">@Override</span>
     <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Class</span>&lt;?&gt;&gt; getModules() {
         <span class="keyword">return</span> <span class="predefined-type">Arrays</span>.asList(
@@ -1437,20 +1524,20 @@ CustomerRepository customers;</code></pre>
     }
     ...
 }</code></pre> 
-            </div> 
-           </div> 
-           <div class="paragraph"> 
-            <p>Further details on bootstrapping with the <code>AppManifest</code> can be found in the <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping">reference guide</a>.</p> 
            </div> 
           </div> 
-          <div class="sect4"> 
-           <h5 id="_1_8_0_and_earlier">1.8.0 and earlier</h5> 
-           <div class="paragraph"> 
-            <p>Prior to 1.9.0, the services and entities had to be specified in two separate locations. The suggested way to do this was to introduce a subclass of the <code>IsisSystemForTest.Builder</code> class:</p> 
-           </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">private</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">DomainAppSystemBuilder</span> <span class="directive">extends</span> IsisSystemForTest.Builder {      <i class="conum" data-value="1"></i><b>(1)</b>
+          <div class="paragraph"> 
+           <p>Further details on bootstrapping with the <code>AppManifest</code> can be found in the <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping">reference guide</a>.</p> 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_1_8_0_and_earlier">4.2.4. 1.8.0 and earlier</h4> 
+          <div class="paragraph"> 
+           <p>Prior to 1.9.0, the services and entities had to be specified in two separate locations. The suggested way to do this was to introduce a subclass of the <code>IsisSystemForTest.Builder</code> class:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">private</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">DomainAppSystemBuilder</span> <span class="directive">extends</span> IsisSystemForTest.Builder {      <i class="conum" data-value="1"></i><b>(1)</b>
     <span class="directive">public</span> DomainAppSystemBuilder() {
         withLoggingAt(org.apache.log4j.Level.INFO);
         with(testConfiguration());
@@ -1464,320 +1551,51 @@ CustomerRepository customers;</code></pre>
         <span class="keyword">return</span> testConfiguration;
     }
 }</code></pre> 
-            </div> 
-           </div> 
-           <div class="colist arabic"> 
-            <table> 
-             <tbody>
-              <tr> 
-               <td><i class="conum" data-value="1"></i><b>1</b></td> 
-               <td>subclass the framework-provided <code>IsisSystemForTest.Builder</code>.</td> 
-              </tr> 
-              <tr> 
-               <td><i class="conum" data-value="2"></i><b>2</b></td> 
-               <td>equivalent to <code>isis.persistor=datanucleus</code> in <code>isis.properties</code></td> 
-              </tr> 
-              <tr> 
-               <td><i class="conum" data-value="3"></i><b>3</b></td> 
-               <td>specify the <code>isis.services</code> key in <code>isis.properties</code> (where "domainapp" is the base package for all classes within the app)</td> 
-              </tr> 
-              <tr> 
-               <td><i class="conum" data-value="4"></i><b>4</b></td> 
-               <td><code>IsisConfigurationForJdoIntegTests</code> has pre-canned configuration for using an in-memory HSQLDB and other standard settings; more on this below.</td> 
-              </tr> 
-              <tr> 
-               <td><i class="conum" data-value="5"></i><b>5</b></td> 
-               <td>equivalent to <code>isis.persistor.datanucleus.RegisterEntities.packagePrefix</code> key (typically in <code>persistor_datanucleus.properties</code>)</td> 
-              </tr> 
-             </tbody>
-            </table> 
-           </div> 
-           <div class="paragraph"> 
-            <p>This builder could then be used within the system initializer:</p> 
-           </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppSystemInitializer</span> {
-    <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initIsft() {
-        IsisSystemForTest isft = IsisSystemForTest.getElseNull();
-        <span class="keyword">if</span>(isft == <span class="predefined-constant">null</span>) {
-            isft = <span class="keyword">new</span> DomainAppSystemBuilder()    <i class="conum" data-value="1"></i><b>(1)</b>
-                            .build()
-                            .setUpSystem();
-            IsisSystemForTest.set(isft);           <i class="conum" data-value="2"></i><b>(2)</b>
-        }
-    }
-    <span class="directive">private</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">DomainAppSystemBuilder</span>
-        <span class="directive">extends</span> IsisSystemForTest.Builder { ... }
-}</code></pre> 
-            </div> 
-           </div> 
-           <div class="colist arabic"> 
-            <table> 
-             <tbody>
-              <tr> 
-               <td><i class="conum" data-value="1"></i><b>1</b></td> 
-               <td>instantiates and initializes the Apache Isis runtime (the <code>IsisSystemForTest</code> class)</td> 
-              </tr> 
-              <tr> 
-               <td><i class="conum" data-value="2"></i><b>2</b></td> 
-               <td>binds the runtime to a thread-local.</td> 
-              </tr> 
-             </tbody>
-            </table> 
            </div> 
           </div> 
-          <div class="sect4"> 
-           <h5 id="_isisconfigurationforjdointegtests">IsisConfigurationForJdoIntegTests</h5> 
-           <div class="paragraph"> 
-            <p>Integration tests are configured programmatically, with a default set of properties to bootstrap the JDO/DataNucleus objectstore using an HSQLDB in-memory database.</p> 
-           </div> 
-           <div class="paragraph"> 
-            <p>To remove a little bit of boilerplate, the <code>IsisConfigurationForJdoIntegTests</code> class (in the <code>org.apache.isis.objectstore.jdo.datanucleus</code> package) can be used to bootstrap the application. If necessary, this class can be subclassed to override these defaults.</p> 
-           </div> 
-           <table class="tableblock frame-all grid-all spread"> 
-            <caption class="title">
-             Table 1. Default Configuration Properties for Integration Tests
-            </caption> 
-            <colgroup> 
-             <col style="width: 33.3333%;"> 
-             <col style="width: 16.6666%;"> 
-             <col style="width: 50.0001%;"> 
-            </colgroup> 
-            <thead> 
-             <tr> 
-              <th class="tableblock halign-left valign-top">Property</th> 
-              <th class="tableblock halign-left valign-top">Value</th> 
-              <th class="tableblock halign-left valign-top">Description</th> 
-             </tr> 
-            </thead> 
-            <tbody> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>javax.jdo.option.ConnectionURL</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">jdbc:hsqldb:mem:test</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>JDBC URL</p> 
-                </div>
-               </div></td> 
-             </tr> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>javax.jdo.option.ConnectionDriverName</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">org.hsqldb.jdbcDriver</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>JDBC Driver</p> 
-                </div>
-               </div></td> 
-             </tr> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>javax.jdo.option.ConnectionUserName</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">sa</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>Username</p> 
-                </div>
-               </div></td> 
-             </tr> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>javax.jdo.option.ConnectionPassword</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">&lt;empty string&gt;</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>Password, possibly encrypted (see <code>datanucleus.ConnectionPasswordEncrypter</code>, below).</p> 
-                </div>
-               </div></td> 
-             </tr> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.ConnectionPasswordEncrypter</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">&lt;empty string&gt;</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>Specify the <code>datanucleus.ConnectionPasswordDecrypter</code> implementation used to decrypt the password.</p> 
-                </div> 
-                <div class="paragraph"> 
-                 <p>See the <a href="http://www.datanucleus.org/products/accessplatform_4_1/persistence_properties.html#ConnectionPasswordDecrypter">DataNucleus documentation</a> for further details.</p> 
-                </div>
-               </div></td> 
-             </tr> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.schema.autoCreateAll</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>Recreate DB for each test run (an in-memory database)</p> 
-                </div>
-               </div></td> 
-             </tr> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.schema.validateAll</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>Disable validations (minimize bootstrap time)</p> 
-                </div>
-               </div></td> 
-             </tr> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.persistenceByReachabilityAtCommit</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>As per WEB-INF/persistor_datanucleus.properties</p> 
-                </div>
-               </div></td> 
-             </tr> 
+          <div class="colist arabic"> 
+           <table> 
+            <tbody>
              <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.identifier.case</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">MixedCase</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>As per WEB-INF/persistor_datanucleus.properties</p> 
-                </div>
-               </div></td> 
+              <td><i class="conum" data-value="1"></i><b>1</b></td> 
+              <td>subclass the framework-provided <code>IsisSystemForTest.Builder</code>.</td> 
              </tr> 
              <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.cache.level2.type</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">none</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>As per WEB-INF/persistor_datanucleus.properties</p> 
-                </div>
-               </div></td> 
+              <td><i class="conum" data-value="2"></i><b>2</b></td> 
+              <td>equivalent to <code>isis.persistor=datanucleus</code> in <code>isis.properties</code></td> 
              </tr> 
              <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.cache.level2.mode</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">ENABLE_SELECTIVE</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>As per WEB-INF/persistor_datanucleus.properties</p> 
-                </div>
-               </div></td> 
+              <td><i class="conum" data-value="3"></i><b>3</b></td> 
+              <td>specify the <code>isis.services</code> key in <code>isis.properties</code> (where "domainapp" is the base package for all classes within the app)</td> 
              </tr> 
              <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.datanucleus.</code><br> <code>install-fixtures</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p>Automatically install any fixtures that might have been registered</p> 
-                </div>
-               </div></td> 
+              <td><i class="conum" data-value="4"></i><b>4</b></td> 
+              <td><code>IsisConfigurationForJdoIntegTests</code> has pre-canned configuration for using an in-memory HSQLDB and other standard settings; more on this below.</td> 
              </tr> 
              <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.persistor.</code><br> <code>enforceSafeSemantics</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div></div></td> 
+              <td><i class="conum" data-value="5"></i><b>5</b></td> 
+              <td>equivalent to <code>isis.persistor.datanucleus.RegisterEntities.packagePrefix</code> key (typically in <code>persistor_datanucleus.properties</code>)</td> 
              </tr> 
-             <tr> 
-              <td class="tableblock halign-left valign-top">
-               <div>
-                <div class="paragraph"> 
-                 <p><code>isis.deploymentType</code></p> 
-                </div>
-               </div></td> 
-              <td class="tableblock halign-left valign-top"><p class="tableblock">server_prototype</p></td> 
-              <td class="tableblock halign-left valign-top">
-               <div></div></td> 
-             </tr> 
-            </tbody> 
+            </tbody>
            </table> 
           </div> 
-         </div> 
-         <div class="sect3"> 
-          <h4 id="_abstract_class">4.2.2. Abstract Class</h4> 
-          <div class="paragraph"> 
-           <p>We recommend defining a base class for all your other classes to integration classes to inherit from. The main responsibility of this class is tocall the system initializer, described earlier. We only need the initialization to be performed once, so this call is performed in a <code>@BeforeClass</code> hook.</p> 
-          </div> 
           <div class="paragraph"> 
-           <p>The code below shows the general form:</p> 
+           <p>This builder could then be used within the system initializer:</p> 
           </div> 
           <div class="listingblock"> 
            <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTest</span> {
-    <span class="annotation">@BeforeClass</span>
-    <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initClass() {
-        org.apache.log4j.PropertyConfigurator.configure(<span class="string"><span class="delimiter">"</span><span class="content">logging.properties</span><span class="delimiter">"</span></span>);   <i class="conum" data-value="1"></i><b>(1)</b>
-        DomainAppSystemInitializer.initIsft();                                   <i class="conum" data-value="2"></i><b>(2)</b>
-        <span class="keyword">new</span> ScenarioExecutionForIntegration();                                   <i class="conum" data-value="3"></i><b>(3)</b>
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">DomainAppSystemInitializer</span> {
+    <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initIsft() {
+        IsisSystemForTest isft = IsisSystemForTest.getElseNull();
+        <span class="keyword">if</span>(isft == <span class="predefined-constant">null</span>) {
+            isft = <span class="keyword">new</span> DomainAppSystemBuilder()    <i class="conum" data-value="1"></i><b>(1)</b>
+                            .build()
+                            .setUpSystem();
+            IsisSystemForTest.set(isft);           <i class="conum" data-value="2"></i><b>(2)</b>
+        }
     }
+    <span class="directive">private</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">DomainAppSystemBuilder</span>
+        <span class="directive">extends</span> IsisSystemForTest.Builder { ... }
 }</code></pre> 
            </div> 
           </div> 
@@ -1786,37 +1604,59 @@ CustomerRepository customers;</code></pre>
             <tbody>
              <tr> 
               <td><i class="conum" data-value="1"></i><b>1</b></td> 
-              <td>ensure that logging messages don’t get swallowed</td> 
+              <td>instantiates and initializes the Apache Isis runtime (the <code>IsisSystemForTest</code> class)</td> 
              </tr> 
              <tr> 
               <td><i class="conum" data-value="2"></i><b>2</b></td> 
-              <td>initialize the Apache Isis runtime</td> 
-             </tr> 
-             <tr> 
-              <td><i class="conum" data-value="3"></i><b>3</b></td> 
-              <td>primarily exists to support the writing of <a href="../ugtst/ugtst.html#_ugtst_bdd-spec-support">BDD specifications</a>, but also enables finer-grained management of sessions/transactions (discussed below).</td> 
+              <td>binds the runtime to a thread-local.</td> 
              </tr> 
             </tbody>
            </table> 
           </div> 
-          <div class="sect4"> 
-           <h5 id="__ugtst_integ-test-support_bootstrapping_IntegrationTestAbstract"><code>IntegrationTestAbstract</code></h5> 
-           <div class="paragraph"> 
-            <p>In fact, we recommend that your base class inherit from Apache Isis' <code>IntegrationTestAbstract</code> class:</p> 
-           </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTest</span> <span class="directive">extends</span> IntegrationTestAbstract {
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="_ugtst_integ-test-support_abstract-class">4.3. Abstract class</h3>
+         <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
+          <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_abstract-class.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+          <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+          <ul class="dropdown-menu">
+           <li><a href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_abstract-class.adoc" target="_blank"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i>&nbsp; Edit</a></li>
+           <li><a href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_abstract-class.adoc" target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; History</a></li>
+           <li><a href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_abstract-class.adoc" target="_blank"><i class="fa fa-file-text-o fa-fw" aria-hidden="true"></i>&nbsp; Raw</a></li>
+           <li><a href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_abstract-class.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
+          </ul>
+         </div> 
+         <div class="paragraph"> 
+          <p>When writing integration tests, it’s easiest to inherit from a base class:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p>for <code>1.15.0-SNAPSHOT</code>, use <code>IntegrationTestAbstract2</code></p> </li> 
+           <li> <p>for earlier releases, use (its superclass) <code>IntegrationTestAbstract</code>.</p> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>This base class <a href="#_ugtst_integ-test-support_bootstrapping">bootstraps</a> the framework (caching the framework on a thread-local), and provides various utility methods and framework-provided services for use by your application’s subclass tests.</p> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract2">4.3.1. <code>IntegrationTestAbstract2</code> (<code>1.15.0-SNAPSHOT</code>)</h4> 
+          <div class="paragraph"> 
+           <p>(As of <code>1.15.0-SNAPSHOT</code>) we recommend that your integration tests inherit from Apache Isis' <code>IntegrationTestAbstract2</code> class:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTest</span> <span class="directive">extends</span> IntegrationTestAbstract2 {
     ...
 }</code></pre> 
-            </div> 
-           </div> 
-           <div class="paragraph"> 
-            <p>Although not mandatory, this provides a number of helper/convenience methods and JUnit rules:</p> 
            </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="java">    <span class="annotation">@Rule</span>
+          </div> 
+          <div class="paragraph"> 
+           <p>Although not mandatory, this provides a number of helper/convenience methods and JUnit rules:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java">    <span class="annotation">@Rule</span>
     <span class="directive">public</span> IsisTransactionRule isisTransactionRule =                         <i class="conum" data-value="1"></i><b>(1)</b>
         <span class="keyword">new</span> IsisTransactionRule();
     <span class="annotation">@Rule</span>
@@ -1828,57 +1668,321 @@ CustomerRepository customers;</code></pre>
     <span class="annotation">@Rule</span>
     <span class="directive">public</span> ExceptionRecognizerTranslate exceptionRecognizerTranslations =    <i class="conum" data-value="4"></i><b>(4)</b>
         ExceptionRecognizerTranslate.create();</code></pre> 
-            </div> 
-           </div> 
-           <div class="colist arabic"> 
-            <table> 
-             <tbody>
-              <tr> 
-               <td><i class="conum" data-value="1"></i><b>1</b></td> 
-               <td>ensures an Apache Isis session/transaction running for each test</td> 
-              </tr> 
-              <tr> 
-               <td><i class="conum" data-value="2"></i><b>2</b></td> 
-               <td>sets up a JMock context (using Apache Isis' extension to JMock as described in <a href="../ugtst/ugtst.html#_ugtst_unit-test-support_jmock-extensions">JMock Extensions</a>.</td> 
-              </tr> 
-              <tr> 
-               <td><i class="conum" data-value="3"></i><b>3</b></td> 
-               <td>standard JUnit rule for writing tests that throw exceptions</td> 
-              </tr> 
-              <tr> 
-               <td><i class="conum" data-value="4"></i><b>4</b></td> 
-               <td>to capture messages that require translation, as described in <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18 support</a>.</td> 
-              </tr> 
-             </tbody>
-            </table> 
-           </div> 
-           <div class="paragraph"> 
-            <p>All of these rules could be inlined in your own base class; as we say, they are a convenience.</p> 
            </div> 
-           <div class="paragraph"> 
-            <p>The <code>IntegrationTestAbstract</code> also provides a number of helper/convenience methods, though most of these have been deprecated because the functionality they expose is now readily accessible through various domain services; most notably these are:</p> 
+          </div> 
+          <div class="colist arabic"> 
+           <table> 
+            <tbody>
+             <tr> 
+              <td><i class="conum" data-value="1"></i><b>1</b></td> 
+              <td>ensures an Apache Isis session/transaction running for each test</td> 
+             </tr> 
+             <tr> 
+              <td><i class="conum" data-value="2"></i><b>2</b></td> 
+              <td>sets up a JMock context (using Apache Isis' extension to JMock as described in <a href="../ugtst/ugtst.html#_ugtst_unit-test-support_jmock-extensions">JMock Extensions</a>.</td> 
+             </tr> 
+             <tr> 
+              <td><i class="conum" data-value="3"></i><b>3</b></td> 
+              <td>standard JUnit rule for writing tests that throw exceptions</td> 
+             </tr> 
+             <tr> 
+              <td><i class="conum" data-value="4"></i><b>4</b></td> 
+              <td>to capture messages that require translation, as described in <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18 support</a>.</td> 
+             </tr> 
+            </tbody>
+           </table> 
+          </div> 
+          <div class="paragraph"> 
+           <p>All of these rules could be inlined in your own base class; as we say, they are a convenience.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The <code>IntegrationTestAbstract2</code> also provides a number of helper/convenience methods, though most of these have been deprecated because the functionality they expose is now readily accessible through various domain services; most notably these are:</p> 
+          </div> 
+          <div class="ulist"> 
+           <ul> 
+            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-api_RepositoryService"><code>RepositoryService</code></a></p> </li> 
+            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryService</code></a></p> </li> 
+            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_ServiceRegistry"><code>ServiceRegistry2</code></a></p> </li> 
+            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a><br></p> 
+             <div class="paragraph"> 
+              <p>to wrap objects simulating interaction through the user interface)</p> 
+             </div> </li> 
+            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_TransactionService"><code>TransactionService</code></a><br></p> 
+             <div class="paragraph"> 
+              <p>most commonly used to commit changes after the fixture setup) and,</p> 
+             </div> </li> 
+            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_SessionManagementService"><code>SessionManagementService</code></a><br></p> 
+             <div class="paragraph"> 
+              <p>for tests that check interactions over multiple separate sessions.</p> 
+             </div> </li> 
+           </ul> 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract">4.3.2. <code>IntegrationTestAbstract</code></h4> 
+          <div class="paragraph"> 
+           <p>For earlier releases we recommend that your base class inherit from Apache Isis' <code>IntegrationTestAbstract</code> class:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTest</span> <span class="directive">extends</span> IntegrationTestAbstract {
+    ...
+}</code></pre> 
            </div> 
-           <div class="ulist"> 
-            <ul> 
-             <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a><br></p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>This provides most of the benefits of <code>IntegrationTestAbstract2</code> (it is the latter’s superclass, in fact), but the <a href="#_ugtst_integ-test-support_bootstrapping">bootstrapping</a> is more verbose.</p> 
+          </div> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="_ugtst_integ-test-support_configuration-properties">4.4. Configuration Properties</h3>
+         <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
+          <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_configuration-properties.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+          <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+          <ul class="dropdown-menu">
+           <li><a href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_configuration-properties.adoc" target="_blank"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i>&nbsp; Edit</a></li>
+           <li><a href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_configuration-properties.adoc" target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; History</a></li>
+           <li><a href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_configuration-properties.adoc" target="_blank"><i class="fa fa-file-text-o fa-fw" aria-hidden="true"></i>&nbsp; Raw</a></li>
+           <li><a href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_configuration-properties.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
+          </ul>
+         </div> 
+         <div class="paragraph"> 
+          <p>The recommended way to run integration tests is against an HSQLDB in-memory database. This can be done using the application’s usual <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping"><code>AppManifest</code></a>, and then overriding JDBC URL and similar.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Different releases of the framework have provided differing ways to accomplish this. As of <code>1.15.0-SNAPSHOT</code>, using <code>IntegrationTestAbstract2’s `bootstrapUsing</code> method will make these configuration properties as the default. In earlier releases either the helper methods in <code>AppManifest.Util</code> class or the <code>IsisConfigurationForJdoIntegTests</code> (implementation of <code>IsisConfiguration</code>) can be used.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Whichever approach is used, these are the configuration properties that will be overridden:</p> 
+         </div> 
+         <table class="tableblock frame-all grid-all spread"> 
+          <caption class="title">
+           Table 1. Default Configuration Properties for Integration Tests
+          </caption> 
+          <colgroup> 
+           <col style="width: 33.3333%;"> 
+           <col style="width: 16.6666%;"> 
+           <col style="width: 50.0001%;"> 
+          </colgroup> 
+          <thead> 
+           <tr> 
+            <th class="tableblock halign-left valign-top">Property</th> 
+            <th class="tableblock halign-left valign-top">Value</th> 
+            <th class="tableblock halign-left valign-top">Description</th> 
+           </tr> 
+          </thead> 
+          <tbody> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
               <div class="paragraph"> 
-               <p>to wrap objects simulating interaction through the user interface)</p> 
-              </div> </li> 
-             <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_TransactionService"><code>TransactionService</code></a><br></p> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>javax.jdo.option.ConnectionURL</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">jdbc:hsqldb:mem:test</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
               <div class="paragraph"> 
-               <p>most commonly used to commit changes after the fixture setup) and,</p> 
-              </div> </li> 
-             <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_SessionManagementService"><code>SessionManagementService</code></a><br></p> 
+               <p>JDBC URL</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
               <div class="paragraph"> 
-               <p>for tests that check interactions over multiple separate sessions.</p> 
-              </div> </li> 
-            </ul> 
-           </div> 
-          </div> 
-         </div> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>javax.jdo.option.ConnectionDriverName</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">org.hsqldb.jdbcDriver</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>JDBC Driver</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>javax.jdo.option.ConnectionUserName</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">sa</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>Username</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>javax.jdo.option.ConnectionPassword</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">&lt;empty string&gt;</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>Password, possibly encrypted (see <code>datanucleus.ConnectionPasswordEncrypter</code>, below).</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.ConnectionPasswordEncrypter</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">&lt;empty string&gt;</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>Specify the <code>datanucleus.ConnectionPasswordDecrypter</code> implementation used to decrypt the password.</p> 
+              </div> 
+              <div class="paragraph"> 
+               <p>See the <a href="http://www.datanucleus.org/products/accessplatform_4_1/persistence_properties.html#ConnectionPasswordDecrypter">DataNucleus documentation</a> for further details.</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.schema.autoCreateAll</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>Recreate DB for each test run (an in-memory database)</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.schema.validateAll</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>Disable validations (minimize bootstrap time)</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.persistenceByReachabilityAtCommit</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>As per WEB-INF/persistor_datanucleus.properties</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.identifier.case</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">MixedCase</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>As per WEB-INF/persistor_datanucleus.properties</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.cache.level2.type</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">none</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>As per WEB-INF/persistor_datanucleus.properties</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.impl.</code><br> <code>datanucleus.cache.level2.mode</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">ENABLE_SELECTIVE</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>As per WEB-INF/persistor_datanucleus.properties</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.datanucleus.</code><br> <code>install-fixtures</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p>Automatically install any fixtures that might have been registered</p> 
+              </div>
+             </div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.persistor.</code><br> <code>enforceSafeSemantics</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div></div></td> 
+           </tr> 
+           <tr> 
+            <td class="tableblock halign-left valign-top">
+             <div>
+              <div class="paragraph"> 
+               <p><code>isis.deploymentType</code></p> 
+              </div>
+             </div></td> 
+            <td class="tableblock halign-left valign-top"><p class="tableblock">server_prototype</p></td> 
+            <td class="tableblock halign-left valign-top">
+             <div></div></td> 
+           </tr> 
+          </tbody> 
+         </table> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugtst_integ-test-support_wrapper-factory">4.3. Wrapper Factory</h3>
+         <h3 id="_ugtst_integ-test-support_wrapper-factory">4.5. Wrapper Factory</h3>
          <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
           <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_wrapper-factory.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
           <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
@@ -1932,7 +2036,7 @@ CustomerRepository customers;</code></pre>
           <p>Let’s look in a bit more detail at what the test can do with the wrapper.</p> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_wrapping_and_unwrapping">4.3.1. Wrapping and Unwrapping</h4> 
+          <h4 id="_wrapping_and_unwrapping">4.5.1. Wrapping and Unwrapping</h4> 
           <div class="paragraph"> 
            <p>Wrapping a domain object is very straightforward; simply call <code>WrapperFactory#wrap(…​)</code>.</p> 
           </div> 
@@ -1971,7 +2075,7 @@ Customer customer = (Customer)((WrappingObject)wrappedCustomer).__isis_wrapped()
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_using_the_wrapper">4.3.2. Using the wrapper</h4> 
+          <h4 id="_using_the_wrapper">4.5.2. Using the wrapper</h4> 
           <div class="paragraph"> 
            <p>As the wrapper is intended to simulate the UI, only those methods that correspond to the "primary" methods of the domain object’s members are allowed to be called. That means:</p> 
           </div> 
@@ -2009,7 +2113,7 @@ Customer customer = (Customer)((WrappingObject)wrappedCustomer).__isis_wrapped()
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_firing_domain_events">4.3.3. Firing Domain Events</h4> 
+          <h4 id="_firing_domain_events">4.5.3. Firing Domain Events</h4> 
           <div class="paragraph"> 
            <p>As well as enforcing business rules, the wrapper has another important feature, namely that it will cause domain events to be fired.</p> 
           </div> 
@@ -2101,7 +2205,7 @@ Customer customer = (Customer)((WrappingObject)wrappedCustomer).__isis_wrapped()
          </div> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugtst_integ-test-support_maven-configuration">4.4. Maven Configuration</h3>
+         <h3 id="_ugtst_integ-test-support_maven-configuration">4.6. Maven Configuration</h3>
          <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
           <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_integ-test-support_maven-configuration.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
           <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>