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/10/10 22:48:17 UTC

[2/9] isis-site git commit: ISIS-1465: removes stale/old 'app structure' section from simpleapp archetype guide

http://git-wip-us.apache.org/repos/asf/isis-site/blob/0db8d597/content/guides/ugfun/ugfun.html
----------------------------------------------------------------------
diff --git a/content/guides/ugfun/ugfun.html b/content/guides/ugfun/ugfun.html
index ae6c0fb..31dfdd0 100644
--- a/content/guides/ugfun/ugfun.html
+++ b/content/guides/ugfun/ugfun.html
@@ -2079,64 +2079,36 @@ table.CodeRay td.code>pre{padding:0}
        </div> 
       </div> 
       <div class="sect1"> 
-       <h2 id="_ugfun_getting-started">4. Getting Started</h2>
+       <h2 id="_ugfun_getting-started_helloworld-archetype">4. HelloWorld Archetype</h2>
        <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/ugfun/_ugfun_getting-started.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+        <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/ugfun/_ugfun_getting-started_helloworld-archetype.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/ugfun/_ugfun_getting-started.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/ugfun/_ugfun_getting-started.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/ugfun/_ugfun_getting-started.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/ugfun/_ugfun_getting-started.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
+         <li><a href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugfun/_ugfun_getting-started_helloworld-archetype.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/ugfun/_ugfun_getting-started_helloworld-archetype.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/ugfun/_ugfun_getting-started_helloworld-archetype.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/ugfun/_ugfun_getting-started_helloworld-archetype.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
         </ul>
        </div> 
        <div class="sectionbody"> 
         <div class="paragraph"> 
-         <p>To get you up and running quickly, Apache Isis provides two archetypes:</p> 
+         <p>The quickest way to start learning about Apache Isis is to run the <code>helloworld</code> archetype. This will generate a tiny Apache Isis app, consisting of a simple one-class domain model, called <code>HelloWorldObject</code>, and a supporting <code>HelloWorldObjects</code> domain service. Both the business logic and supporting bootstrapping classes are in a single Maven module (in different Java packages).</p> 
         </div> 
-        <div class="ulist"> 
-         <ul> 
-          <li> <p><a href="../ugfun/ugfun.html#_ugfun_getting-started_helloworld-archetype">HelloWorld archetype</a> generates a one domain class application so you can quickly learn about Apache Isis by trying it out.<br></p> 
-           <div class="paragraph"> 
-            <p>For simplisty, the generated application is a single Maven module containing both the business logic classes and the bootstrapping code.</p> 
-           </div> </li> 
-          <li> <p><a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>, a slightly more sophisticated one domain class version suitable for use as the basis of your own apps.<br></p> 
-           <div class="paragraph"> 
-            <p>This is still quite minimal so that you won’t have to spend lots of time removing generated artifacts. On the other hand, it does set up a standard multi-module maven structure with unit- and integration tests pre-configured, as well as a webapp module so that you can easily run your app. We strongly recommend that you preserve this structure as you develop your own Isis application.</p> 
-           </div> </li> 
-         </ul> 
-        </div> 
-        <div class="paragraph"> 
-         <p>In this chapter we also discuss the <a href="../ugfun/ugfun.html#_ugfun_getting-started_datanucleus-enhancer">DataNucleus enhancer</a>. <a href="http://www.datanucleus.org/">DataNucleus</a> is the reference implementation of the JDO (Java Data Objects) spec, and Apache Isis integrates with DataNucleus as its persistence layer. The enhancer performs post-processing on the bytecode of your persistent domain entities, such that they can be persisted by Apache Isis' JDO/DataNucleus objectstore.</p> 
-        </div> 
-        <div class="admonitionblock note"> 
+        <div class="admonitionblock tip"> 
          <table> 
           <tbody>
            <tr> 
-            <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
+            <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
             <td class="content"> 
              <div class="paragraph"> 
-              <p>The <a href="../ugfun/ugfun.html#_ugfun_getting-started_helloworld-archetype">HelloWorld</a> and <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp</a> archetypes automatically configures the enhancer, so there’s little you need to do at this stage.</p> 
-             </div> 
-             <div class="paragraph"> 
-              <p>Even so we feel it’s a good idea to be aware of this critical part of Apache Isis runtime; if the enhancer does not run, then you’ll find the app fails to start with (what will seem like) quite an obscure exception message.</p> 
+              <p>We don’t recommend that you use the helloworld archetype as the basis for your own applications. Instead, use the <a href="#_ugfun_getting-started_simpleapp-archetype">simpleapp archetype</a>. This also creates a minimal application, but provides more structure and example tests, useful as you build out your own app.</p> 
              </div> </td> 
            </tr> 
           </tbody>
          </table> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugfun_getting-started_prerequisites.adoc">4.1. Prerequisites</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/ugfun/_ugfun_getting-started_prerequisites.adoc.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/ugfun/_ugfun_getting-started_prerequisites.adoc.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/ugfun/_ugfun_getting-started_prerequisites.adoc.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/ugfun/_ugfun_getting-started_prerequisites.adoc.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/ugfun/_ugfun_getting-started_prerequisites.adoc.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
-          </ul>
-         </div> 
+         <h3 id="_ugfun_getting-started_prerequisites.adoc">4.1. Prerequisites</h3> 
          <div class="paragraph"> 
           <p>Apache Isis is a Java based framework, so in terms of prerequisites, you’ll need to install:</p> 
          </div> 
@@ -2157,44 +2129,16 @@ table.CodeRay td.code>pre{padding:0}
          </div> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugfun_getting-started_helloworld-archetype">4.2. HelloWorld Archetype</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/ugfun/_ugfun_getting-started_helloworld-archetype.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/ugfun/_ugfun_getting-started_helloworld-archetype.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/ugfun/_ugfun_getting-started_helloworld-archetype.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/ugfun/_ugfun_getting-started_helloworld-archetype.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/ugfun/_ugfun_getting-started_helloworld-archetype.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
-          </ul>
-         </div> 
+         <h3 id="__ugfun_getting-started_helloworld-archetype_generating-the-app">4.2. Generating the App</h3> 
          <div class="paragraph"> 
-          <p>The quickest way to start learning about Apache Isis is to run the <code>helloworld</code> archetype. This will generate a tiny Apache Isis app, consisting of a simple one-class domain model, called <code>HelloWorldObject</code>, and a supporting <code>HelloWorldObjects</code> domain service. Both the business logic and supporting bootstrapping classes are in a single Maven module (in different Java packages).</p> 
+          <p>Create a new directory, and <code>cd</code> into that directory.</p> 
          </div> 
-         <div class="admonitionblock tip"> 
-          <table> 
-           <tbody>
-            <tr> 
-             <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
-             <td class="content"> 
-              <div class="paragraph"> 
-               <p>We don’t recommend that you use the helloworld archetype as the basis for your own applications. Instead, use the <a href="#_ugfun_getting-started_simpleapp-archetype">simpleapp archetype</a>. This also creates a minimal application, but provides more structure and example tests, useful as you build out your own app.</p> 
-              </div> </td> 
-            </tr> 
-           </tbody>
-          </table> 
+         <div class="paragraph"> 
+          <p>To build the app from the latest stable release, then run the following command:</p> 
          </div> 
