Author: buildbot
Date: Wed Nov 19 04:12:28 2014
New Revision: 929725

Log:
Staging update by buildbot for isis

Added:
    websites/staging/isis/trunk/content/intro/tutorials/apacheconeu-2014.html
Removed:
    websites/staging/isis/trunk/content/tutorials/about.html
    websites/staging/isis/trunk/content/tutorials/apacheconeu-2014.html
Modified:
    websites/staging/isis/trunk/cgi-bin/   (props changed)
    websites/staging/isis/trunk/content/   (props changed)
    websites/staging/isis/trunk/content/documentation.html
    websites/staging/isis/trunk/content/intro/tutorials/tutorials.html

Propchange: websites/staging/isis/trunk/cgi-bin/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Wed Nov 19 04:12:28 2014
@@ -1 +1 @@
-1640453
+1640484

Propchange: websites/staging/isis/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Wed Nov 19 04:12:28 2014
@@ -1 +1 @@
-1640453
+1640484

Modified: websites/staging/isis/trunk/content/documentation.html
==============================================================================
--- websites/staging/isis/trunk/content/documentation.html (original)
+++ websites/staging/isis/trunk/content/documentation.html Wed Nov 19 04:12:28 
2014
@@ -457,7 +457,8 @@
 
 <ul>
 <li><strong><a 
href="intro/tutorials/screencasts.html">Screencasts</a></strong> <a 
href="intro/tutorials/screencasts.html"><img 
src="./images/tv_show-25.png"></a></li>
-<li><a href="intro/tutorials/tutorials.html">Tutorials</a>
+<li><a href="intro/tutorials/tutorials.html">Tutorials</a></li>
+<li><strong><a href="intro/tutorials/apacheconeu-2014.html">ApacheCon EU 
2014</a></strong>
 </div>
 <div class="col-md-4"></li>
 </ul>

