You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by bu...@apache.org on 2013/10/04 18:46:23 UTC

svn commit: r881178 - in /websites/staging/isis/trunk: cgi-bin/ content/ content/getting-started/screenshots2.html

Author: buildbot
Date: Fri Oct  4 16:46:23 2013
New Revision: 881178

Log:
Staging update by buildbot for isis

Added:
    websites/staging/isis/trunk/content/getting-started/screenshots2.html
Modified:
    websites/staging/isis/trunk/cgi-bin/   (props changed)
    websites/staging/isis/trunk/content/   (props changed)

Propchange: websites/staging/isis/trunk/cgi-bin/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Oct  4 16:46:23 2013
@@ -1 +1 @@
-1527208
+1529211

Propchange: websites/staging/isis/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Fri Oct  4 16:46:23 2013
@@ -1 +1 @@
-1527208
+1529211

Added: websites/staging/isis/trunk/content/getting-started/screenshots2.html
==============================================================================
--- websites/staging/isis/trunk/content/getting-started/screenshots2.html (added)
+++ websites/staging/isis/trunk/content/getting-started/screenshots2.html Fri Oct  4 16:46:23 2013
@@ -0,0 +1,768 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+
+    <meta charset="utf-8">
+      <title>Screenshots
</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.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);
+        }
+    </style>
+    <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=Screenshots
",
+                  'Share on Twitter',
+                  'width=800,height=526');
+      };
+    </script>
+
+    <!-- Le fav and touch icons -->
+    <link rel="shortcut icon" href="./../images/favicon.ico">
+    <!--
+    <link rel="apple-touch-icon" href="./../images/apple-touch-icon.png">
+    <link rel="apple-touch-icon" sizes="72x72" href="./../images/apple-touch-icon-72x72.png">
+    <link rel="apple-touch-icon" sizes="114x114" href="./../images/apple-touch-icon-114x114.png">
+    -->
+
+    <script src="./../javascript/prettify.js" type="text/javascript"></script>
+    <script src="./../javascript/jquery-latest.js"></script>
+
+
+    <script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
+    <script src="./../javascript/common.js"></script>
+    <script src="./../javascript/prettyprint.js"></script>
+
+    <script src="./../javascript/bootstrap-alert.js"></script>
+    <script src="./../javascript/bootstrap-dropdown.js"></script>
+    <script src="./../javascript/bootstrap-tooltip.js"></script>
+    <!--
+    <script src="./../javascript/bootstrap-alerts.js"></script>
+    -->
+    <script src="./../javascript/bootstrap-modal.js"></script>
+    <script src="./../javascript/bootstrap-transition.js"></script>
+    <script src="./../javascript/bootstrap-button.js"></script>
+    <script src="./../javascript/bootstrap-popover.js"></script>
+    <script src="./../javascript/bootstrap-scrollspy.js"></script>
+    <script src="./../javascript/bootstrap-typeahead.js"></script>
+    <script src="./../javascript/bootstrap-carousel.js"></script>
+    <script src="./../javascript/bootstrap-tab.js"></script>
+    <script src="./../javascript/bootstrap-collapse.js"></script>
+
+    
+    
+    
+
+    <script>
+    $(function () { prettyPrint() })
+    $().dropdown()
+    </script>
+
+    <!-- GAQ stuff removed here -->
+
+
+  </head>
+
+  <body>
+
+    <div class="topbar">
+      <div class="fill">
+        <div class="container">
+          <a class="brand" href="./../index.html">Apache Isis&trade;</a>
+          <ul class="nav">
+            <li class="dropdown">
+              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
+              <ul class="dropdown-menu">
+                <li>
+                  <a href="http://www.apache.org/">Apache Homepage <i class="icon-share-alt"></i></a>
+                </li>
+                <li>
+                  <a href="http://www.apache.org/licenses/">Licenses <i class="icon-share-alt"></i></a>
+                </li>
+                <li>
+                  <a href="http://www.apache.org/security/">Security <i class="icon-share-alt"></i></a>
+                </li>
+                <li>
+                  <a href="http://www.apache.org/foundation/sponsorship.html">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>
+            <li><a href="./../index.html">Home</a></li>
+            <li><a href="./../download.html">Download</a></li>
+            <li class="dropdown">
+              <a href="#" class="dropdown-toggle" data-toggle="dropdown">Screenshots<b class="caret"></b></a>
+              <ul class="dropdown-menu">
+                <li><a href="./../getting-started/screenshots.html">Screenshots</a></li>
+                <li><a href="./../getting-started/screencasts.html">Screencasts</a></li>
+                <li><a href="./../getting-started/powered-by.html">Powered by</a></li>
+                <!--
+                <li><a href="#">Online Demo</a></li>
+                -->
+              </ul>
+            </li>
+            <li><a href="./../documentation.html">Documentation</a></li>
+            <li><a href="./../support.html">Support</a></li>
+
+          </ul>
+
+          <!-- Google CSE Search Box Begins -->
+          <div style="float: right; position: relative; ">
+
+          <!--
+              <form action="http://www.google.com/cse" id="cse-search-box" _lpchecked="1">
+                <div>
+                    <input type="hidden" name="cx" value="012614087480249044419:dn-q5gtwxya">
+                    <input type="hidden" name="ie" value="UTF-8">
+                    <input type="text" name="q" placeholder="Search" size="31" style="border: 1px solid rgb(126, 157, 185); padding: 2px; background-color: rgb(255, 255, 255); background-position: 0% 50%; background-repeat: no-repeat no-repeat;">
+                    <input type="submit" name="sa" value="Search">
+                </div>
+                <input name="siteurl" type="hidden" value="isis.apache.org">
+                <input name="ref" type="hidden" value="">
+                <input name="ss" type="hidden" value="677j458329j2">
+            </form>
+          -->
+          
+            <FORM class="pull-right" id="searchbox_012614087480249044419:dn-q5gtwxya" action="http://www.google.com/cse">
+                    <input type="hidden" name="cx" value="012614087480249044419:dn-q5gtwxya">
+                <INPUT type="hidden" name="cof" value="FORID:0">
+                <INPUT name="q" type="text" placeholder="Search">
+            </FORM>
+
+          </div>
+       <!-- Google CSE Search Box Ends -->
+        
+        </div>
+      </div>
+    </div>
+
+    <div class="container">
+      <div class="markdown-content">
+      
+
+<div class="page-header">
+<p><a href="./../documentation.html">Docs</a>&nbsp;&raquo&nbsp;<a href="./../getting-started/about.html">Getting Started</a></p>
+<h1>Screenshots
+
+</h1>
+</div>
+
+<p>The following screenshots show the Wicket and Restful Objects viewers running a simple 'todo app', as generated by the <a href="quickstart-archetype.html">quickstart archetype</a>.</p>
+
+<div id="this-carousel-id" class="carousel slide"><!-- class of slide for animation -->
+  <div class="carousel-inner">
+    <div class="item active"><!-- class of active since it's the first item -->
+      <img src="http://placehold.it/1200x480" alt="" />
+      <div class="carousel-caption">
+        <p>Caption text here</p>
+      </div>
+    </div>
+    <div class="item">
+      <img src="http://placehold.it/1200x480" alt="" />
+      <div class="carousel-caption">
+        <p>Caption text here</p>
+      </div>
+    </div>
+    <div class="item">
+      <img src="http://placehold.it/1200x480" alt="" />
+      <div class="carousel-caption">
+        <p>Caption text here</p>
+      </div>
+    </div>
+    <div class="item">
+      <img src="http://placehold.it/1200x480" alt="" />
+      <div class="carousel-caption">
+        <p>Caption text here</p>
+      </div>
+    </div>
+  </div><!-- /.carousel-inner -->
+  <!--  Next and Previous controls below
+        href values must reference the id for this carousel -->
+    <a class="carousel-control left" href="#this-carousel-id" data-slide="prev">&lsaquo;</a>
+    <a class="carousel-control right" href="#this-carousel-id" data-slide="next">&rsaquo;</a>
+</div>
+
+<!-- /.carousel -->
+
+<p><table>
+  <tr><td span=2><h3>Wicket Viewer</h3></td></tr>
+  <tr>
+    <td>Welcome Page<br/><br/><i>The archetype's welcome page describes how the application is configured, and the most significant files</i></td>
+    <td>
+      <img src="resources/screencast-01-welcome-page.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Wicket Home Page<br/><br/><i>The Wicket viewer displays a home page showing the domain services as menu items.  These are registered in </i><tt>WEB-INF/isis.properties</tt><br/><br/><i>The welcome text links to the main <tt>ToDoItem</tt> domain class over on <a href="https://github.com/apache/isis/blob/master/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java">github</a>. (You can easily change this text).</i></td>
+    <td>
+      <img src="resources/screencast-02-wicket-home-page.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Domain class source code<br/><br/><i>Most of the functionality of the quickstart app is inferred from the <tt>ToDoItem</tt> class.</i></td>
+    <td>
+      <img src="resources/screencast-03-github-source-code.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Install Fixtures<br/><br/><i>The quickstart app is configured to run using the JDO objectstore, but with an in-memory database.  The <tt>Fixtures</tt> domain service allows the administrator (user: sven, password: pass) to install sample data:</i><pre>
+@Named("Fixtures")
+public class ToDoItemsFixturesService {
+    public String install() { ... }
+    ...
+    public String installFor(
+        @Named("User") String user) { ... }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-04-fixture-install.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Fixtures Installed<br/><br/><i>Invoking an action that returns a scalar value, such as the information message, is displayed on the page.</i></td>
+    <td>
+      <img src="resources/screencast-05-fixture-installed.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Query using a domain service<br/><br/><i>Domain services more usually act as both repositories and factories.  In this case the <tt>ToDoItems</tt> domain service can be used to lookup existing <tt>ToDoItem</tt>s, or to create new ones:</i><pre>
+@Named("ToDos")
+public class ToDoItems {
+    ...
+    @MemberOrder(sequence = "1")
+    public List<ToDoItem> notYetComplete() { ... }
+    ...
+    @MemberOrder(sequence = "2")
+    public List<ToDoItem> complete() { ... }
+    ...
+    @MemberOrder(sequence = "3")
+    public ToDoItem newToDo( ... ) { ... }
+    ...
+    @MemberOrder(sequence = "4")
+    public List<ToDoItem> allToDos() { ... }
+</div>
+</pre></td>
+    <td>
+      <img src="resources/screencast-06-todos-not-yet-complete.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Results shown in table<br/><br/><i>Actions that return collections of entities are shown in a table.  In this case the action has returned a list of <tt>ToDoItem</tt>s.  Not every property of the entity need be shown.</i></td>
+    <td>
+      <img src="resources/screencast-07-todos-result.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Bulk collections<br/><br/><i>Bulk actions can be invoked on all selected elements.  Bulk actions are indicated using <tt>@Bulk</tt> annotation:</i><pre>
+public class ToDoItem {
+    ...
+    @Bulk
+    public void complete() {
+        setComplete(true);
+    }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-08-collection-action.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>&nbsp;</td>
+    <td>
+      <img src="resources/screencast-09-collection-action-invoked.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Follow Link<br/><br/><i>Navigation to an entity's detailed page is by following the hyperlink.  This navigation is consistent throughout the UI.</i></td>
+    <td>
+      <img src="resources/screencast-10-follow-link.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Entity detail pages<br/><br/><i>The Wicket viewer builds the UI from the domain class's structure.  It shows an icon and title for the entity top left:</i>
+    <pre>
+public class ToDoItem {
+    public String title() {
+        final TitleBuffer buf = 
+            new TitleBuffer();
+        buf.append(getDescription());
+        if (isComplete()) {
+            buf.append(" - Completed!");
+        } else {
+            if (getDueBy() != null) {
+                buf.append(" due by ", 
+                           getDueBy());
+            }
+        }
+        return buf.toString();
+    }
+    ... 
+</div>}
+</pre>
+    <i>...(scalar) properties are displayed underneath:</i><pre>
+    ...
+    @RegEx(validation = 
+      "\w[@&amp;:\-\,\.\+ \w]*")
+    @MemberOrder(sequence = "1")
+    public String getDescription() { ... }
+    public void setDescription(
+            String description) { ... }
+    ...
+</div>}
+</pre><i>... (vector) collections on the right:</i><pre>
+    ...
+    @Disabled
+    @MemberOrder(sequence = "1")
+    @Resolve(Type.EAGERLY)
+    public List<ToDoItem> getDependencies() { ... }
+    public void setDependencies(List<ToDoItem>) { ... }
+    ...
+</div>}
+</pre></i><br/><i>... and actions are shown top right:</i><pre>
+    ...
+    @Named("Clone")
+    @MemberOrder(sequence = "3")
+    public ToDoItem duplicate() { ... }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-11-todo-entity.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Edit entity<br/><br/><i>The entity's properties can be edited through the 'Edit' button.  Some properties may not be editable:</i><pre>
+public class ToDoItem {
+    ...
+    @Disabled
+    @MemberOrder(sequence = "4")
+    public boolean isComplete() { ... }
+    public void setComplete(
+        final boolean complete) { ... }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-12-todo-entity-edit.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Drop downs<br/><br/><i>Drop downs are provided for enums (such as Category):</i><pre>
+public class ToDoItem {
+    public static enum Category {
+        Professional, Domestic, Other;
+    }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-13-todo-edit-enum.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Optimistic locking<br/><br/><i>Updating the entity bumps up its version number.  Behind the scenes this is done by the JDO objectstore</i><pre>
+@javax.jdo.annotations.Version(
+    strategy=VersionStrategy.VERSION_NUMBER, 
+    column="VERSION")
+...
+public class ToDoItem {
+    ...
+    @Hidden(where=Where.ALL_TABLES)
+    @Disabled
+    @MemberOrder(name="Detail", 
+                 sequence = "99")
+    @Named("Version")
+    public Long getVersionSequence() {
+        if(!(this instanceof 
+               PersistenceCapable)) {
+            return null;
+        } 
+        PersistenceCapable pc = 
+            (PersistenceCapable) this;
+        final Long version = 
+            (Long) JDOHelper.
+                   getVersion(pc);
+        return version;
+    }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-14-optimistic-locking.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Invoking actions<br/><br/><i>Actions can be invoked; there may or may not be arguments:</i><pre>
+public class ToDoItem {
+    ...
+    public ToDoItem completed() {
+        setComplete(true);
+        return this;
+    }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-15-invoke-action.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Disabling actions<br/><br/><i>Actions can be disabled (as can editing properties) using supporting methods:</i><pre>
+public class ToDoItem {
+    ...
+    public ToDoItem completed() { ... }
+    public String disableCompleted() {
+        return complete ? 
+            "Already completed" : null;
+    }
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-16-invoke-action-disabled.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Actions grouped<br/><br/><i>Often actions relate to a particular colleciton of an entity.  The Wicket viewer renders such actions next to that collection.  For example:</i><pre>
+public class ToDoItem {
+    ...
+    @MemberOrder(
+        name="dependencies", 
+        sequence = "3")
+    public ToDoItem add(
+        final ToDoItem toDoItem) { ... }
+        getDependencies().add(toDoItem);
+        return this;
+    }
+    ...
+</div>}
+</pre><i>There might also be validation logic:</i><pre>
+public class ToDoItem {
+    ...
+    public String validateAdd(
+           final ToDoItem toDoItem) {
+        if(getDependencies().
+               contains(toDoItem)) {
+            return "Already a dependency";
+        }
+        if(toDoItem == this) {
+            return "Can't set up a " + 
+                   "dependency to self";
+        }
+        return null;
+    }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-17-invoke-action-grouped-params.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Actions can take arguments<br/><br/><i>In the case of arguments (or indeed when editing properties) that are references to entities, these can be looked up using an autocomplete action on a repository:</i><pre>
+@AutoComplete(repository=ToDoItems.class, action="autoComplete")
+public class ToDoItem { ... }
+</pre><i>and:</i></p>
+
+<pre>
+public class ToDoItems {
+    ...
+    @Hidden
+    public List<ToDoItem> autoComplete(
+            final String description) {
+        return ... 
+    }
+    ...
+</div>}
+</pre>
+
+<p></td>
+    <td>
+      <img src="resources/screencast-18-invoke-action-args.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Collections (and properties) can be derived<br/><br/><i>The viewer will render the state of the object, which can be persisted state or derived on the fly.  A common pattern is to delegate to an (automatically injected) domain service:</i><pre>
+public class ToDoItem {
+    ...
+    @MemberOrder(sequence = "5")
+    @NotPersisted
+    @Resolve(Type.EAGERLY)
+    public List<ToDoItem> getSimilarItems() {
+        return toDoItems.similarTo(this);
+    }
+    ...
+    private ToDoItems toDoItems;
+    // automatically injected
+    public void setToDoItems(
+            final ToDoItems toDoItems) {
+        this.toDoItems = toDoItems;
+    }
+    ...
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-19-collection.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Breadcrumbs<br/><br/><i>The Wicket viewer has breadcrumbs which can be used either to get back to a previous entity or to invoke a (query-only) action:</i></p>
+
+<pre>
+public class ToDoItems {
+    ...
+    @ActionSemantics(Of.SAFE)
+    public List<ToDoItem> notYetComplete() { ... }
+    ...
+</div>}
+</pre>
+
+<p></td>
+    <td>
+      <img src="resources/screencast-20-breadcrumbs.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Audit Service<br/><br/><i>The JDO Objectstore supports an auditing service.  The quickstart app provides an example implementation of this service:</i><pre>
+public class AuditServiceDemo implements AuditService {
+    ...
+    public void audit(
+        String user, 
+        long currentTimestampEpoch, 
+        String objectType, String identifier, 
+        String preValue, String postValue) { 
+       ...
+    }
+</div>}
+</pre></td>
+    <td>
+      <img src="resources/screencast-21-audit-list.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Audit Records<br/><br/><i>The demo audit service simply persists an audit entry for each update.</i></td>
+    <td>
+      <img src="resources/screencast-22-audit-records.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Multi-User<br/><br/><i>Apache Isis is a multi-user system.  The administrator (sven/pass) has the permissions to be able to install fixtures for other users.</i></td>
+    <td>
+      <img src="resources/screencast-23-fixtures-install-for.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>&nbsp;<br/><br/><i>&nbsp;</i></td>
+    <td>
+      <img src="resources/screencast-24-fixtures-install-args.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>&nbsp;<br/><br/><i>&nbsp;</i></td>
+    <td>
+      <img src="resources/screencast-25-fixtures-installed-for-guest.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Login as user<br/><br/><i>The quickstart app provides a 'guest' user that has a limited set of permissions....</i></td>
+    <td>
+      <img src="resources/screencast-26-login-as-guest.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Permissions<br/><br/><i>... the guest user can use the 'ToDoItems' domain service, but the other services are not available.  In the case of the quickstart this is specified in </i><tt>WEB-INF/shiro.ini</tt><i> configuration file.</i></td>
+    <td>
+      <img src="resources/screencast-27a-guests-todos.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr><td span=2><h3>RestfulObjects Viewer</h3></td></tr>
+  <tr>
+    <td>Access the RESTful API<br/><br/><i>The Restful Objects viewer exposes the domain object model through a JSON-based RESTful API.  Typically access will be restricted, in this case using HTTP BASIC authentication (though this is configurable).</i></td>
+    <td>
+      <img src="resources/screencast-28-restful-login.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>List domain services<br/><br/><i>Most interactions with the RESTful API start by accessing the resource that represents the list of domain services.  However, the Restful Objects viewer also exposes templated URLs (as per the <a href="http://restfulobjects.org">Restful Objects spec</a> that it implements).</i></td>
+    <td>
+      <img src="resources/screencast-29-restful-services.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Domain service members<br/><br/><i>Navigating to a particular domain service returns a representation of the members provided by that domain service.</i></td>
+    <td>
+      <img src="resources/screencast-30-restful-todoitems-service.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Domain service action<br/><br/><i>A detailed representation of each individual action can be accessed; this can be considered as analogous to the action parameter prompt page in the Wicket viewer.</i></td>
+    <td>
+      <img src="resources/screencast-31-restful-todoitems-notyetcomplete.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Invoking a domain service action<br/><br/><i>One of the links provided in the detailed representation is to invoke the action.  Note that the link specifies the HTTP method to use, along with the arguments (if any) to be provided.</i></td>
+    <td>
+      <img src="resources/screencast-32-restful-todoitems-notyetcomplete-invoke.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Action returning a list<br/><br/><i>Invoking an action will return a scalar value, or a reference to an entity, or (as in this case) a list of references to entities.</i></td>
+    <td>
+      <img src="resources/screencast-33-restful-todoitems-notyetcomplete-results.png" width="525" height="349"></img>
+    </td>
+  </tr>
+  <tr>
+    <td>Representation of an entity<br/><br/><i>The entity's representation shows the state of its (scalar) properties, links to its (vector) collections contents, and also links to invoke the entity's actions.</i></td>
+    <td>
+      <img src="resources/screencast-34-restful-entity.png" width="525" height="349"></img>
+    </td>
+  </tr>
+<table></p>
+
+
+
+      </div>
+
+        <div id="edit" class="modal hide fade in" style="display: none; ">
+            <div class="modal-header">
+                <a class="close" data-dismiss="modal">x</a>
+
+                <h3>Thank you for contributing to the 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>
+        <p>
+        Copyright &copy; 2012~2013 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>