-         <div class="sect3"> 
-          <h4 id="__ugfun_getting-started_helloworld-archetype_generating-the-app">4.2.1. Generating the App</h4> 
-          <div class="paragraph"> 
-           <p>Create a new directory, and <code>cd</code> into that directory.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>To build the app from the latest stable release, then run the following command:</p> 
-          </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="bash">mvn archetype:generate  \
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="bash">mvn archetype:generate  \
     -D archetypeGroupId=org.apache.isis.archetype \
     -D archetypeArtifactId=helloworld-archetype \
     -D archetypeVersion=1.15.1 \
@@ -2202,48 +2146,33 @@ table.CodeRay td.code>pre{padding:0}
     -D artifactId=myapp \
     -D version=1.0-SNAPSHOT \
     -B</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>where:</p> 
-          </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p><code>groupId</code> represents your own organization, and</p> </li> 
-            <li> <p><code>artifactId</code> is a unique identifier for this app within your organization.</p> </li> 
-            <li> <p><code>version</code> is the initial (snapshot) version of your app</p> </li> 
-           </ul> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The archetype generation process will then run; it only takes a few seconds.</p> 
           </div> 
          </div> 
-         <div class="sect3"> 
-          <h4 id="__ugfun_getting-started_helloworld-archetype_building-the-app">4.2.2. Building the App</h4> 
-          <div class="paragraph"> 
-           <p>Switch into the root directory of your newly generated app, and build your app:</p> 
-          </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="bash">cd myapp
-mvn clean install</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>where <code>myapp</code> is the <code>artifactId</code> entered above.</p> 
-          </div> 
+         <div class="paragraph"> 
+          <p>where:</p> 
          </div> 
-         <div class="sect3"> 
-          <h4 id="__ugfun_getting-started_helloworld-archetype_structure-of-the-app">4.2.3. Structure of the App</h4> 
-          <div class="paragraph"> 
-           <p>As noted above, the application generated by the helloworld archetype is deliberately simplified, with everything contained within a single Maven module.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Under <code>src/main/java</code> we have:</p> 
-          </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre>domainapp/
+         <div class="ulist"> 
+          <ul> 
+           <li> <p><code>groupId</code> represents your own organization, and</p> </li> 
+           <li> <p><code>artifactId</code> is a unique identifier for this app within your organization.</p> </li> 
+           <li> <p><code>version</code> is the initial (snapshot) version of your app</p> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The archetype generation process will then run; it only takes a few seconds.</p> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="__ugfun_getting-started_helloworld-archetype_structure-of-the-app">4.3. Structure of the App</h3> 
+         <div class="paragraph"> 
+          <p>As noted above, the application generated by the helloworld archetype is deliberately simplified, with everything contained within a single Maven module.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Under <code>src/main/java</code> we have:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre>domainapp/
 ├── application/
 │   ├── HelloWorldAppManifest.java
 │   └── isis.properties
@@ -2256,37 +2185,39 @@ mvn clean install</code></pre>
 │       └── HelloWorldObjects.java
 └── app/
     ├── HelloWorldApplication.java
-    └── welcome.html</pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>For simplicity, all the Java source files generated by the archetype are placed in a <code>domainapp</code> top-level package.</p> 
-          </div> 
-          <div class="admonitionblock tip"> 
-           <table> 
-            <tbody>
-             <tr> 
-              <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
-              <td class="content"> 
-               <div class="paragraph"> 
-                <p>While it’s more conventional to use the inverse domain name for package (eg <code>com.mycompany.myapp</code>, that’s only really appropriate for library code that will be released for reuse by multiple applications in different orgnisations (eg open source).</p> 
-               </div> 
-               <div class="paragraph"> 
-                <p>For internal application though this is less of a concern; indeed, avoiding using the domain name means that if the company is taken over then nothing needs be changed.</p> 
-               </div> 
-               <div class="paragraph"> 
-                <p>Of course, just are free to move the classes to a different package if you wish.</p> 
-               </div> </td> 
-             </tr> 
-            </tbody>
-           </table> 
-          </div> 
-          <div class="paragraph"> 
-           <p>In <code>domainapp.application</code> package is <code>HelloWorldAppManifest</code>, which implements the <code>AppManifest</code> interface defined by the Apache Isis applib. The class is only small, so is worth showing here in its entirety:</p> 
+    └── welcome.html
+META-INF/
+└── persistence.xml</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">HelloWorldAppManifest</span> <span class="directive">extends</span> AppManifestAbstract {
+         </div> 
+         <div class="paragraph"> 
+          <p>For simplicity, all the Java source files generated by the archetype are placed in a <code>domainapp</code> top-level package.</p> 
+         </div> 
+         <div class="admonitionblock note"> 
+          <table> 
+           <tbody>
+            <tr> 
+             <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
+             <td class="content"> 
+              <div class="paragraph"> 
+               <p>While it’s more conventional to use the inverse domain name for package (eg <code>com.mycompany.myapp</code>, that’s only really appropriate for library code that will be released for reuse by multiple applications in different orgnisations (eg open source).</p> 
+              </div> 
+              <div class="paragraph"> 
+               <p>For internal application though this is less of a concern; indeed, avoiding using the domain name means that if the company rebrands or is taken over then nothing needs be changed.</p> 
+              </div> 
+              <div class="paragraph"> 
+               <p>Of course, you are always free to move the classes to a different package if you wish.</p> 
+              </div> </td> 
+            </tr> 
+           </tbody>
+          </table> 
+         </div> 
+         <div class="paragraph"> 
+          <p>In <code>domainapp.application</code> package is <code>HelloWorldAppManifest</code>, which implements the <code>AppManifest</code> interface defined by the Apache Isis applib. The class is only small, so is worth showing here in its entirety:</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">HelloWorldAppManifest</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(HelloWorldModule.class)
             .withConfigurationPropertiesFile(HelloWorldAppManifest.class, <span class="string"><span class="delimiter">"</span><span class="content">isis.properties</span><span class="delimiter">"</span></span>)
@@ -2296,134 +2227,139 @@ mvn clean install</code></pre>
         <span class="local-variable">super</span>(BUILDER);
     }
 }</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Rather than implement <code>AppManifest</code> directly, <code>HelloWorldAppManifest</code> uses the builder provided by the convenience <code>AppManifestAbstract</code>); as you’ll find when you work on bigger applications, it’s common to have variations around the app manifest, so the builder makes it easy to create these variations without lots of boilerplate.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>For now, we see that (using the builder) the app manifest defines three things:</p> 