Added: websites/staging/isis/trunk/content/intro/tutorials/apacheconeu-2014.html
==============================================================================
--- websites/staging/isis/trunk/content/intro/tutorials/apacheconeu-2014.html 
(added)
+++ websites/staging/isis/trunk/content/intro/tutorials/apacheconeu-2014.html 
Wed Nov 19 04:12:28 2014
@@ -0,0 +1,1012 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+
+    <meta charset="utf-8">
+      <title>Stop scaffolding, start coding
</title>
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+    <!--[if lt IE 9]>
+      <script 
src="http://html5shim.googlecode.com/svn/trunk/html5.js";></script>
+    <![endif]-->
+
+    
+    <!-- Le styles -->
+    <link href="./../../bootstrap-3.0.0/css/bootstrap.css" rel="stylesheet">
+    <link href="./../../prettify.css" rel="stylesheet">
+
+    <style type="text/css">
+        body {
+          padding-top: 60px;
+        }
+        .sprite {
+            display: inline-block;
+            height: 20px;
+            margin: 0 auto 4px;
+            outline: medium none;
+            text-indent: -999em;
+            width: 24px;
+            background-image: url('./../../images/sprites.png');
+            background-repeat: no-repeat;
+            overflow: hidden;
+            cursor: pointer;
+        }
+        .edit-page {
+            display: inline-block;
+            height: 20px;
+            margin: 0 auto 4px;
+            outline: medium none;
+            text-indent: -999em;
+            width: 24px;
+            background-image: url('./../../images/edit.png');
+            background-repeat: no-repeat;
+            overflow: hidden;
+            cursor: pointer;
+        }
+        .fb-share {
+            background-position: 0px -40px;
+        }
+        .gp-share {
+            background-position: 0px 0px;
+        }
+        .tw-share {
+            background-position: 0px -80px;
+        }
+        .markdown-content {
+            min-height: 500px;
+        }
+        .book-image img {
+          border: 1px;
+          border-style: solid;
+        }
+        .release-matrix .heading {
+            background-color: #eeeeee;
+        }
+        .release-matrix .new {
+            color: #dd0000;
+            font-weight: bolder;
+        }
+        .stub,.note {
+            position: relative;
+            padding: 7px 15px;
+            margin-bottom: 18px;
+            color: #404040;
+            background-color: #eedc94;
+            background-repeat: repeat-x;
+            background-image: -khtml-gradient(linear, left top, left bottom, 
from(#fceec1), to(#eedc94));
+            background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
+            background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
+            background-image: -webkit-gradient(linear, left top, left bottom, 
color-stop(0%, #fceec1), color-stop(100%, #eedc94));
+            background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
+            background-image: -o-linear-gradient(top, #fceec1, #eedc94);
+            background-image: linear-gradient(top, #fceec1, #eedc94);
+            filter: 
progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', 
endColorstr='#eedc94', GradientType=0);
+            text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+            border-color: #eedc94 #eedc94 #e4c652;
+            border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 
0.25);
+            text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+            border-width: 1px;
+            border-style: solid;
+            -webkit-border-radius: 4px;
+            -moz-border-radius: 4px;
+            border-radius: 4px;
+            -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
+            -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
+        }
+        
+        div.XXXisis-tweak form {
+            margin-top: 6px;
+            margin-bottom: -2px;
+        }
+        
+        div.row div.col-md-12 {
+          border-top: 1px solid #eeeeee;
+       }
+        
+        
+        /* Isis specific stuff */
+
+        div.row div.col-md-12 {
+          margin-top: 20px;
+        }
+
+        .container {
+          width: 940px;
+        }
+
+        .markdown-content .documentation .span-one-third p {
+          margin-bottom: 0px;
+        }
+
+        .container .markdown-content .group,
+        .markdown-content .documentation .group {
+          margin-top: 9px;
+        }
+
+        .container .group h2,
+        .documentation .group h2 {
+          border-bottom: 1px solid #DDD
+        }
+
+        .container h2 a[name],
+        .documentation h2 a[name] {
+            padding-top: 50px;
+            margin-top: -50px;
+        }
+        
+        .container h2 a[name],
+        .container h3 a[name],
+        .container h4 a[name],
+        .documentation h2 a[name],
+        .documentation h3 a[name],
+        .documentation h4 a[name] {
+            color: black;
+            display: inline-block; 
+        }
+        .container h2 a[name]:hover,
+        .container h3 a[name]:hover,
+        .container h4 a[name]:hover,
+        .documentation h2 a[name]:hover,
+        .documentation h3 a[name]:hover,
+        .documentation h4 a[name]:hover {
+            text-decoration: none;
+        }
+
+        .documentation h2 a:not([name]),
+        .documentation h3 a:not([name]),
+        .documentation h4 a:not([name]) {
+          /* same as code style */
+          padding: 0 3px 2px;
+          font-family: Monaco, Andale Mono, Courier New, monospace;
+          font-size: 12px;
+          -webkit-border-radius: 3px;
+          -moz-border-radius: 3px;
+          border-radius: 3px;
+          padding: 1px 3px;
+        }
+        
+        .carousel-indicators li {
+          border: 1px solid rgb(192,70,1);
+        }
+
+        .carousel-indicators li.active {
+          background-color: rgb(192,70,1);
+        }
+        
+        .carousel-control .icon-prev,
+        .carousel-control .icon-next {
+          color: rgb(192,70,1);
+          font-size: 60px;
+        }
+        
+        .page-header {
+          margin-top: 0px;
+        }
+
+        .container blockquote p {
+            font-size: small;
+        }
+
+        .container blockquote p:not([author]) {
+            font-style: italic;
+        }
+
+        .container blockquote p {
+            font-size: small;
+            font-style: italic;
+            font-weight: bold;
+        }
+        
+        footer hr {
+            margin-top: 100px;
+        }
+
+        .markdown-content img {
+            margin-top: 10px;
+            margin-bottom: 20px;
+        }
+
+        .markdown-content a img {
+            margin-top: 0px;
+            margin-bottom: 0px;
+        }
+
+        
+        #forkongithub a{
+            display: none;
+            background:#090;
+            color:#fff;
+            text-decoration:none;
+            font-family:arial, sans-serif;
+            text-align:center;
+            font-weight:bold;
+            padding:5px 40px;
+            font-size:1rem;
+            line-height:2rem;
+            position:relative;
+            transition:0.5s;
+        }
+        #forkongithub a:hover{
+            background:#0D0;
+            color:#fff;
+        }
+        #forkongithub a::before,
+        #forkongithub a::after{
+            content:"";width:100%;
+            display:block;
+            position:fixed;
+            top:1px;
+            left:0;
+            height:1px;
+            background:#fff;
+            z-index: 9999;
+        }
+        #forkongithub a::after{
+            bottom:1px;
+            top:auto;
+        }
+        @media screen and (min-width:768px){
+            #forkongithub{
+                position:fixed;
+                display:block;
+                top:0;
+                right:0;
+                width:250px;
+                overflow:hidden;
+                height:250px;
+                z-index: 9999;
+            }
+            #forkongithub a{
+                display:inherit;
+                width:250px;
+                position:fixed;
+                font-size:small;
+                top:40px;
+                right:-60px;
+                transform:rotate(45deg);
+                -webkit-transform:rotate(45deg);
+                -ms-transform:rotate(45deg);
+                box-shadow:4px 4px 10px rgba(0,0,0,0.8);
+            }
+        }        
+    </style>
+
+    <!-- courtesy of http://codepo8.github.io/css-fork-on-github-ribbon/ -->
+    <span id="forkongithub">
+        <a href="https://github.com/apache/isis";>Fork me on GitHub</a>
+    </span>
+
+    <script type="text/javascript">
+      function fbshare () {
+          window.open(
+                  "http://www.facebook.com/sharer/sharer.php?u="+document.URL,
+                  'Share on Facebook',
+                  'width=640,height=426');
+      };
+      function gpshare () {
+          window.open(
+                  "https://plus.google.com/share?url="+document.URL,
+                  'Share on Google+',
+                  'width=584,height=385');
+      };
+      function twshare () {
+          window.open(
+                  
"https://twitter.com/intent/tweet?url="+document.URL+"&text=Stop scaffolding, 
start coding
",
+                  'Share on Twitter',
+                  'width=800,height=526');
+      };
+    </script>
+
+    <!-- Le fav and touch icons -->
+    <link rel="shortcut icon" href="./../../images/favicon.ico">
+
+    <script src="./../../javascript/prettify.js" 
type="text/javascript"></script>
+    
+    <script src="//code.jquery.com/jquery.js"></script>
+    <script src="./../../javascript/prettyprint.js"></script>
+    <script src="./../../bootstrap-3.0.0/js/bootstrap.js"></script>
+
+
+    <script src="http://platform.twitter.com/widgets.js"; 
type="text/javascript"></script>
+    <!--
+    <DISABLEDscript src="./../../javascript/common.js"></DISABLEDscript>
+    -->
+
+    
+    
+    
+
+    <script>
+    $(function () { prettyPrint() })
+    $().dropdown()
+    </script>
+
+    
+  </head>
+
+  <body>
+
+    <nav class="navbar navbar-fixed-top navbar-inverse" role="navigation">
+      <div class="container">
+        <a class="navbar-brand" href="./../../index.html">Apache 
Isis&trade;</a>
+        <ul class="nav navbar-nav">
+
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Demos<b 
class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a 
href="./../../intro/elevator-pitch/isis-in-pictures.html">Screenshots</a></li>
+              <li><a 
href="./../../intro/tutorials/screencasts.html">Screencasts<img 
src="./../../images/tv_show-25.png"></a></li>
+              <li><a href="./../../intro/powered-by/powered-by.html">Powered 
by</a></li>
+              <li><a href="http://isisdemo.mmyco.co.uk/"; 
target="_blank">Online Demo</a></li>
+            </ul>
+          </li>
+
+          <li><a href="./../../documentation.html">Docs</a></li>
+          <li><a href="http://www.isisaddons.org"; 
target="_blank">Add-ons</a></li>
+
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" 
data-toggle="dropdown">Downloads<b class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a 
href="./../../intro/getting-started/simpleapp-archetype.html">Isis (Maven 
archetype)</a></li>
+              <li><a href="./../../download.html">Isis (downloads)</a></li>
+              <li><a href="http://www.isisaddons.org"; target="_blank">Isis 
Add-ons</a></li>
+            </ul>
+          </li>
+
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Help<b 
class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li><a href="./../../support.html">Mailing Lists</a></li>
+              <li><a href="http://isis.markmail.org/search/?q="; 
target="_blank">ML Archives</a></li>
+              <li><a href="https://issues.apache.org/jira/browse/ISIS"; 
target="_blank">JIRA</a></li>
+              <li><a href="http://stackoverflow.com/questions/tagged/isis"; 
target="_blank">Stack Overflow</a></li>
+              <li><a href="http://github.com/apache/isis"; 
target="_blank">Github mirror</a></li>
+            </ul>
+          </li>
+
+          <li class="dropdown navbar-right">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">@ASF<b 
class="caret"></b></a>
+            <ul class="dropdown-menu">
+              <li>
+                <a href="http://www.apache.org/"; target="_blank">Apache 
Homepage <i class="icon-share-alt"></i></a>
+              </li>
+              <li>
+                <a href="http://www.apache.org/licenses/"; 
target="_blank">Licenses <i class="icon-share-alt"></i></a>
+              </li>
+              <li>
+                <a href="http://www.apache.org/security/"; 
target="_blank">Security <i class="icon-share-alt"></i></a>
+              </li>
+              <li>
+                <a href="http://www.apache.org/foundation/sponsorship.html"; 
target="_blank">Sponsorship <i class="icon-share-alt"></i></a>
+              </li>
+              <li>
+                <a href="http://www.apache.org/foundation/thanks.html";>Thanks 
<i class="icon-share-alt"></i></a>
+              </li>
+              <li>
+                <a href="./../../more-thanks.html">More thanks <i 
class="icon-share-alt"></i></a>
+              </li>
+            </ul>
+          </li>
+      </ul>
+
+        <FORM class="navbar-form navbar-right" 
id="searchbox_012614087480249044419:dn-q5gtwxya" 
action="http://www.google.com/cse";>
+        <div class="form-group">
+          <input type="hidden" name="cx" 
value="012614087480249044419:dn-q5gtwxya">
+          <INPUT type="hidden" name="cof" value="FORID:0">
+          <INPUT class="form-control" name="q" type="text" 
placeholder="Search">
+        </div>
+      </FORM>
+
+
+      </div>
+
+
+  </nav>
+
+    <div class="container">
+      <div class="markdown-content">
+      
+
+<div class="page-header">
+<p><a href="./../../documentation.html">Docs</a>&nbsp;&raquo&nbsp;<a 
href="./../../intro/about.html">Intro</a>&nbsp;&raquo&nbsp;<a 
href="./../../intro/tutorials/about.html">Tutorials</a></p>
+<h1>Stop scaffolding, start coding
+
+</h1>
+</div>
+
+<p><div class="note">
+A half-day tutorial (at least!) on developing domain-driven apps using Apache 
Isis.
+</div></p>
+
+<h2>Run the archetype</h2>
+
+<pre><code>mvn archetype:generate  \
+    -D archetypeGroupId=org.apache.isis.archetype \
+    -D archetypeArtifactId=simpleapp-archetype \
+    -D archetypeVersion=1.8.0-SNAPSHOT \
+    -D groupId=com.mycompany \
+    -D artifactId=myapp \
+    -D version=1.0-SNAPSHOT \
+    -D 
archetypeRepository=http://repository-estatio.forge.cloudbees.com/snapshot/ \
+    -B
+</code></pre>
+
+<h2>Build and run</h2>
+
+<pre><code>cd myapp
+mvn clean install
+</code></pre>
+
+<p>then</p>
+
+<pre><code>mvn antrun:run -P self-host
+</code></pre>
+
+<p>or alternatively</p>
+
+<pre><code>mvn jetty:run    
+</code></pre>
+
+<h2>Using the app</h2>
+
+<ul>
+<li>install fixtures</li>
+<li>list all</li>
+<li>create new</li>
+<li>list all    </li>
+</ul>
+
+<h2>Dev environment</h2>
+
+<p>Set up an IDE and import the project to be able to run and debug the app</p>
+
+<h4>Configure</h4>
+
+<ul>
+<li>IDE:
+<ul>
+<li>configure <a 
href="http://isis.apache.org/intro/getting-started/ide/intellij.html";>IntelliJ</a>,
 import app</li>