-          </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p>a list of modules - there’s just one, <code>HelloWorldModule</code> for this class</p> </li> 
-            <li> <p>the location of a configuration file, <code>isis.properties</code>, read in as a resource from the classpath</p> </li> 
-            <li> <p>specifying an authentication/authorisation mechanism, in this case Apache Shiro integration.</p> </li> 
-           </ul> 
-          </div> 
-          <div class="paragraph"> 
-           <p>In Apache Isis a module is simply an empty class, which is used simply to obtain a package name. The framework uses classpath scanning to find certain classes; rather than scan the entire classpath it limits its search to the package(s) obtained from the modules.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The packages are scanned to identify three types of classes:</p> 
-          </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p>all entities.</p> 
-             <div class="paragraph"> 
-              <p>These are entities that are annotated with <code>@javax.jdo.annotations.PersistenceCapable</code>. These are passed through to the JDO (DataNucleus) object store, in order to create database mappings from the entities to relational tables</p> 
-             </div> </li> 
-           </ul> 
-          </div> 
-          <div class="paragraph"> 
-           <p>In the helloworld application, the only entity is <code>HelloWorldObject</code>.</p> 
-          </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p>all domain services</p> 
-             <div class="paragraph"> 
-              <p>These are classes that are annotated with the framework’s <code>@DomainService</code> annotation. Depending on their nature, services are used to build up the menu, or are available to call programmatically, eg repositories. The framework instantiates an instance of each and will automatically inject the services into other domain objects and services.</p> 
-             </div> 
-             <div class="paragraph"> 
-              <p>In the helloworld application, the only domain service is <code>HelloWorldObjects</code>. This appears in the menu, and also acts as a repository for the <code>HelloWorldObject</code> entity.</p> 
-             </div> </li> 
-            <li> <p>all fixture scripts</p> 
-             <div class="paragraph"> 
-              <p>These are classes that extend from the applib <code>FixtureScript</code> class, and are used to setup the database when running in prototype mode (against an in-memory database.</p> 
-             </div> 
-             <div class="paragraph"> 
-              <p>The helloworld application doesn’t provide any examples of these.</p> 
-             </div> </li> 
-           </ul> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The app manifest also identifies the <code>isis.properties</code> file (in the same package as <code>HelloWorldAppManifest</code>) as containing various configuration options. The helloworld application uses these for settings that are unlikely to change and so are loaded as a static resource from the classpath.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>You’ll find that there’s another file called <code>isis.properties</code> that’s in <code>WEB-INF/isis.properties</code>. This also provides configuration options (the framework simply combines them) but those in <code>WEB-INF/isis.properties</code> are restricted to settings that are likely to change from environment to environment, most notably JDBC URL connection strings. Separating these out makes it easy to reconfigure the application to run against different databases in different environments (dev, test, production etc).</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Finally, the app manifest identifies Apache Shiro for authentication and authorisation. Shiro in turn is configured using the <code>WEB-INF/shiro.ini</code> file.</p> 
           </div> 
-          <div class="admonitionblock tip"> 
-           <table> 
-            <tbody>
-             <tr> 
-              <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
-              <td class="content"> 
-               <div class="paragraph"> 
-                <p>The security integration provided by Apache Isis and Shiro is quite sophisticated; to get started though you can just login using:</p> 
-               </div> 
-               <div class="ulist"> 
-                <ul> 
-                 <li> <p>username: <code>sven</code></p> </li> 
-                 <li> <p>password: <code>pass</code></p> </li> 
-                </ul> 
-               </div> </td> 
-             </tr> 
-            </tbody>
-           </table> 
-          </div> 
-          <div class="paragraph"> 
-           <p>In the <code>domainapp.dom</code> module ("dom" stands for "domain object model") is the <code>HelloWorldModule</code>:</p> 
-          </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">domainapp.dom</span>;
+         </div> 
+         <div class="paragraph"> 
+          <p>Rather than implement <code>AppManifest</code> directly, <code>HelloWorldAppManifest</code> uses the builder provided by the convenience <code>AppManifestAbstract</code>); as you’ll find when you work on bigger applications, it’s common to have variations around the app manifest, so the builder makes it easy to create these variations without lots of boilerplate.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>For now, we see that (using the builder) the app manifest defines three things:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p>a list of modules - there’s just one, <code>HelloWorldModule</code> for this class</p> </li> 
+           <li> <p>the location of a configuration file, <code>isis.properties</code>, read in as a resource from the classpath</p> </li> 
+           <li> <p>specifying an authentication/authorisation mechanism, in this case Apache Shiro integration.</p> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>In Apache Isis a module is simply an empty class, which is used simply to obtain a package name. The framework uses classpath scanning to find certain classes; rather than scan the entire classpath it limits its search to the package(s) obtained from the modules.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The packages are scanned to identify three types of classes:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p>all entities.</p> 
+            <div class="paragraph"> 
+             <p>These are entities that are annotated with <code>@javax.jdo.annotations.PersistenceCapable</code>. These are passed through to the JDO (DataNucleus) object store, in order to create database mappings from the entities to relational tables</p> 
+            </div> 
+            <div class="paragraph"> 
+             <p>In the helloworld application, the only entity is <code>HelloWorldObject</code>.</p> 
+            </div> </li> 
+           <li> <p>all domain services</p> 
+            <div class="paragraph"> 
+             <p>These are classes that are annotated with the framework’s <code>@DomainService</code> annotation. Depending on their nature, services are used to build up the menu, or are available to call programmatically, eg repositories. The framework instantiates an instance of each and will automatically inject the services into other domain objects and services.</p> 
+            </div> 
+            <div class="paragraph"> 
+             <p>In the helloworld application, the only domain service is <code>HelloWorldObjects</code>. This appears in the menu, and also acts as a repository for the <code>HelloWorldObject</code> entity.</p> 
+            </div> </li> 
+           <li> <p>all fixture scripts</p> 
+            <div class="paragraph"> 
+             <p>These are classes that extend from the applib <code>FixtureScript</code> class, and are used to setup the database when running in prototype mode (against an in-memory database).</p> 
+            </div> 
+            <div class="paragraph"> 
+             <p>The helloworld application doesn’t provide any examples of these.</p> 
+            </div> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The app manifest also identifies the <code>isis.properties</code> file (in the same package as <code>HelloWorldAppManifest</code>) as containing various configuration options. The helloworld application uses these for settings that are unlikely to change and so are loaded as a static resource from the classpath.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>You’ll find that there’s another file called <code>isis.properties</code> that’s in <code>WEB-INF/isis.properties</code>. This also provides configuration options (the framework simply combines them) but those in <code>WEB-INF/isis.properties</code> are restricted to settings that are likely to change from environment to environment, most notably JDBC URL connection strings. Separating these out makes it easy to reconfigure the application to run against different databases in different environments (dev, test, production etc).</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Finally, the app manifest identifies Apache Shiro for authentication and authorisation. Shiro in turn is configured using the <code>WEB-INF/shiro.ini</code> file.</p> 
+         </div> 
+         <div class="admonitionblock tip"> 
+          <table> 
+           <tbody>
+            <tr> 
+             <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
+             <td class="content"> 
+              <div class="paragraph"> 
+               <p>The security integration provided by Apache Isis and Shiro is quite sophisticated; to get started though you can just login using username: <code>sven</code>, password: <code>pass</code>.</p> 
+              </div> </td> 
+            </tr> 
+           </tbody>
+          </table> 
+         </div> 
+         <div class="paragraph"> 
+          <p>In the <code>domainapp.dom</code> module ("dom" stands for "domain object model") is the <code>HelloWorldModule</code>:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">domainapp.dom</span>;
 <span class="directive">public</span> <span class="directive">final</span> <span class="type">class</span> <span class="class">HelloWorldModule</span> {
     <span class="directive">private</span> HelloWorldModule(){}
 }</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>As already explained, this is simply used by the app manifest to identify "domainapp.dom" as the package to scan to locate entities (<code>HelloWorldObject</code>), services (<code>HelloWorldObjects</code>) and fixture scripts (none provided).</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>In the <code>domainapp.dom.impl</code> we have the classes that actually comprise our domain object. These are a little large to list here in their entirety, but it’s worth calling out:</p> 