+<li>configure <a 
href="http://isis.apache.org/intro/getting-started/ide/eclipse.html";>Eclipse</a>,
 import app</li>
+</ul></li>
+<li>Set up IDE <a 
href="http://isis.apache.org/intro/resources/editor-templates.html";>editor 
templates</a></li>
+</ul>
+
+<h4>Run</h4>
+
+<ul>
+<li>Run the app from within the IDE</li>
+<li>Run with different deploymentTypes, note whether <code>@Prototype</code> 
actions are available or not:
+<ul>
+<li><code>--type SERVER_PROTOTYPE</code></li>
+<li><code>--type SERVER</code></li>
+</ul></li>
+</ul>
+
+<h2>Explore codebase</h2>
+
+<ul>
+<li><code>myapp</code> : parent module</li>
+<li><code>myapp-dom</code>: domain objects module
+<ul>
+<li>entity: <code>dom.simple.SimpleObject</code></li>
+<li>repository: <code>dom.simple.SimpleObjects</code></li>
+</ul></li>
+<li><code>myapp-fixture</code>: fixtures module
+<ul>
+<li>fixture script:<code>fixture.simple.SimpleObjectsFixture</code></li>
+</ul></li>
+<li><code>myapp-integtests</code>: integration tests module</li>
+<li><code>myapp-webapp</code>: webapp module
+<ul>
+<li>(builds the WAR file)</li>
+</ul></li>
+</ul>
+
+<h2>Testing</h2>
+
+<ul>
+<li><code>myapp-dom</code> unit tests
+<ul>
+<li>run </li>
+<li>inspect, eg
+<ul>
+<li><code>SimpleObjectTest</code></li>
+</ul></li>
+</ul></li>
+<li><code>myapp-integtests</code> integration tests
+<ul>
+<li>run</li>
+<li>inspect, eg: 
+<ul>
+<li><code>integration.tests.smoke.SimpleObjectsTest</code></li>
+<li><code>integration.specs.simple.SimpleObjectSpec_listAllAndCreate.feature</code></li>
+</ul></li>
+<li>generated report, eg
+<ul>
+<li><code>myapp/integtests/target/cucumber-html-report/index.html</code></li>
+</ul></li>
+<li>change test in IDE, re-run (in Maven)   </li>
+</ul></li>
+</ul>
+
+<h2>Prototyping</h2>
+
+<p>Exclude the <code>integtests</code> module.</p>
+
+<p>In the parent <code>pom.xml</code>:</p>
+
+<pre><code>&lt;modules&gt;
+    &lt;module&gt;dom&lt;/module&gt;
+    &lt;module&gt;fixture&lt;/module&gt;
+    &lt;module&gt;integtests&lt;/module&gt;
+    &lt;module&gt;webapp&lt;/module&gt;
+&lt;/modules&gt;
+</code></pre>
+
+<p>change to:</p>
+
+<pre><code>&lt;modules&gt;
+    &lt;module&gt;dom&lt;/module&gt;
+    &lt;module&gt;fixture&lt;/module&gt;
+    &lt;!--
+    &lt;module&gt;integtests&lt;/module&gt;
+    --&gt;
+    &lt;module&gt;webapp&lt;/module&gt;
+&lt;/modules&gt;
+</code></pre>
+
+<hr/>
+
+<h1>Build a domain app</h1>
+
+<p>The remainder of the tutorial provides guidance on building a domain 
application.  We'd rather you build your own app, but if you're not feeling 
inspired, you could have a go at building our "petclinic" app.  Here's the 
design:</p>
+
+<p><img src="http://yuml.me/a070d071"; alt="" /></p>
+
+<p>which in yuml.me's DSL is:</p>
+
+<pre>
+[Visit|-checkIn:DateTime;-checkout:DateTime;-diagnosis:String|+checkin();+checkout();+addNote()]->[Pet|-name:String;-species:PetSpecies]
+[Owner|-firstName:String;-lastName:String]<0..1-0..*>[Pet]
+</pre>
+
+<h2>Domain entity</h2>
+
+<p>Most domain objects in Apache Isis applications are persistent entities.</p>
+
+<ul>
+<li>rename the <code>SimpleObject</code> class
+<ul>
+<li>eg rename to <code>Pet</code></li>
+</ul></li>
+<li>if required, rename the <code>SimpleObject</code> class' <code>name</code> 
property
+<ul>
+<li>for <code>Pet</code>, can leave <code>name</code> property as is</li>
+</ul></li>
+<li>specify a <a 
href="http://isis.apache.org/how-tos/how-to-01-040-How-to-specify-a-title-for-a-domain-entity.html";>title</a></li>
+<li>specify an <a 
href="http://isis.apache.org/how-tos/how-to-01-070-How-to-specify-the-icon-for-a-domain-entity.html";>icon</a></li>
+<li>add the <a 
href="http://isis.apache.org/reference/recognized-annotations/Bookmarkable.html";>@Bookmarkable</a>
 annotation