-          </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p><code>HelloWorldObject</code>:</p> 
-             <div class="ulist"> 
-              <ul> 
-               <li> <p>is annotated with a bunch of JDO annotations, <code>@PersistenceCapable</code> being the most important.</p> 
-                <div class="paragraph"> 
-                 <p>This annotation is what identifies the class as an entity, so that Apache Isis passes through to JDO/DataNucleus during bootstrapping (to create the ORM mappings).</p> 
-                </div> </li> 
-               <li> <p>is also annotated with Isis' own <code>@DomainObject</code>.</p> 
-                <div class="paragraph"> 
-                 <p>This isn’t mandatory, but since entities are the real building blocks on which Isis applications are built, it’s very common to use this annotation.</p> 
-                </div> </li> 
-               <li> <p>also uses various Project Lombok annotations to remove boilerplate.</p> </li> 
-              </ul> 
-             </div> </li> 
-            <li> <p><code>HelloWorldObject.layout.xml</code> defines the layout of the properties and actions of the <code>HelloWorldObject</code> (this class doesn’t have any collections).</p> </li> 
-            <li> <p><code>HelloWorldObject.png</code> is used as an icon for any instances of the domain object shown in the (Wicket) viewer</p> </li> 
-            <li> <p><code>HelloWorldObjects</code> is a domain service by virtue of the fact that it is annotated with Isis' <code>@DomainService</code>.</p> </li> 
-           </ul> 
           </div> 
-          <div class="paragraph"> 
-           <p>This acts as both a menu (the <code>@DomainService#nature</code> attribute) and also a repository to find/create instances of <code>HelloWorldObject</code>.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Finally, in the <code>domainapp.webapp</code> we have <code>HelloWorldApplication</code>. This is required to bootstrap the Wicket viewer (it is configured in <code>WEB-INF/web.xml</code>). Internally it uses Google Guice to configure various static resources served up by Wicket:</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>As already explained, this is simply used by the app manifest to identify "domainapp.dom" as the package to scan to locate entities (<code>HelloWorldObject</code>), services (<code>HelloWorldObjects</code>) and fixture scripts (none provided).</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>In the <code>domainapp.dom.impl</code> we have the classes that actually comprise our domain object. These are a little large to list here in their entirety, but it’s worth calling out:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p><code>HelloWorldObject</code>:</p> 
+            <div class="ulist"> 
+             <ul> 
+              <li> <p>is annotated with a bunch of JDO annotations, <code>@PersistenceCapable</code> being the most important.</p> 
+               <div class="paragraph"> 
+                <p>This annotation is what identifies the class as an entity, so that Apache Isis passes through to JDO/DataNucleus during bootstrapping (to create the ORM mappings).</p> 
+               </div> </li> 
+              <li> <p>is also annotated with Isis' own <code>@DomainObject</code>.</p> 
+               <div class="paragraph"> 
+                <p>This isn’t mandatory, but since entities are the real building blocks on which Isis applications are built, it’s very common to use this annotation.</p> 
+               </div> </li> 
+              <li> <p>also uses various Project Lombok annotations to remove boilerplate.</p> </li> 
+             </ul> 
+            </div> </li> 
+           <li> <p><code>HelloWorldObject.layout.xml</code> defines the layout of the members (properties and actions) of the <code>HelloWorldObject</code>.</p> 
+            <div class="paragraph"> 
+             <p>Layout files are optional - Apache Isis is an implementation of the naked objects pattern, after all - but in most cases you’ll find it easiest to use one</p> 
+            </div> </li> 
+           <li> <p><code>HelloWorldObject.png</code> is used as an icon for any instances of the domain object shown in the (Wicket) viewer</p> </li> 
+           <li> <p><code>HelloWorldObjects</code> is a domain service by virtue of the fact that it is annotated with Isis' <code>@DomainService</code>.</p> 
+            <div class="paragraph"> 
+             <p>This acts as both a menu (the <code>@DomainService#nature</code> attribute) and also a repository to find/create instances of <code>HelloWorldObject</code>.</p> 
+            </div> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The <code>META-INF/persistence.xml</code> also relates to domain entities. JDO/DataNucleus allows metadata mapping information to be specified using either XML or annotations. In the Apache Isis community we generally prefer to use annotations, but nevertheless this file is required, even though it is basically empty:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;persistence</span> <span class="attribute-name">xmlns</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://java.sun.com/xml/ns/persistence</span><span class="delimiter">"</span></span>
+    <span class="attribute-name">xmlns:xsi</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://www.w3.org/2001/XMLSchema-instance</span><span class="delimiter">"</span></span>
+    <span class="attribute-name">xsi:schemaLocation</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd</span><span class="delimiter">"</span></span> <span class="attribute-name">version</span>=<span class="string"><span class="delimiter">"</span><span class="content">1.0</span><span class="delimiter">"</span></span><span class="tag">&gt;</span>
+
+    <span class="tag">&lt;persistence-unit</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">helloworld</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span>
+<span class="tag">&lt;/persistence&gt;</span></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">HelloWorldApplication</span> <span class="directive">extends</span> IsisWicketApplication {
+         </div> 
+         <div class="paragraph"> 
+          <p>Finally, in the <code>domainapp.webapp</code> we have <code>HelloWorldApplication</code>. This is required to bootstrap the Wicket viewer (it is configured in <code>WEB-INF/web.xml</code>). Internally it uses Google Guice to configure various static resources served up by Wicket:</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">HelloWorldApplication</span> <span class="directive">extends</span> IsisWicketApplication {
     ...
-    <span class="annotation">@Override</span>
-    <span class="directive">protected</span> Module newIsisWicketModule() {
+    protected Module newIsisWicketModule() {
         <span class="directive">final</span> Module isisDefaults = <span class="local-variable">super</span>.newIsisWicketModule();
         <span class="directive">final</span> Module overrides = <span class="keyword">new</span> AbstractModule() {
             <span class="annotation">@Override</span>
@@ -2434,17 +2370,17 @@ mvn clean install</code></pre>
         <span class="keyword">return</span> Modules.override(isisDefaults).with(overrides);
     }
 }</code></pre> 
-           </div> 
           </div> 
-          <div class="paragraph"> 
-           <p>The <code>configure()</code> method is the place to change the name of the application for example, or to change the initial about and welcome messages. The text of the welcome page shown by the Wicket viewer can be found in <code>welcome.html</code>, loaded from the classpath and in the same package as <code>HelloWorldApplication</code>.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Under <code>src/main/webapp</code> we have various resources that are used to configure the webapp, or that are served up by the running webapp:</p> 
-          </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre>about/
+         </div> 
+         <div class="paragraph"> 
+          <p>The <code>configure()</code> method is the place to change the name of the application for example, or to change the initial about and welcome messages. The text of the welcome page shown by the Wicket viewer can be found in <code>welcome.html</code>, loaded from the classpath and in the same package as <code>HelloWorldApplication</code>.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Under <code>src/main/webapp</code> we have various resources that are used to configure the webapp, or that are served up by the running webapp:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre>about/
 └── index.html
 css/
 └── application.css
@@ -2456,189 +2392,204 @@ WEB-INF/
 ├── logging.properties
 ├── shiro.ini
 └── web.xml</pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Most important of these is <code>WEB-INF/web.xml</code>, which bootstraps both the Wicket viewer and the Restful Objects viewer (the REST API derived from the domain object model).</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The <code>about/index.html</code> is the page shown at the root of the package, providing links to either the Wicket viewer or to Swagger. In a production application this is usually replaced with a page that does an HTTP 302 redirect to the Wicket viewer.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>In <code>css/application.css</code> you can use to customise CSS, typically to highlight certain fields or states. The pages generated by the Wicket viewer have plenty of CSS classes to target. You can also implement the <code>cssClass()</code> method in each domain object to provide additional CSS classes to target.</p> 
           </div> 
-          <div class="paragraph"> 
-           <p>Similarly, in <code>scripts/application.js</code> you have the option to add arbitrary Javascript. JQuery is available by default.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>In <code>swagger-ui</code> is a copy of the Swagger 2.x UI classes, preconfigured to run against the REST API exposed by the Restful Objects viewer. This can be useful for developing custom applications, and is accessible from the initial page (served up by <code>about/index.html</code>).</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Finally in <code>WEB-INF</code> we have the standard <code>web.xml</code> (already briefly discussed) along with several other files:</p> 
-          </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p><code>isis.properties</code> contains further configuration settings for Apache Isis itself.</p> 
-             <div class="paragraph"> 
-              <p>(As already discsussed), these are in addition to the configuration files found in the <code>isis.properties</code> that lives alongside the <code>HelloWorldAppManifest</code> class. Those in the WEB-INF/isis.properties file are those that are likely to change when running the application in different environments.</p> 
-             </div> </li> 
-            <li> <p><code>logging.properties</code> configures log4j.</p> 
-             <div class="paragraph"> 
-              <p>The framework is configured to use slf4j running against log4j.</p> 
-             </div> </li> 
-            <li> <p><code>shiro.ini</code> configures Apache Shiro, used for security (authentication and authorisation)</p> </li> 
-            <li> <p><code>web.xml</code> configures the Wicket viewer and Restful Objects viewer. It also sets up various filters for serving up static resources with caching HTTP headers.</p> </li> 
-           </ul> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Under <code>src/test/java</code> we have:</p> 
-          </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre>domainapp
-└── dom
-    └── impl
+         </div> 
+         <div class="paragraph"> 
+          <p>Most important of these is <code>WEB-INF/web.xml</code>, which bootstraps both the Wicket viewer and the Restful Objects viewer (the REST API derived from the domain object model).</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The <code>about/index.html</code> is the page shown at the root of the package, providing links to either the Wicket viewer or to the Swagger UI. In a production application this is usually replaced with a page that does an HTTP 302 redirect to the Wicket viewer.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>In <code>css/application.css</code> you can use to customise CSS, typically to highlight certain fields or states. The pages generated by the Wicket viewer have plenty of CSS classes to target. You can also implement the <code>cssClass()</code> method in each domain object to provide additional CSS classes to target.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Similarly, in <code>scripts/application.js</code> you have the option to add arbitrary Javascript. JQuery is available by default.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>In <code>swagger-ui</code> is a copy of the Swagger 2.x UI classes, preconfigured to run against the REST API exposed by the Restful Objects viewer. This can be useful for developing custom applications, and is accessible from the initial page (served up by <code>about/index.html</code>).</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Finally in <code>WEB-INF</code> we have the standard <code>web.xml</code> (already briefly discussed) along with several other files:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p><code>isis.properties</code> contains further configuration settings for Apache Isis itself.</p> 
+            <div class="paragraph"> 
+             <p>(As already discussed), these are in addition to the configuration properties found in the <code>isis.properties</code> that lives alongside and that is loaded by the <code>HelloWorldAppManifest</code> class. Those in the WEB-INF/isis.properties file are those that are likely to change when running the application in different environments.</p> 
+            </div> </li> 
+           <li> <p><code>logging.properties</code> configures log4j.</p> 
+            <div class="paragraph"> 
+             <p>The framework is configured to use slf4j running against log4j.</p> 
+            </div> </li> 
+           <li> <p><code>shiro.ini</code> configures Apache Shiro, used for security (authentication and authorisation)</p> </li> 
+           <li> <p><code>web.xml</code> configures the Wicket viewer and Restful Objects viewer. It also sets up various filters for serving up static resources with caching HTTP headers.</p> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Under <code>src/test/java</code> we have:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre>domainapp/
+└── dom/
+    └── impl/
         ├── HelloWorldObjectTest_delete.java
         └── HelloWorldObjectTest_updateName.java</pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>These are very simple unit tests of <code>HelloWorldObject</code>. They use JMock as the mocking library (with some minor extensions provided by Apache Isis itself).</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Finally, at the root directory we of course have the <code>pom.xml</code>. Some notable points:</p> 
-          </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p>since this module generates a WAR file, the <code>pom.xml</code> uses <code>&lt;packaging&gt;war&lt;/packaging&gt;</code></p> </li> 
-            <li> <p>maven mixins are used to remove boilerplate configuration of standard plugins (resources, compile, jar etc), for the DataNucleus enhancer, for surefire (tests), and for running the application using jetty plugin</p> </li> 
-           </ul> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Now you know your way around the code generated by the archetype, lets see how to run it.</p> 
           </div> 
          </div> 
-         <div class="sect3"> 
-          <h4 id="__ugfun_getting-started_helloworld-archetype_running-the-app">4.2.4. Running the App</h4> 
-          <div class="paragraph"> 
-           <p>The <code>helloworld</code> archetype generates a single WAR file, configured to run both the <a href="../ugvw/ugvw.html">Wicket viewer</a> and the <a href="../ugvro/ugvro.html">Restful Objects viewer</a>. The archetype also configures the DataNucleus/JDO Objectstore to use an in-memory HSQLDB connection.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Once you’ve built the app, you can run the WAR in a variety of ways.</p> 
-          </div> 
-          <div class="sect4"> 
-           <h5 id="_using_mvn_jetty_plugin">Using mvn Jetty plugin</h5> 
-           <div class="paragraph"> 
-            <p>First, you could run the WAR in a Maven-hosted Jetty instance, though you need to <code>cd</code> into the <code>webapp</code> module: (using maven 3.5.0 / isis 1.15 there is no webapp module and there is no need to <code>cd`into a `webapp</code> module. just run mvn jetty:run to fire up the app )</p> 
-           </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="bash">mvn jetty:run</code></pre> 
-            </div> 
-           </div> 
-           <div class="paragraph"> 
-            <p>You can also provide a system property to change the port:</p> 
-           </div> 
-           <div class="listingblock"> 
-            <div class="content"> 
-             <pre class="CodeRay highlight"><code data-lang="bash">mvn jetty:run -D jetty.port=9090</code></pre> 
-            </div> 
-           </div> 
-          </div> 
-          <div class="sect4"> 
-           <h5 id="_using_a_regular_servlet_container">Using a regular servlet container</h5> 
-           <div class="paragraph"> 
-            <p>You can also take the built WAR file and deploy it into a standalone servlet container such as [Tomcat](<a href="http://tomcat.apache.org" class="bare">http://tomcat.apache.org</a>). The default configuration does not require any configuration of the servlet container; just drop the WAR file into the <code>webapps</code> directory.</p> 
-           </div> 
-          </div> 
-          <div class="sect4"> 
-           <h5 id="_from_within_the_ide">From within the IDE</h5> 
-           <div class="paragraph"> 
-            <p>Most of the time, though, you’ll probably want to run the app from within your IDE. The mechanics of doing this will vary by IDE; see the <a href="../dg/dg.html#_dg_ide">Developers' Guide</a> for details of setting up Eclipse or IntelliJ IDEA. Basically, though, it amounts to running <code>org.apache.isis.WebServer</code>, and ensuring that the <a href="../ugfun/ugfun.html#_ugfun_getting-started_datanucleus-enhancer">DataNucleus enhancer</a> has properly processed all domain entities.</p> 
-           </div> 
-           <div class="paragraph"> 
-            <p>Here’s what the setup looks like in IntelliJ IDEA:</p> 
-           </div> 
-           <div class="imageblock"> 
-            <div class="content"> 
-             <a class="image" href="images/getting-started/helloworld.png"><img src="images/getting-started/helloworld.png" alt="helloworld" width="600px"></a> 
-            </div> 
-           </div> 
-           <div class="paragraph"> 
-            <p>with the maven goal to run the DataNucleus enhancer (discussed in more detail <a href="#_ugfun_getting-started_datanucleus-enhancer">here</a>) before launch defined as:</p> 
-           </div> 
-           <div class="imageblock"> 
-            <div class="content"> 
-             <a class="image" href="images/getting-started/helloworld-before-launch.png"><img src="images/getting-started/helloworld-before-launch.png" alt="helloworld before launch" width="600px"></a> 
-            </div> 
-           </div> 
+         <div class="paragraph"> 
+          <p>These are very simple unit tests of <code>HelloWorldObject</code>. They use JMock as the mocking library (with some minor extensions provided by Apache Isis itself).</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Finally, at the root directory we of course have the <code>pom.xml</code>. Some notable points:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p>since this module generates a WAR file, the <code>pom.xml</code> uses <code>&lt;packaging&gt;war&lt;/packaging&gt;</code></p> </li> 
+           <li> <p>maven mixins are used to remove boilerplate configuration of standard plugins (resources, compile, jar etc), for the DataNucleus enhancer, for surefire (tests), and for running the application using jetty plugin</p> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Now you know your way around the code generated by the archetype, lets see how to build the app and run it.</p> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="__ugfun_getting-started_helloworld-archetype_building-the-app">4.4. Building the App</h3> 
+         <div class="paragraph"> 
+          <p>Switch into the root directory of your newly generated app, and build your app:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="bash">cd myapp
+mvn clean install</code></pre> 
           </div> 
          </div> 
+         <div class="paragraph"> 
+          <p>where <code>myapp</code> is the <code>artifactId</code> entered above.</p> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="__ugfun_getting-started_helloworld-archetype_running-the-app">4.5. Running the App</h3> 
+         <div class="paragraph"> 
+          <p>The <code>helloworld</code> archetype generates a single WAR file, configured to run both the <a href="../ugvw/ugvw.html">Wicket viewer</a> and the <a href="../ugvro/ugvro.html">Restful Objects viewer</a>. The archetype also configures the DataNucleus/JDO Objectstore to use an in-memory HSQLDB connection.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Once you’ve built the app, you can run the WAR in a variety of ways.</p> 
+         </div> 
          <div class="sect3"> 
-          <h4 id="__ugfun_getting-started_helloworld-archetype_using-the-app">4.2.5. Using the App</h4> 
+          <h4 id="_using_mvn_jetty_plugin">4.5.1. Using mvn Jetty plugin</h4> 
           <div class="paragraph"> 
-           <p>When you start the app, you’ll be presented with a welcome page from which you can access the webapp using either the <a href="../ugvw/ugvw.html">Wicket viewer</a> or the <a href="../ugvro/ugvro.html">Restful Objects viewer</a>:</p> 
+           <p>First, you could run the WAR in a Maven-hosted Jetty instance, though you need to <code>cd</code> into the <code>webapp</code> module: (using maven 3.5.0 / isis 1.15 there is no webapp module and there is no need to <code>cd`into a `webapp</code> module. just run mvn jetty:run to fire up the app )</p> 
           </div> 
-          <div class="imageblock"> 
+          <div class="listingblock"> 
            <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/010-root-page.png"><img src="images/getting-started/using-hello-world/010-root-page.png" alt="010 root page" width="600px"></a> 
+            <pre class="CodeRay highlight"><code data-lang="bash">mvn jetty:run</code></pre> 
            </div> 
           </div> 
           <div class="paragraph"> 
-           <p>The Wicket viewer provides a human usable web UI (implemented, as you might have guessed from its name, using <a href="http://wicket.apache.org">Apache Wicket</a>), so choose that and navigate to the login page:</p> 
+           <p>You can also provide a system property to change the port:</p> 
           </div> 
-          <div class="imageblock"> 
+          <div class="listingblock"> 
            <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/020-login-to-wicket-viewer.png"><img src="images/getting-started/using-hello-world/020-login-to-wicket-viewer.png" alt="020 login to wicket viewer" width="600px"></a> 
+            <pre class="CodeRay highlight"><code data-lang="bash">mvn jetty:run -D jetty.port=9090</code></pre> 
            </div> 
           </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_using_a_regular_servlet_container">4.5.2. Using a regular servlet container</h4> 
           <div class="paragraph"> 
-           <p>The app itself is configured to run using <a href="../ugsec/ugsec.html">shiro security</a>, as configured in the <code>WEB-INF/shiro.ini</code> config file. You can login with:</p> 
+           <p>You can also take the built WAR file and deploy it into a standalone servlet container such as [Tomcat](<a href="http://tomcat.apache.org" class="bare">http://tomcat.apache.org</a>). The default configuration does not require any configuration of the servlet container; just drop the WAR file into the <code>webapps</code> directory.</p> 
           </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p>username: <em>sven</em></p> </li> 
-            <li> <p>password: <em>pass</em></p> </li> 
-           </ul> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_from_within_the_ide">4.5.3. From within the IDE</h4> 
+          <div class="paragraph"> 
+           <p>Most of the time, though, you’ll probably want to run the app from within your IDE. The mechanics of doing this will vary by IDE; see the <a href="../dg/dg.html#_dg_ide">Developers' Guide</a> for details of setting up Eclipse or IntelliJ IDEA. Basically, though, it amounts to running <code>org.apache.isis.WebServer</code>, and ensuring that the <a href="../dg/dg.html#_dg_hints-and-tips_datanucleus-enhancer">DataNucleus enhancer</a> has properly processed all domain entities.</p> 
           </div> 
           <div class="paragraph"> 
-           <p>Once you’ve logged in you’ll see the default home page:</p> 
+           <p>Here’s what the setup looks like in IntelliJ IDEA:</p> 
           </div> 
           <div class="imageblock"> 
            <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/030-home-page.png"><img src="images/getting-started/using-hello-world/030-home-page.png" alt="030 home page" width="600px"></a> 
+            <a class="image" href="images/getting-started/helloworld.png"><img src="images/getting-started/helloworld.png" alt="helloworld" width="600px"></a> 
            </div> 
           </div> 
           <div class="paragraph"> 
-           <p>The application is configured to run with an in-memory database, so initially there is no data. Create an object using the menu:</p> 
+           <p>with the maven goal to run the DataNucleus enhancer (discussed in more detail <a href="../dg/dg.html#_dg_hints-and-tips_datanucleus-enhancer">here</a>) before launch defined as:</p> 
           </div> 
           <div class="imageblock"> 
            <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/040-create-object-from-menu.png"><img src="images/getting-started/using-hello-world/040-create-object-from-menu.png" alt="040 create object from menu" width="600px"></a> 
+            <a class="image" href="images/getting-started/helloworld-before-launch.png"><img src="images/getting-started/helloworld-before-launch.png" alt="helloworld before launch" width="600px"></a> 
            </div> 
           </div> 
-          <div class="paragraph"> 
-           <p>which brings up a modal dialog:</p> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="__ugfun_getting-started_helloworld-archetype_using-the-app">4.6. Using the App</h3> 
+         <div class="paragraph"> 
+          <p>When you start the app, you’ll be presented with a welcome page from which you can access the webapp using either the <a href="../ugvw/ugvw.html">Wicket viewer</a> or the <a href="../ugvro/ugvro.html">Restful Objects viewer</a>:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/010-root-page.png"><img src="images/getting-started/using-hello-world/010-root-page.png" alt="010 root page" width="600px"></a> 
           </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/050-create-object-from-menu-prompt.png"><img src="images/getting-started/using-hello-world/050-create-object-from-menu-prompt.png" alt="050 create object from menu prompt" width="600px"></a> 
-           </div> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The Wicket viewer provides a human usable web UI (implemented, as you might have guessed from its name, using <a href="http://wicket.apache.org">Apache Wicket</a>), so choose that and navigate to the login page:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/020-login-to-wicket-viewer.png"><img src="images/getting-started/using-hello-world/020-login-to-wicket-viewer.png" alt="020 login to wicket viewer" width="600px"></a> 
           </div> 
-          <div class="paragraph"> 
-           <p>hitting OK returns the created object:</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The app itself is configured to run using <a href="../ugsec/ugsec.html">shiro security</a>, as configured in the <code>WEB-INF/shiro.ini</code> config file. You can login with:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p>username: <em>sven</em></p> </li> 
+           <li> <p>password: <em>pass</em></p> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Once you’ve logged in you’ll see the default home page:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/030-home-page.png"><img src="images/getting-started/using-hello-world/030-home-page.png" alt="030 home page" width="600px"></a> 
           </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/060-created-object.png"><img src="images/getting-started/using-hello-world/060-created-object.png" alt="060 created object" width="600px"></a> 
-           </div> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The application is configured to run with an in-memory database, so initially there is no data. Create an object using the menu:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/040-create-object-from-menu.png"><img src="images/getting-started/using-hello-world/040-create-object-from-menu.png" alt="040 create object from menu" width="600px"></a> 
           </div> 
-          <div class="paragraph"> 
-           <p>The above functionality is implemented by <a href="https://github.com/apache/isis/blob/master/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObjects.java#L43">this code</a>:</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>which brings up a modal dialog:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/050-create-object-from-menu-prompt.png"><img src="images/getting-started/using-hello-world/050-create-object-from-menu-prompt.png" alt="050 create object from menu prompt" width="600px"></a> 
           </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Action</span>(semantics = SemanticsOf.NON_IDEMPOTENT)
+         </div> 
+         <div class="paragraph"> 
+          <p>hitting OK returns the created object:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/060-created-object.png"><img src="images/getting-started/using-hello-world/060-created-object.png" alt="060 created object" width="600px"></a> 
+          </div> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The above functionality is implemented by <a href="https://github.com/apache/isis/blob/master/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObjects.java#L43">this code</a>:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Action</span>(semantics = SemanticsOf.NON_IDEMPOTENT)
 <span class="annotation">@MemberOrder</span>(sequence = <span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span>)
 <span class="directive">public</span> HelloWorldObject create(
         <span class="annotation">@Parameter</span>(maxLength = <span class="integer">40</span>)
@@ -2649,28 +2600,28 @@ WEB-INF/
     repositoryService.persist(object);
     <span class="keyword">return</span> object;
 }</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The <code>HelloWorldObject</code> contains a couple of properties, and a single action to update that property.</p> 
           </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p>The <code>name</code> property is read-only, and can only be modified using the <code>updateName</code> action.<br></p> 
-             <div class="paragraph"> 
-              <p>For example:</p> 
-             </div> 
-             <div class="imageblock"> 
-              <div class="content"> 
-               <a class="image" href="images/getting-started/using-hello-world/070-update-name.png"><img src="images/getting-started/using-hello-world/070-update-name.png" alt="070 update name" width="600px"></a> 
-              </div> 
-             </div> 
-             <div class="paragraph"> 
-              <p>The above functionality is implemented by <a href="https://github.com/apache/isis/blob/master/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObject.java#L73">this code</a>:<br></p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The <code>HelloWorldObject</code> contains a couple of properties, and a single action to update that property.</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p>The <code>name</code> property is read-only, and can only be modified using the <code>updateName</code> action.<br></p> 
+            <div class="paragraph"> 
+             <p>For example:</p> 
+            </div> 
+            <div class="imageblock"> 
+             <div class="content"> 
+              <a class="image" href="images/getting-started/using-hello-world/070-update-name.png"><img src="images/getting-started/using-hello-world/070-update-name.png" alt="070 update name" width="600px"></a> 
              </div> 
-             <div class="listingblock"> 
-              <div class="content"> 
-               <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Action</span>(
+            </div> 
+            <div class="paragraph"> 
+             <p>The above functionality is implemented by <a href="https://github.com/apache/isis/blob/master/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObject.java#L73">this code</a>:<br></p> 
+            </div> 
+            <div class="listingblock"> 
+             <div class="content"> 
+              <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Action</span>(
     semantics = SemanticsOf.IDEMPOTENT,
     command = CommandReification.ENABLED,
     publishing = Publishing.ENABLED
@@ -2682,553 +2633,853 @@ WEB-INF/
     setName(name);
     <span class="keyword">return</span> <span class="local-variable">this</span>;
 }</code></pre> 
-              </div> 
-             </div> </li> 
-            <li> <p>The <code>notes</code> property is editable, and can be edited in-place.<br></p> 
-             <div class="paragraph"> 
-              <p>For example:</p> 
              </div> 
-             <div class="imageblock"> 
-              <div class="content"> 
-               <a class="image" href="images/getting-started/using-hello-world/080-edit-notes.png"><img src="images/getting-started/using-hello-world/080-edit-notes.png" alt="080 edit notes" width="600px"></a> 
-              </div> 
-             </div> </li> 
-           </ul> 
-          </div> 
-          <div class="paragraph"> 
-           <p>It’s also possible to delete an object:</p> 
-          </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/090-delete-object.png"><img src="images/getting-started/using-hello-world/090-delete-object.png" alt="090 delete object" width="600px"></a> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The viewer displays a message confirming that the object has been deleted:</p> 
-          </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/100-object-deleted.png"><img src="images/getting-started/using-hello-world/100-object-deleted.png" alt="100 object deleted" width="600px"></a> 
-           </div> 
+            </div> </li> 
+           <li> <p>The <code>notes</code> property is editable, and can be edited in-place.<br></p> 
+            <div class="paragraph"> 
+             <p>For example:</p> 
+            </div> 
+            <div class="imageblock"> 
+             <div class="content"> 
+              <a class="image" href="images/getting-started/using-hello-world/080-edit-notes.png"><img src="images/getting-started/using-hello-world/080-edit-notes.png" alt="080 edit notes" width="600px"></a> 
+             </div> 
+            </div> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>It’s also possible to delete an object:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/090-delete-object.png"><img src="images/getting-started/using-hello-world/090-delete-object.png" alt="090 delete object" width="600px"></a> 
           </div> 
-          <div class="paragraph"> 
-           <p>The above functionality is implemented by <a href="https://github.com/apache/isis/blob/master/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObject.java#L87">this code</a>:</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The viewer displays a message confirming that the object has been deleted:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/100-object-deleted.png"><img src="images/getting-started/using-hello-world/100-object-deleted.png" alt="100 object deleted" width="600px"></a> 
           </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Action</span>(semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE)
+         </div> 
+         <div class="paragraph"> 
+          <p>The above functionality is implemented by <a href="https://github.com/apache/isis/blob/master/example/application/helloworld/src/main/java/domainapp/dom/impl/HelloWorldObject.java#L87">this code</a>:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Action</span>(semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE)
 <span class="directive">public</span> <span class="type">void</span> delete() {
     <span class="directive">final</span> <span class="predefined-type">String</span> title = titleService.titleOf(<span class="local-variable">this</span>);
     messageService.informUser(<span class="predefined-type">String</span>.format(<span class="string"><span class="delimiter">"</span><span class="content">'%s' deleted</span><span class="delimiter">"</span></span>, title));
     repositoryService.removeAndFlush(<span class="local-variable">this</span>);
 }</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>This uses three services provided by the framework; these are injected into the domain object automatically.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Going back to the home page (<a href="http://localhost:8080">localhost:8080</a>) we can use <a href="https://swagger.io/">Swagger UI</a> as a front-end to the REST API provided by the Restful Objects viewer.</p> 
-          </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/200-swagger-ui-before-reload.png"><img src="images/getting-started/using-hello-world/200-swagger-ui-before-reload.png" alt="200 swagger ui before reload" width="600px"></a> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The Swagger UI is created dynamically from a Swagger schema definition (the schema definition file itself can be downloaded from the Wicket viewer’s "Prototyping" menu). This Swagger schema definition groups resources according to Apache Isis metadata:</p> 
-          </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/210-helloworld-resources.png"><img src="images/getting-started/using-hello-world/210-helloworld-resources.png" alt="210 helloworld resources" width="600px"></a> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>For example, an object can be created using the resource that represents the <code>HelloWorldObjects#create</code> action:</p> 
-          </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/220-create-object-thru-rest-api.png"><img src="images/getting-started/using-hello-world/220-create-object-thru-rest-api.png" alt="220 create object thru rest api" width="600px"></a> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The response indicates that the object was successfully created:</p> 
-          </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/230-create-object-thru-rest-api-response.png"><img src="images/getting-started/using-hello-world/230-create-object-thru-rest-api-response.png" alt="230 create object thru rest api response" width="600px"></a> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The Swagger UI also provides a resource to retrieve any object:</p> 
-          </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/240-retrieve-object-using-rest-api.png"><img src="images/getting-started/using-hello-world/240-retrieve-object-using-rest-api.png" alt="240 retrieve object using rest api" width="600px"></a> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>This results in a representation of the domain object (as per the requested <code>Response Content Type</code>, ie <code>ACCEPT</code> header):</p> 
-          </div> 
-          <div class="imageblock"> 
-           <div class="content"> 
-            <a class="image" href="images/getting-started/using-hello-world/250-retrieve-object-using-rest-api-response.png"><img src="images/getting-started/using-hello-world/250-retrieve-object-using-rest-api-response.png" alt="250 retrieve object using rest api response" width="600px"></a> 
-           </div> 
           </div> 
-          <div class="paragraph"> 
-           <p>The Swagger UI is provided as a convenience; the REST API is actually a complete hypermedia API (in other words you can follow the links to access all the behaviour exposed in the regular Wicket app). The REST API implemented by Apache Isis is specified in the <a href="http://www.restfulobjects.org">Restful Object spec</a>.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>This uses three services provided by the framework; these are injected into the domain object automatically.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Going back to the home page (<a href="http://localhost:8080">localhost:8080</a>) we can use <a href="https://swagger.io/">Swagger UI</a> as a front-end to the REST API provided by the Restful Objects viewer.</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/200-swagger-ui-before-reload.png"><img src="images/getting-started/using-hello-world/200-swagger-ui-before-reload.png" alt="200 swagger ui before reload" width="600px"></a> 
           </div> 
          </div> 
-         <div class="sect3"> 
-          <h4 id="__ugfun_getting-started_helloworld-archetype_experimenting">4.2.6. Experimenting with the App</h4> 
-          <div class="paragraph"> 
-           <p>Once you are familiar with the generated app, try modifying it. There is plenty more guidance on this site; start with this guide (fundamentals) and then look at the other guides available the main <a href="../../documentation.html">documentation</a> page.</p> 
+         <div class="paragraph"> 
+          <p>The Swagger UI is created dynamically from a Swagger schema definition (the schema definition file itself can be downloaded from the Wicket viewer’s "Prototyping" menu). This Swagger schema definition groups resources according to Apache Isis metadata:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/210-helloworld-resources.png"><img src="images/getting-started/using-hello-world/210-helloworld-resources.png" alt="210 helloworld resources" width="600px"></a> 
           </div> 
-          <div class="paragraph"> 
-           <p>If you use IntelliJ IDEA or Eclipse, do also install the <a href="../dg/dg.html#<em>dg_ide_intellij_live-templates">live templates (for IntelliJ)</a> / <a href="../dg/dg.html#</em>dg_ide_eclipse_editor-templates">editor templates (for Eclipse)</a>; these will help you follow the Apache Isis naming conventions.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>For example, an object can be created using the resource that represents the <code>HelloWorldObjects#create</code> action:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/220-create-object-thru-rest-api.png"><img src="images/getting-started/using-hello-world/220-create-object-thru-rest-api.png" alt="220 create object thru rest api" width="600px"></a> 
           </div> 
-          <div class="paragraph"> 
-           <p>If you run into issues, please don’t hesitate to ask for help on the <a href="http://isis.apache.org/help.html">users mailing list</a>.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The response indicates that the object was successfully created:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/230-create-object-thru-rest-api-response.png"><img src="images/getting-started/using-hello-world/230-create-object-thru-rest-api-response.png" alt="230 create object thru rest api response" width="600px"></a> 
           </div> 
          </div> 
-         <div class="sect3"> 
-          <h4 id="__ugfun_getting-started_helloworld-archetype_moving-on">4.2.7. Moving on</h4> 
-          <div class="paragraph"> 
-           <p>When you are ready to start working on your own app, we <em>don’t</em> recommend building on top of the helloworld app.</p> 
+         <div class="paragraph"> 
+          <p>The Swagger UI also provides a resource to retrieve any object:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/240-retrieve-object-using-rest-api.png"><img src="images/getting-started/using-hello-world/240-retrieve-object-using-rest-api.png" alt="240 retrieve object using rest api" width="600px"></a> 
           </div> 
-          <div class="paragraph"> 
-           <p>Instead, we suggest that you start with the <a href="#_ugfun_getting-started_simpleapp-archetype">simpleapp archetype</a> instead. Although a little more complex, it provides more structure and tests, all of which will help you as your application grows.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>This results in a representation of the domain object (as per the requested <code>Response Content Type</code>, ie <code>ACCEPT</code> header):</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" href="images/getting-started/using-hello-world/250-retrieve-object-using-rest-api-response.png"><img src="images/getting-started/using-hello-world/250-retrieve-object-using-rest-api-response.png" alt="250 retrieve object using rest api response" width="600px"></a> 
           </div> 
          </div> 
+         <div class="paragraph"> 
+          <p>The Swagger UI is provided as a convenience; the REST API is actually a complete hypermedia API (in other words you can follow the links to access all the behaviour exposed in the regular Wicket app). The REST API implemented by Apache Isis is specified in the <a href="http://www.restfulobjects.org">Restful Object spec</a>.</p> 
+         </div> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugfun_getting-started_simpleapp-archetype">4.3. SimpleApp Archetype</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/ugfun/_ugfun_getting-started_simpleapp-archetype.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/ugfun/_ugfun_getting-started_simpleapp-archetype.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/ugfun/_ugfun_getting-started_simpleapp-archetype.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/ugfun/_ugfun_getting-started_simpleapp-archetype.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/ugfun/_ugfun_getting-started_simpleapp-archetype.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
-          </ul>
+         <h3 id="__ugfun_getting-started_helloworld-archetype_experimenting">4.7. Experimenting with the App</h3> 
+         <div class="paragraph"> 
+          <p>Once you are familiar with the generated app, try modifying

<TRUNCATED>