+<ul>
+<li>confirm is available from bookmark panel (top-left of Wicket UI)</li>
+</ul></li>
+</ul>
+
+<h2>Domain service</h2>
+
+<p>Domain services either act as factories or repositories to entities, or 
(more generally) can be used to "bridge across" to other domains/bounded 
contexts.  Most are application-scoped, but they can also be request-scoped if 
required.</p>
+
+<ul>
+<li>rename the <code>SimpleObjects</code> class
+<ul>
+<li>eg rename to <code>Pets</code></li>
+</ul></li>
+<li>review <code>create</code> action (acting as a factory)
+<ul>
+<li>as per our <a 
href="http://isis.apache.org/how-tos/how-to-01-160-How-to-create-or-delete-objects-within-your-code.html";>docs</a></li>
+<li>rename if you wish</li>
+<li>eg <code>newPet(...)</code> or <code>addPet(...)</code></li>
+</ul></li>
+<li>review <code>listAll</code> action (acting as a repository)
+<ul>
+<li>as per our <a 
href="http://isis.apache.org/how-tos/how-to-09-040-How-to-write-a-custom-repository.html";>docs</a></li>
+<li>note the annotations on the corresponding domain class (originally called 
<code>SimpleObject</code>, though renamed by now, eg to <code>Pet</code>)</li>
+<li>rename if you wish</li>
+<li>eg <code>listPets()</code></li>
+</ul></li>
+<li>note the <code>@DomainService</code> annotation</li>
+<li>optional: add an action to a return subset of objects
+<ul>
+<li>use <code>@Query</code> annotation</li>
+<li>see for example the todo app, see <a 
href="https://github.com/apache/isis/blob/b3e936c9aae28754fb46c2df52b1cb9b023f9ab8/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java#L93";>here</a>
 and <a 
href="https://github.com/apache/isis/blob/b3e936c9aae28754fb46c2df52b1cb9b023f9ab8/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java#L63";>here</a></li>
+</ul></li>
+</ul>
+
+<h2>Fixture scripts</h2>
+
+<p>Fixture scripts are used to setup the app into a known state.  They are 
great for demo's and as a time-saver when implementing a feature, and they can 
also be reused in automated integration tests.  We usually also have a fixture 
script to zap all the (non-reference) data (or some logical subset of the 
data)</p>
+
+<ul>
+<li>rename the <code>SimpleObjectsTearDownFixture</code> class
+<ul>
+<li>and update to delete from the appropriate underlying database table(s)</li>
+<li>use the injected <a 
href="http://isis.apache.org/components/objectstores/jdo/services/isisjdosupport-service.html";>IsisJdoSupport</a>
 domain service.</li>
+</ul></li>
+<li>update to create new instances of domain entity
+<ul>
+<li>inject in the corresponding domain service</li>
+</ul></li>
+</ul>
+
+<h2>Actions</h2>
+
+<p>Most business functionality is implemented using actions... basically a 
<code>public</code> method accepting domain classes and primitives as its 
parameter types.  The action can return a domain entity, or a collection of 
entities, or a primitive/String/value, or void.  If a domain entity is returned 
then that object is rendered immediately; if a collection is returned then the 
Wicket viewer renders a table.  Such collections are sometimes called 
"standalone" collections.</p>
+
+<ul>
+<li>write an action to update the domain property (originally called 
<code>SimpleObject#name</code>, though renamed by now)</li>
+<li>use the <a 
href="http://isis.apache.org/reference/recognized-annotations/Named.html";>@Named</a>
 annotation to specify the name of action parameters</li>
+<li>use <a 
href="http://isis.apache.org/reference/recognized-annotations/ActionSemantics.html";>@ActionSemantics</a>
 annotation to indicate the semantics of the action (safe/query-only, 
idempotent or non-idempotent)</li>
+<li>annotate safe action as <a 
href="http://isis.apache.org/reference/recognized-annotations/Bookmarkable.html";>@Bookmarkable</a>
 
+<ul>
+<li>confirm is available from bookmark panel (top-left of Wicket UI)</li>
+</ul></li>
+<li>optional: add an action to clone an object  </li>
+</ul>
+
+<h2>REST API</h2>
+
+<p>As well as exposing the Wicket viewer, Isis also exposes a REST API (an 
implementation of the <a href="http://restfulobjects.org";>Restful Objects 
spec</a>).  All of the functionality of the domain object model is available 
through this REST API.</p>
+
+<ul>
+<li>add Chrome extensions
+<ul>
+<li>install <a 
href="https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm?hl=en";>Postman</a></li>
+<li>install <a 
href="https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=en";>JSON-View</a></li>
+</ul></li>
+<li>browse to Wicket viewer, install fixtures</li>
+<li>browse to the http://localhost:8080/restful API</li>
+<li>invoke the service to list all objects
+<ul>
+<li>services</li>
+<li>actions</li>
+<li>invoke (invoking 0-arg actions is easy; the Restful Objects spec defines 
how to invoke N-arg actions)</li>
+</ul></li>
+</ul>
+
+<h2>Specify Action semantics</h2>
+
+<p>The semantics of an action (whether it is safe/query only, whether it is 
idempotent, whether it is neither) can be specified for each action; if not 
specified then Isis assumes non-idempotent.  In the Wicket viewer this matters 
in that only query-only actions can be bookmarked or used as contributed 
properties/collections.  In the RESTful viewer this matters in that it 
determines the HTTP verb (GET, PUT or POST) that is used to invoke the 
action.</p>
+
+<ul>
+<li>experiment changing [@ActionSemantics] on actions
+<ul>
+<li>note the HTTP methods exposed in the REST API change</li>
+<li>note whether the action is bookmarkable (assuming that it has been 
annotated with <code>@Bookmarkable</code>, that is).</li>
+</ul></li>
+</ul>
+
+<h2>Value properties</h2>
+
+<p>Domain entities have state: either values (primitives, strings) or 
references to other entities.  In this section we explore adding some value 
properties</p>
+
+<ul>
+<li>add some <a 
href="http://isis.apache.org/how-tos/how-to-01-030-How-to-add-a-property-to-a-domain-entity.html";>value
 properties</a>; also:
+<ul>
+<li>for string properties</li>
+<li>use the <a 
href="http://isis.apache.org/reference/recognized-annotations/MultiLine.html";>@Multiline</a>
 annotation to render a text area instead of a text box</li>
+<li>use the <a 
href="http://isis.apache.org/reference/recognized-annotations/MaxLength.html";>@MaxLength</a>
 annotation to specify the maximum number of characters allowable</li>
+<li>use <a 
href="http://isis.apache.org/components/objectstores/jdo/mapping-joda-dates.html";>joda
 date/time</a> properties</li>
+<li>use <a 
href="http://isis.apache.org/components/objectstores/jdo/mapping-bigdecimals.html";>bigdecimals</a>
 properties</li>
+<li>use <a 
href="http://isis.apache.org/components/objectstores/jdo/mapping-blobs.html";>blob/clobs</a>
 properties</li>
+<li>specify whether <a 
href="http://isis.apache.org/components/objectstores/jdo/mapping-mandatory-and-optional-properties.html";>optional
 or mandatory</a></li>
+<li>enums (eg as used in the example Todo app, see <a 
href="https://github.com/apache/isis/blob/b3e936c9aae28754fb46c2df52b1cb9b023f9ab8/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java#L207";>here</a>
 and <a 
href="https://github.com/apache/isis/blob/b3e936c9aae28754fb46c2df52b1cb9b023f9ab8/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java#L266";>here</a></li>
+</ul></li>
+<li>update the corresponding domain service for creating new instances
+<ul>
+<li>for all non-optional properties will either need to prompt for a value, or 
calculate some suitable default</li>
+</ul></li>
+<li>change the implementation of title, if need be
+<ul>
+<li>might prefer to use <a 
href="http://isis.apache.org/reference/recognized-annotations/Title.html";>@Title</a>
 annotation rather than the <code>title()</code> method</li>
+</ul></li>
+<li><a 
href="http://isis.apache.org/how-tos/how-to-01-080-How-to-specify-the-order-in-which-properties-or-collections-are-displayed.html";>order
 the properties</a> using the <a 
href="http://isis.apache.org/reference/recognized-annotations/MemberOrder.html";>@MemberOrder</a>
 annotation and <a 
href="http://isis.apache.org/reference/recognized-annotations/MemberGroupLayout.html";>@MemberGroupLayout</a>
 annotation
+<ul>
+<li>see also this <a 
href="http://isis.apache.org/components/viewers/wicket/static-layouts.html";>static
 layouts</a> documentation</li>
+</ul></li>
+</ul>
+
+<h2>Reference properties</h2>
+
+<p>Domain entities can also reference other domain entities.  These references 
may be either scalar (single-valued) or vector (multi-valued).  In this section 
we focus on scalar reference properties.</p>
+
+<ul>
+<li>add some <a 
href="http://isis.apache.org/how-tos/how-to-01-030-How-to-add-a-property-to-a-domain-entity.html";>reference
 properties</a></li>
+<li>update the corresponding domain service</li>
+<li>use different techniques to obtain references (shown in drop-down list box)
+<ul>
+<li>use <a 
href="http://isis.apache.org/reference/recognized-annotations/Bounded.html";>@Bounded</a>
 annotation</li>
+<li>use the <a 
href="http://isis.apache.org/reference/recognized-annotations/AutoComplete.html";>@AutoComplete</a>
 annotation</li>
+<li>use a <code>choicesXxx()</code> supporting method on <a 
href="http://isis.apache.org/how-tos/how-to-03-010-How-to-specify-a-set-of-choices-for-a-property.html";>property</a>
 or <a 
href="http://isis.apache.org/how-tos/how-to-03-020-How-to-specify-a-set-of-choices-for-an-action-parameter.html";>action
 param</a></li>
+<li>use an <code>autoCompleteXxx()</code> supporting method on <a 
href="http://isis.apache.org/how-tos/how-to-03-015-How-to-specify-an-autocomplete-for-a-property.html";>property</a>
 or <a 
href="http://isis.apache.org/how-tos/how-to-03-025-How-to-specify-an-autocomplete-for-an-action-parameter.html";>action
 param</a></li>
+</ul></li>
+</ul>
+
+<h2>Usability: Defaults</h2>
+
+<p>Quick detour: often we want to set up defaults to go with choices.  A 
sensible default can really improve the usability of the app.</p>
+
+<ul>
+<li>Add <a 
href="http://isis.apache.org/how-tos/how-to-03-050-How-to-specify-default-values-for-an-action-parameter.html";>defaults</a>
 for action parameters</li>
+</ul>
+
+<h2>Collections</h2>
+
+<p>Returning back to references, Isis also supports vector (multi-valued) 
references to another object instances... in other words collections.  We 
sometimes called these "parented" collections (to distinguish from a 
"standalone" collection as returned from an action)</p>
+
+<ul>
+<li>Ensure that all domain classes implement <code>java.lang.Comparable</code>
+<ul>
+<li>use the <a 
href="http://isis.apache.org/reference/Utility.html";>ObjectContracts</a> 
utility class to help implement <code>Comparable</code> (also 
<code>equals()</code>, <code>hashCode()</code>, <code>toString()</code>)</li>
+</ul></li>
+<li>Add a <a 
href="http://isis.apache.org/components/objectstores/jdo/managed-1-to-m-relationships.html";>one-to-many-collection</a>
 to one of the entities
+<ul>
+<li>Use <code>SortedSet</code> as the class</li>
+</ul></li>
+<li>Use the @Render 
(http://isis.apache.org/reference/recognized-annotations/Render.html) 
annotation to indicate if the collection should be visible or hidden by 
default</li>
+<li>optional: Use the <a 
href="http://isis.apache.org/reference/recognized-annotations/SortedBy.html";>@SortedBy</a>
 annotation to specify a different comparator than the natural ordering</li>
+</ul>
+
+<h2>Actions and Collections</h2>
+
+<p>The Wicket UI doesn't allow collections to be modified (added to/removed 
from).  However, we can easily write actions to accomplish the same.  Moreover, 
these actions can provide some additional business logic.  For example: it 
probably shouldn't be possible to add an object twice into a collection, so it 
should not be presented in the list of choices/autoComplete; conversely, only 
those objects in the collection should be offered as choices to be removed.</p>
+
+<ul>
+<li>Add domain actions to add/remove from the collection
+<ul>
+<li>to create objects, <a 
href="http://isis.apache.org/how-tos/how-to-01-150-How-to-inject-services-into-a-domain-entity-or-other-service.html";>inject</a>
 associated domain service</li>
+<li>generally we recommend using the <code>@Inject</code> annotation with 
either private or default visibility</li>
+<li>the service itself should use <a 
href="http://isis.apache.org/reference/DomainObjectContainer.html";>DomainObjectContainer</a></li>
+</ul></li>
+<li>Use the <a 
href="http://isis.apache.org/reference/recognized-annotations/MemberOrder.html";>@MemberOrder</a>
 annotation to associate an action with a property or with a collection
+<ul>
+<li>set the <code>name</code> attribute</li>
+</ul></li>
+</ul>
+
+<h2>Clock Service</h2>
+
+<p>To ensure testability, there should be no dependencies on system time, for 
example usage of <code>LocalDate.now()</code>.  Instead the domain objects 
should delegate to the provided <code>ClockService</code>.</p>
+
+<ul>
+<li>remove any dependencies on system time (eg defaults for date/time action 
parameters)
+<ul>
+<li>inject <a 
href="http://isis.apache.org/reference/services/ClockService.html";>ClockService</a></li>
+<li>call <code>ClockService.now()</code> etc where required.</li>
+</ul></li>
+</ul>
+
+<h2>Dynamic Layout</h2>
+
+<p>Up to this point we've been using annotations (<code>@MemberOrder</code>, 
<code>@MemberGroupLayout</code>, <code>@Named</code> and so on) for UI hints.  
However, the feedback loop is not good: it requires us stopping the app, 
editing the code, recompiling and running again.  So instead, all these UI 
hints (and more) can be specified dynamically, using a corresponding 
<code>.layout.json</code> file.  If edited while the app is running, it will be 
reloaded automatically (in IntelliJ, use Run>Reload Changed Classes):</p>
+
+<ul>
+<li>Delete the <code>@MemberOrder</code> and <code>@MemberGroupLayout</code> 
annotations and instead specify layout hints using a <a 
href="http://isis.apache.org/components/viewers/wicket/dynamic-layouts.html";>.layout.json</a>
 file.</li>
+</ul>
+
+<h2>Business rules</h2>
+
+<p>Apache Isis excels for domains where there are complex business rules to 
enforce.  The UI tries not to constrain the user from navigating around freely, 
however the domain objects nevertheless ensure that they cannot change into an 
invalid state.  Such rules can be enforced either declaratively (using 
annotations) or imperatively (using code).  The objects can do this in one of 
three ways:</p>
+
+<ul>
+<li>visibility: preventing the user from even seeing a 
property/collection/action</li>
+<li>usability: allowing the user to view a property/collection/action but not 
allowing the user to change it</li>
+<li>validity: allowing the user to modify the property/invoke the action, but 
validating that the new value/action arguments are correct before hand.</li>
+</ul>
+
+<p>Or, more pithily: "see it, use it, do it"</p>
+
+<h3>See it!</h3>
+
+<ul>
+<li>Use the <a 
href="http://isis.apache.org/reference/recognized-annotations/Hidden.html";>@Hidden</a>
 annotation to make properties/collections/actions invisible
+<ul>
+<li>the <a 
href="http://isis.apache.org/reference/recognized-annotations/Programmatic.html";>@Programmatic</a>
 annotation can also be used and in many cases is to be preferred; the 
difference is that the latter means the member is not part of the Isis 
metamodel.</li>
+</ul></li>
+<li>Use the <code>hideXxx()</code> supporting method on <a 
href="http://isis.apache.org/how-tos/how-to-02-010-How-to-hide-a-property.html";>properties</a>,
 <a 
href="http://isis.apache.org/how-tos/how-to-02-020-How-to-hide-a-collection.html";>collections</a>
 and <a 
href="http://isis.apache.org/how-tos/how-to-02-030-How-to-hide-an-action.html";>actions</a>
 to make a property/collection/action invisible according to some imperative 
rule</li>
+</ul>
+
+<h3>Use it!</h3>
+
+<ul>
+<li>Use the <a 
href="http://isis.apache.org/reference/recognized-annotations/Disabled.html";>@Disabled</a>
 annotation to make properties read-only/actions non-invokable ('greyed 
out')</li>
+<li>Use the <code>disabledXxx()</code> supporting method on <a 
href="http://isis.apache.org/how-tos/how-to-02-050-How-to-prevent-a-property-from-being-modified.html";>properties</a>
 and <a 
href="http://isis.apache.org/how-tos/how-to-02-070-How-to-prevent-an-action-from-being-invoked.html";>actions</a>
 to make a property/action disabled according to some imperative rule</li>
+</ul>
+
+<h3>Do it!</h3>
+
+<ul>
+<li>Validate string properties or action paramters:
+<ul>
+<li>use the <a 
href="http://isis.apache.org/reference/recognized-annotations/RegEx.html";>@Regex</a>
 annotation to specify a pattern</li>
+<li>use the <a 
href="http://isis.apache.org/reference/recognized-annotations/MinLength.html";>@MinLength</a>
 annotation to indicate a minimum number of characters</li>
+</ul></li>
+<li>Use the <code>validateXxx()</code> supporting method on <a 
href="http://isis.staging.apache.org/how-tos/how-to-02-100-How-to-validate-user-input-for-a-property.html";>properties</a>
 or <a 
href="http://isis.staging.apache.org/how-tos/how-to-02-120-How-to-validate-an-action-parameter-argument.html";>action
 parameter</a></li>
+<li>optional: for any data type:
+<ul>
+<li>use the <a 
href="http://isis.apache.org/reference/recognized-annotations/MustSatisfy.html";>@MustSatisfy</a>
 annotation to specify an arbitrary constraint</li>
+</ul></li>
+</ul>
+
+<h2>Dashboard (home page)</h2>
+
+<ul>
+<li>Add the <a 
href="http://isis.apache.org/reference/recognized-annotations/HomePage.html";>@HomePage</a>
 annotation to one (no more) of the domain services' no-arg actions</li>
+</ul>
+
+<h2>Decoupling using Contributions</h2>
+
+<h3>Contributed Actions</h3>
+
+<ul>
+<li>Write a new domain service
+<ul>
+<li>by convention, called "XxxContributions"</li>
+<li>annotate with <code>@DomainService</code></li>
+</ul></li>
+<li>Write an action accepting >1 args:
+<ul>
+<li>one being a domain entity</li>
+<li>other being a primitive or String</li>
+</ul></li>
+<li>For this action, add the <a 
href="http://isis.apache.org/reference/recognized-annotations/NotInServiceMenu.html";>@NotInServiceMenu</a>
 annotation
+<ul>
+<li>indicates service's actions should <em>not</em> be included in the main 
application menu bar</li>
+</ul></li>
+<li>should be rendered "as if" an action of the entity</li>
+</ul>
+
+<h3>Contributed Collections</h3>
+
+<ul>
+<li>Write a new domain service (or update the one previously)</li>
+<li>Write a query-only action accepting exactly 1 arg (a domain entity)
+<ul>
+<li>returning a collection, list or set</li>
+</ul></li>
+<li>For this action:
+<ul>
+<li>add the <a 
href="http://isis.apache.org/reference/recognized-annotations/NotInServiceMenu.html";>@NotInServiceMenu</a>
 annotation</li>
+<li>add the <a 
href="http://isis.apache.org/reference/recognized-annotations/NotContributed.html";>@NotContributed(As.ACTION)</a>
 annotation</li>
+</ul></li>
+<li>should be rendered in the UI "as if" a collection of the entity</li>
+<li>use <code>.layout.json</code> to position as required</li>
+</ul>
+
+<h3>Contributed Properties</h3>
+
+<ul>
+<li>As for contributed collections, write a new domain service with a 
query-only action accepting exactly 1 arg (a domain entity); except:
+<ul>
+<li>returning a scalar value rather than a collection</li>
+</ul></li>
+<li>For this action, annotate as <a 
href="http://isis.apache.org/reference/recognized-annotations/NotInServiceMenu.html";>@NotInServiceMenu</a>
 and <a 
href="http://isis.apache.org/reference/recognized-annotations/NotContributed.html";>@NotContributed(As.ACTION)</a></li>
+<li>should be rendered in the UI "as if" a property of the entity</li>
+<li>use <code>.layout.json</code> to position as required</li>
+</ul>
+
+<h2>Decoupling using the Event Bus</h2>
+
+<p>TODO</p>
+
+<ul>
+<li>Bulk actions</li>
+</ul>
+
+<p>TODO</p>
+
+<h2>Performance tuning</h2>
+
+<p>TODO</p>
+
+<ul>
+<li>QueryResultsCache</li>
+<li>Scratchpad Services</li>
+</ul>
+
+<h2>Extending the Wicket UI</h2>
+
+<h3>Excel download</h3>
+
+<p>TODO</p>
+
+<h3>Fullcalendar2</h3>
+
+<p>TODO</p>
+
+<h3>gmap3</h3>
+
+<p>TODO</p>
+
+<h2>Add-ons</h2>
+
+<h3>Security</h3>
+
+<p>TODO</p>
+
+<h3>Command</h3>
+
+<p>TODO</p>
+
+<h3>Auditing</h3>
+
+<p>TODO</p>
+
+<h3>Publishing</h3>
+
+<p>TODO</p>
+
+<h2>CSS</h2>
+
+<p>TODO</p>
+
+<h2>View models</h2>
+
+<p>TODO</p>
+
+<h2>Integration tests</h2>
+
+<p>TODO</p>
+
+<h2>Composite fixture scripts (a la Estatio)</h2>
+
+<p>TODO</p>
+
+<h2>Customising the REST API</h2>
+
+<p>TODO</p>
+
+
+
+      </div>
+
+        <div id="edit" class="modal hide fade in" style="xxxdisplay: none; ">
+            <div class="modal-header">
+                <a class="close" data-dismiss="modal">x</a>
+
+                <h3>Thank you for contributing to the documention!</h3>
+            </div>
+            <div class="modal-body">
+                <h4>Any help with the documentation is greatly 
appreciated.</h4>
+                <p>All edits are reviewed before going live, so feel free to 
do much more than fix typos or links.  If you see a page that could benefit 
from an entire rewrite, we'd be thrilled to review it.  Don't be surprised if 
we like it so much we ask you for help with other pages :)</p>
+                <small>NOTICE: unless indicated otherwise on the pages in 
question, all editable content available from apache.org is presumed to be 
licensed under the Apache License (AL) version 2.0 and hence all submissions to 
apache.org treated as formal Contributions under the license terms.</small>
+                <!--[if gt IE 6]>
+                <h4>Internet Explorer Users</h4>
+                <p>If you are not an Apache committer, click the Yes link and 
enter a <i>anonymous</i> for the username and leave the password empty</p>
+                <![endif]-->
+
+            </div>
+            <div class="modal-footer">
+                Do you have an Apache ID?
+                <a 
href="javascript:void(location.href='https://cms.apache.org/redirect?uri='+escape(location.href))"
 class="btn">Yes</a>
+                <a 
href="javascript:void(location.href='https://anonymous:@cms.apache.org/redirect?uri='+escape(location.href))"
 class="btn">No</a>
+            </div>
+        </div>
+        <!--
+        <script src="./../../javascript/bootstrap-modal.js"></script>
+        -->
+
+      <footer>
+        <hr/>
+        <p>
+        Copyright &copy; 2010~2014 The Apache Software Foundation, Licensed 
under the Apache License, Version 2.0.
+        <br/>
+        Apache Isis, Isis, Apache, the Apache feather logo, and the Apache 
Isis project logo are trademarks of The Apache Software Foundation.
+        </p>
+      </footer>
+
+    </div> <!-- /container -->
+
+  </body>
+</html>

Modified: websites/staging/isis/trunk/content/intro/tutorials/tutorials.html
==============================================================================
--- websites/staging/isis/trunk/content/intro/tutorials/tutorials.html 
(original)
+++ websites/staging/isis/trunk/content/intro/tutorials/tutorials.html Wed Nov 
19 04:12:28 2014
@@ -417,6 +417,10 @@
 </h1>
 </div>
 
+<h2>Stop Scaffolding, Start Coding</h2>
+
+<p>This <a href="apacheconeu-2014.html">tutorial</a> was originally put 
together for Apache Con Europe 2014.</p>
+
 <h2>RRRADDD!!! Really Ridiculously Rapid Application Development 
(Domain-Driven)</h2>
 
 <h3>2012 edition</h3>
@@ -433,6 +437,8 @@
 
 <p>To support that presentation, there is a <a 
href="https://github.com/danhaywood/rrraddd-isis-131";>github project</a>, set 
up to run against Isis v1.3.1.  You can run throug the README of that project, 
or just do a <code>git checkout</code> for each of the various tags (22 in 
all!)</p>
 
+<p>There's also an <a 
href="https://github.com/danhaywood/isis-tutorial-140";>updated version</a> that 
runs against Isis v1.4.0.</p>
+
 
 
       </div>


Reply via email to