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 2014/02/10 22:28:27 UTC

svn commit: r897213 [30/33] - in /websites/staging/isis/trunk: cgi-bin/ content/ content/applib-guide/ content/archetypes/ content/archetypes/release-notes/ content/components/objectstores/jdo/ content/components/security/shiro/ content/core/ content/c...

Added: websites/staging/isis/trunk/content/reference/services/auditing-service.html
==============================================================================
--- websites/staging/isis/trunk/content/reference/services/auditing-service.html (added)
+++ websites/staging/isis/trunk/content/reference/services/auditing-service.html Mon Feb 10 21:28:21 2014
@@ -0,0 +1,386 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+
+    <meta charset="utf-8">
+      <title>Auditing Service</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 */
+
+        .container {
+          width: 940px;
+        }
+
+        .markdown-content .documentation .span-one-third p {
+          margin-bottom: 0px;
+        }
+
+        .markdown-content .documentation .group {
+          margin-top: 9px;
+        }
+
+        .documentation .group h2 {
+          border-bottom: 1px solid #DDD
+        }
+        .documentation h2 a, .documentation h3 a {
+          /* 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;
+        }
+        
+    </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=Auditing Service",
+                  '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><a href="./../../download.html">Download</a></li>
+          <li><a href="./../../documentation.html">Documentation</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="http://isisdemo.mmyco.co.uk/">Online Demo</a></li>
+            </ul>
+          </li>
+
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Support<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=">ML Archives</a></li>
+              <li><a href="https://issues.apache.org/jira/browse/ISIS">JIRA</a></li>
+              <li><a href="http://stackoverflow.com/questions/tagged/isis">Stack Overflow</a></li>
+              <li><a href="http://github.com/apache/isis">Github mirror</a></li>
+            </ul>
+          </li>
+
+          <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>
+          
+          <li class="dropdown  navbar-right">
+            <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>
+        </ul>
+
+      </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="./../../reference/about.html">Reference</a>&nbsp;&raquo&nbsp;<a href="./../../reference/services/about.html">Services</a></p>
+<h1>Auditing Service
+
+</h1>
+</div>
+
+<p>The auditing service provides a simple mechanism to capture changes to data.  It is called for each property that has changed on any domain object, as a set of pre- and post-values.</p>
+
+<h3>API [1.4.0-SNAPSHOT]</h3>
+
+<p>The API for the service is:</p>
+
+<pre><code>public interface AuditingService3 {
+
+    @Programmatic
+    public void audit(
+            final UUID transactionId, String targetClassName, final Bookmark target, 
+            String memberIdentifier, final String propertyName, 
+            final String preValue, final String postValue, 
+            final String user, final java.sql.Timestamp timestamp);
+  }
+</code></pre>
+
+<blockquote>
+  <p><strong>BREAKING CHANGE!!!</strong> The previous APIs for this service (<code>AuditingService</code> and <code>AuditingService2</code>) have been removed.  The new API is a superset of these previous APIs.  The change was made so that the auditing service would be consistent with the related <a href="./publishing-service.html">Publishing</a> and the <a href="./command-context.html">Command Context</a> services.</p>
+</blockquote>
+
+<h3>API [1.3.0]</h3>
+
+<p>The API for the service is:</p>
+
+<pre><code>public interface AuditingService2 {
+
+    @Hidden
+    public void audit(
+       String user, long currentTimestampEpoch, 
+       String objectType, String identifier, 
+       String propertyId, 
+       String preValue, String postValue);
+  }
+</code></pre>
+
+<blockquote>
+  <p>Note that the original API for this service was called <code>AuditingService</code>.  This original API has been deprecated because it accidentally omitted the <code>propertyId</code> parameter.</p>
+</blockquote>
+
+<h3>Implementations</h3>
+
+<p>A simple implementation of the service that writes to stderr, is available, useful for debugging:</p>
+
+<ul>
+<li><code>org.apache.isis.applib.services.audit.AuditingService3$Stderr</code> [1.4.0-SNAPSHOT]</li>
+<li><code>org.apache.isis.applib.services.audit.AuditingService2$Stderr</code> [1.3.0]</li>
+</ul>
+
+<p>An alternative implementation, that persists audit records to a database, is the <a href="../../components/objectstores/jdo/publishing-service-jdo.html">JDO Publishing Service</a>.   This implementation is only supported when the the <a href="../../components/objectstores/jdo/about.html">JDO objectstore</a> is configured.</p>
+
+<h3>Register the Service</h3>
+
+<p>Register like any other service in <code>isis.properties</code>.  For example, if using the <a href="../../components/objectstores/jdo/auditing-service.html">JDO auditing implementation</a> then it would be:</p>
+
+<pre><code>isis.services=...,\
+              org.apache.isis.objectstore.jdo.applib.service.audit.AuditingServiceJdo,\
+              ...
+</code></pre>
+
+<h3>Related Services</h3>
+
+<p>A similar service that you may want to use alongside or instead of the auditing service is the <a href="publishing-service.html">Publishing Service</a>.</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>

Added: websites/staging/isis/trunk/content/reference/services/background-service.html
==============================================================================
--- websites/staging/isis/trunk/content/reference/services/background-service.html (added)
+++ websites/staging/isis/trunk/content/reference/services/background-service.html Mon Feb 10 21:28:21 2014
@@ -0,0 +1,642 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+
+    <meta charset="utf-8">
+      <title>Background Service [1.4.0-SNAPSHOT]</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 */
+
+        .container {
+          width: 940px;
+        }
+
+        .markdown-content .documentation .span-one-third p {
+          margin-bottom: 0px;
+        }
+
+        .markdown-content .documentation .group {
+          margin-top: 9px;
+        }
+
+        .documentation .group h2 {
+          border-bottom: 1px solid #DDD
+        }
+        .documentation h2 a, .documentation h3 a {
+          /* 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;
+        }
+        
+    </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=Background Service [1.4.0-SNAPSHOT]",
+                  '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><a href="./../../download.html">Download</a></li>
+          <li><a href="./../../documentation.html">Documentation</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="http://isisdemo.mmyco.co.uk/">Online Demo</a></li>
+            </ul>
+          </li>
+
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Support<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=">ML Archives</a></li>
+              <li><a href="https://issues.apache.org/jira/browse/ISIS">JIRA</a></li>
+              <li><a href="http://stackoverflow.com/questions/tagged/isis">Stack Overflow</a></li>
+              <li><a href="http://github.com/apache/isis">Github mirror</a></li>
+            </ul>
+          </li>
+
+          <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>
+          
+          <li class="dropdown  navbar-right">
+            <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>
+        </ul>
+
+      </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="./../../reference/about.html">Reference</a>&nbsp;&raquo&nbsp;<a href="./../../reference/services/about.html">Services</a></p>
+<h1>Background Service [1.4.0-SNAPSHOT]
+
+</h1>
+</div>
+
+<p>The <code>BackgroundService</code>, and its companion <code>BackgroundCommandService</code>, enable action invocations to be persisted such that they may be invoked in the background.</p>
+
+<p>The <code>BackgroundService</code> is responsible for capturing a memento representing the action invocation, and persisting it.  The default <code>BackgroundServiceDefault</code> implementation (provided by isis-core) uses (a private copy of) <a href="./memento-service.html">MementoService</a>, and then delegates the persistence of the memento to the companion <code>BackgroundCommandService</code> (discussed further <a href="#BackgroundCommandService">below</a>).</p>
+
+<p>The JDO objectstore provides an implementation of <code>BackgroundCommandService</code> (<a href="../../components/objectstores/jdo/background-command-service-jdo.html">BackgroundCommandServiceJdo</a>) that persists to an RBMS entities.  You are welcome to write other implementations to other data stores (eg NoSQL) if required.</p>
+
+<p>The persisting of commands is only half the story; there needs to be a separate process  to read the commands and execute them.  The <code>BackgroundCommandExecution</code> class (also discussed <a href="#BackgroundCommandExecution">below</a> provides the mechanism to do this.</p>
+
+<h2>BackgroundService</h2>
+
+<p>The <code>BackgroundService</code> is the entry point for domain classes wishing to perform actions asynchronously.  This can be done in a typesafe way; the (default implementation of) <code>BackgroundService</code> actually uses a proxy wrapper around the target so that it can capture the action to invoke and its arguments, and then persist them rather than execute them.</p>
+
+<h3>API &amp; Implementation</h3>
+
+<p>Returns a proxy around the object which is then used to obtain the signature of the action to be invoked in the background.</p>
+
+<pre><code>public interface BackgroundService {
+
+    @Programmatic
+    &lt;T&gt; T execute(final T object);
+}
+</code></pre>
+
+<p>The default implementation is provided by core:</p>
+
+<ul>
+<li><code>org.apache.isis.core.runtime.services.background.BackgroundServiceDefault</code></li>
+</ul>
+
+<h3>Usage</h3>
+
+<p>Using the <code>BackgroundService</code> is very straight-forward.  For example:</p>
+
+<pre><code>public void submitCustomerInvoices() {
+    for(Customer customer: customerRepository.findCustomersToInvoice()) {
+        backgroundService.execute(customer).submitInvoice();
+    }
+    container.informUser("Calculating...");
+}
+</code></pre>
+
+<p>Will create a bunch of background commands executing the <code>submitInvoice()</code> action for each of the customers returned from the customer repository.</p>
+
+<p>The action method invoked must be part of the Isis metamodel, which is to say it must be public, accept only scalar arguments, and must not be annotated with <code>@Programmatic</code> or <code>@Ignore</code>.  However, it may be annotated with <code>@Hidden</code>, and it will still be invoked.  </p>
+
+<p>In fact, when invoked by the background service, no business rules (hidden, disabled, validation) are enforced; the action method must take responsibility for performing appropriate validation and error checking.</p>
+
+<h3>End-user experience</h3>
+
+<p>For the end-user, executing an action that delegates work off to the <code>BackgroundService</code> raises the problem of how does the user know the work is complete?</p>
+
+<p>One option is for the background jobs to take responsibility to notify the user themselves.  In the above example, this would be the <code>submitInvoice()</code> method called upon each customer.  One could imagine more complex designs where only the final command executed notifies the user.</p>
+
+<p>However, an alternative is to rely on the fact that the <code>BackgroundService</code> will automatically hint that the <code>Command</code> representing the original interaction (to <code>submitCustomerInvoices()</code> in the example above) should be persisted.  This will be available if the related <code>CommandContext</code> and <code>CommandService</code> domain services are configured, and the <code>CommandService</code> supports persistent commands.  You can read more about <code>CommandContext</code> and <code>CommandService</code> <a href="./command-context.html">here</a>.</p>
+
+<p>Thus, the original action can run a query to obtain it corresponding <code>Command</code>, and return this to the user.  The child <code>Command</code>s created by the <code>BackgroundService</code> will then be associated with it.</p>
+
+<p>We could therefore refactor the method as follows:</p>
+
+<pre><code>public Command submitCustomerInvoices() {
+    for(Customer customer: customerRepository.findCustomersToInvoice()) {
+        backgroundService.execute(customer).submitInvoice();
+    }
+    return commandContext.getCommand();
+}
+</code></pre>
+
+<p>where <code>commandContext</code> field is the injected <code>CommandContext</code> domain service.</p>
+
+<h2>BackgroundCommandService</h2>
+
+<p>The <code>BackgroundCommandService</code> is a companion to the default <code>BackgroundServiceDefault</code> implementation, and takes responsibility for persisting the required action as a background command.</p>
+
+<p>Typically this service isn't called from domain classes, but it exists as a domain service so that it is pluggable.</p>
+
+<h3>API</h3>
+
+<p>The API of the <code>BackgroundCommandService</code> is:</p>
+
+<pre><code>public interface BackgroundCommandService {
+
+    public void schedule(
+            final ActionInvocationMemento aim, 
+            final Command command, 
+            final String targetClassName, final String targetActionName, final String targetArgs);
+
+}
+</code></pre>
+
+<p>where <code>ActionInvocationMemento</code> is a wrapper around a <a href="./memento-service.html">MementoService</a>'s <code>Memento</code>, capturing the details of an action invocation (for execution later on).</p>
+
+<p>For the record, the API of <code>ActionInvocationMemento</code> is:</p>
+
+<pre><code>public class ActionInvocationMemento {
+
+    public String getActionId() { ... }
+    public String getTargetClassName() { ... }
+    public String getTargetActionName() { ... }
+    public Bookmark getTarget() { ... }
+    public int getNumArgs() { ... }
+    public Class&lt;?&gt; getArgType(final int num) throws ClassNotFoundException { ... }
+    public &lt;T&gt; T getArg(final int num, final Class&lt;T&gt; type) { ... }
+
+    public String asMementoString() { ... }
+}
+</code></pre>
+
+<p>The <code>asMementoString()</code> method tehrefore lets the <code>BackgroundCommandService</code> implementation convert the action invocation into a simple string.</p>
+
+<h3>Implementation</h3>
+
+<p>The JDO object store provides the <a href="../../components/objectstores/jdo/background-command-service-jdo.html">BackgroundCommandServiceJdo</a> implementation that persists <code>Command</code>s to an RDBMS.</p>
+
+<h3>Usage</h3>
+
+<p>As noted above, this service isn't intended to be called from domain classes; rather it acts as a plug-in point to the default <code>BackgroundServiceDefault</code> service.</p>
+
+<h2>Related Services</h2>
+
+<p>These services are closely related to the <code>CommandContext</code> and <code>CommandService</code> services (both described [here]](./command-context.html)  services.  The <code>CommandContext</code> service is responsible for providing a parent <code>Command</code> with which the background <code>Command</code>s can then be associated as children, while the <code>CommandService</code> is responsible for persisting those parent <code>Command</code>s (analogous to the way in which the  <code>BackgroundCommandService</code> persists the child background <code>Command</code>s).</p>
+
+<p>The core framework provides default implementations of <code>CommandContext</code> and also <code>BackgroundService</code>, and there is very little reason to use any other implementation.</p>
+
+<p>The implementations of <code>CommandService</code> and <code>BackgroundCommandService</code> also go together; typically both parent <code>Command</code>s and child background <code>Command</code>s will be persisted in the same way.  The JDO objectstore provides implementations of both (<a href="../../components/objectstores/jdo/command-service-jdo.html">CommandServiceJdo</a> and <a href="../../components/objectstores/jdo/background-command-service-jdo.html">BackgroundCommandServiceJdo</a>).</p>
+
+<h2>BackgroundCommandExecution</h2>
+
+<p>The <code>BackgroundCommandExecution</code> (in isis-core) is an abstract template class provided by isis-core that defines an abstract hook method to obtain background <code>Command</code>s to be executed:</p>
+
+<pre><code>public abstract class BackgroundCommandExecution 
+                         extends AbstractIsisSessionTemplate {
+    ...
+    protected abstract List&lt;? extends Command&gt; findBackgroundCommandsToExecute();
+    ...
+}
+</code></pre>
+
+<p>The developer is required to implement this hook method in a subclass.</p>
+
+<p>If using the JDO implementation of <code>BackgroundCommandService</code>, then this subclass exists already, namely:</p>
+
+<ul>
+<li><code>org.apache.isis.objectstore.jdo.service.BackgroundCommandExecutionFromBackgroundCommandServiceJdo</code></li>
+</ul>
+
+<p>This returns all background <code>Command</code>s that are not yet started.</p>
+
+<h2>Quartz Scheduler Configuration</h2>
+
+<p>The last part of the puzzle is to actually run this class.  These could be run in a batch job overnight, or run continually by, say, the <a href="http://quartz-scheduler.org">Quartz</a> scheduler.  For the latter case, we want to define a Quartz cron job that will inherit the <code>execute(...)</code> method of <code>BackgroundCommandExecution</code> (inherited from <em>its</em> superclass, <code>AbstractIsisSessionTemplate</code>).</p>
+
+<p>The following does the trick:</p>
+
+<pre><code>import org.apache.isis.objectstore.jdo.service.BackgroundCommandExecutionFromBackgroundCommandServiceJdo;
+
+public class BackgroundCommandExecutionQuartzJob extends AbstractIsisQuartzJob {
+
+    public BackgroundCommandExecutionQuartzJob() {
+        super(new BackgroundCommandExecutionFromBackgroundCommandServiceJdo());   
+    }
+}
+</code></pre>
+
+<p>where <code>AbstractIsisQuartzJob</code> is the following boilerplate:</p>
+
+<pre><code>import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+...
+public class AbstractIsisQuartzJob implements Job {
+
+    public static enum ConcurrentInstancesPolicy {
+        SINGLE_INSTANCE_ONLY,
+        MULTIPLE_INSTANCES
+    }
+
+    private final AbstractIsisSessionTemplate isisRunnable;
+
+    private final ConcurrentInstancesPolicy concurrentInstancesPolicy;
+    private boolean executing;
+
+    public AbstractIsisQuartzJob(AbstractIsisSessionTemplate isisRunnable) {
+        this(isisRunnable, ConcurrentInstancesPolicy.SINGLE_INSTANCE_ONLY);
+    }
+    public AbstractIsisQuartzJob(
+            AbstractIsisSessionTemplate isisRunnable, 
+            ConcurrentInstancesPolicy concurrentInstancesPolicy) {
+        this.isisRunnable = isisRunnable;
+        this.concurrentInstancesPolicy = concurrentInstancesPolicy;
+    }
+
+    // //////////////////////////////////////
+
+    public void execute(final JobExecutionContext context) 
+            throws JobExecutionException {
+        final AuthenticationSession authSession = newAuthSession(context);
+        try {
+            if(concurrentInstancesPolicy == ConcurrentInstancesPolicy.SINGLE_INSTANCE_ONLY &amp;&amp; 
+               executing) {
+                return;
+            }
+            executing = true;
+
+            isisRunnable.execute(authSession, context);
+        } finally {
+            executing = false;
+        }
+    }
+
+    AuthenticationSession newAuthSession(JobExecutionContext context) {
+        String user = getKey(context, SchedulerConstants.USER_KEY);
+        String rolesStr = getKey(context, SchedulerConstants.ROLES_KEY);
+        String[] roles = Iterables.toArray(
+                Splitter.on(",").split(rolesStr), String.class);
+        return new SimpleSession(user, roles);
+    }
+
+    String getKey(JobExecutionContext context, String key) {
+        return context.getMergedJobDataMap().getString(key);
+    }
+}
+</code></pre>
+
+<p>This can be configured to run using Quartz' <code>quartz-config.xml</code> file:</p>
+
+<pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;job-scheduling-data
+    xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData 
+http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
+    version="1.8"&gt;
+
+    &lt;schedule&gt;
+        &lt;job&gt;
+            &lt;name&gt;BackgroundCommandExecutionJob&lt;/name&gt;
+            &lt;group&gt;Isis&lt;/group&gt;
+            &lt;description&gt;
+                Poll and execute any background actions persisted by the BackgroundActionServiceJdo domain service
+            &lt;/description&gt;
+            &lt;job-class&gt;webapp.scheduler.BackgroundCommandExecutionQuartzJob&lt;/job-class&gt;
+            &lt;job-data-map&gt;
+                &lt;entry&gt;
+                    &lt;key&gt;webapp.scheduler.user&lt;/key&gt;
+                    &lt;value&gt;scheduler_user&lt;/value&gt;
+                &lt;/entry&gt;
+                &lt;entry&gt;
+                    &lt;key&gt;webapp.scheduler.roles&lt;/key&gt;
+                    &lt;value&gt;admin_role&lt;/value&gt;
+                &lt;/entry&gt;
+            &lt;/job-data-map&gt;
+        &lt;/job&gt;
+
+        &lt;trigger&gt;
+            &lt;cron&gt;
+                &lt;name&gt;BackgroundCommandExecutionJobEveryTenSeconds&lt;/name&gt;
+                &lt;job-name&gt;BackgroundCommandExecutionJob&lt;/job-name&gt;
+                &lt;job-group&gt;Isis&lt;/job-group&gt;
+                &lt;cron-expression&gt;0/10 * * * * ?&lt;/cron-expression&gt;
+            &lt;/cron&gt;
+        &lt;/trigger&gt;
+    &lt;/schedule&gt;
+&lt;/job-scheduling-data&gt;
+</code></pre>
+
+<p>The remaining two pieces of configuration are the <code>quartz.properties</code> file:</p>
+
+<pre><code>org.quartz.scheduler.instanceName = SchedulerQuartzConfigXml
+org.quartz.threadPool.threadCount = 1
+org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
+org.quartz.plugin.jobInitializer.class =org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin 
+org.quartz.plugin.jobInitializer.fileNames = webapp/scheduler/quartz-config.xml 
+org.quartz.plugin.jobInitializer.failOnFileNotFound = true
+</code></pre>
+
+<p>and the entry in <code>web.xml</code> for the Quartz servlet:</p>
+
+<pre><code>&lt;servlet&gt;
+     &lt;servlet-name&gt;QuartzInitializer&lt;/servlet-name&gt;
+     &lt;servlet-class&gt;org.quartz.ee.servlet.QuartzInitializerServlet&lt;/servlet-class&gt;
+     &lt;init-param&gt;
+         &lt;param-name&gt;config-file&lt;/param-name&gt;
+         &lt;param-value&gt;webapp/scheduler/quartz.properties&lt;/param-value&gt;
+     &lt;/init-param&gt;
+     &lt;init-param&gt;
+         &lt;param-name&gt;shutdown-on-unload&lt;/param-name&gt;
+         &lt;param-value&gt;true&lt;/param-value&gt;
+     &lt;/init-param&gt;
+     &lt;init-param&gt;
+         &lt;param-name&gt;start-scheduler-on-load&lt;/param-name&gt;
+         &lt;param-value&gt;true&lt;/param-value&gt;
+     &lt;/init-param&gt;
+     &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
+ &lt;/servlet&gt;
+</code></pre>
+
+<p>All of this stuff is configured in the example todo app, found on github:</p>
+
+<ul>
+<li><a href="">BackgroundCommandExecutionQuartzJob</a></li>
+<li><a href="">AbstractIsisQuartzJob</a></li>
+<li><a href="">quartz-config.xml</a></li>
+<li><a href="">quartz.properties</a></li>
+<li><a href="">web.xml</a></li>
+</ul>
+
+<h2>Registering the Services</h2>
+
+<p>Register like any other service in <code>isis.properties</code>.  For example, if using the default implementation of <code>BackgroundService</code> and the JDO implementation of <code>BackgroundCommandService</code>, it would be:</p>
+
+<pre><code>isis.services=...,\
+              org.apache.isis.core.runtime.services.background.BackgroundServiceDefault,\
+              org.apache.isis.objectstore.jdo.applib.service.background.BackgroundCommandServiceJdo,\
+              org.apache.isis.objectstore.jdo.applib.service.background.BackgroundCommandServiceJdoRepository,\
+              org.apache.isis.objectstore.jdo.applib.service.background.BackgroundCommandServiceJdoContributions,\
+              ...
+</code></pre>
+
+<p>Note that the JDO implementation provides additional supporting <code>...Repository</code> and <code>...Contributions</code> services to query for and render background <code>Command</code>s.</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>

Added: websites/staging/isis/trunk/content/reference/services/bookmark-service.html
==============================================================================
--- websites/staging/isis/trunk/content/reference/services/bookmark-service.html (added)
+++ websites/staging/isis/trunk/content/reference/services/bookmark-service.html Mon Feb 10 21:28:21 2014
@@ -0,0 +1,369 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+
+    <meta charset="utf-8">
+      <title>Bookmark Service</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 */
+
+        .container {
+          width: 940px;
+        }
+
+        .markdown-content .documentation .span-one-third p {
+          margin-bottom: 0px;
+        }
+
+        .markdown-content .documentation .group {
+          margin-top: 9px;
+        }
+
+        .documentation .group h2 {
+          border-bottom: 1px solid #DDD
+        }
+        .documentation h2 a, .documentation h3 a {
+          /* 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;
+        }
+        
+    </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=Bookmark Service",
+                  '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><a href="./../../download.html">Download</a></li>
+          <li><a href="./../../documentation.html">Documentation</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="http://isisdemo.mmyco.co.uk/">Online Demo</a></li>
+            </ul>
+          </li>
+
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Support<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=">ML Archives</a></li>
+              <li><a href="https://issues.apache.org/jira/browse/ISIS">JIRA</a></li>
+              <li><a href="http://stackoverflow.com/questions/tagged/isis">Stack Overflow</a></li>
+              <li><a href="http://github.com/apache/isis">Github mirror</a></li>
+            </ul>
+          </li>
+
+          <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>
+          
+          <li class="dropdown  navbar-right">
+            <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>
+        </ul>
+
+      </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="./../../reference/about.html">Reference</a>&nbsp;&raquo&nbsp;<a href="./../../reference/services/about.html">Services</a></p>
+<h1>Bookmark Service
+
+</h1>
+</div>
+
+<p>The <code>BookmarkService</code> provides the ability to obtain a serializable <code>org.apache.isis.applib.bookmarks.Bookmark</code> for any (persisted) domain object, and to lookup domain objects given a <code>Bookmark</code>.</p>
+
+<p>This is a good way of storing a reference to an arbitrary object (a polymorphic relationship).  The downside is that there is no way for the objectstore (eg JDO objectstore) to enforce any kind of referental integrity.</p>
+
+<h3>API</h3>
+
+<p>The API defined by <code>BookmarkService</code> is:</p>
+
+<pre><code>@Named("Bookmarks")
+public interface BookmarkService {
+
+  @NotInServiceMenu
+  Object lookup(BookmarkHolder bookmarkHolder);
+
+  @Hidden
+  Object lookup(Bookmark bookmark);
+
+  @Hidden
+  Bookmark bookmarkFor(Object domainObject);
+}
+</code></pre>
+
+<p>If a domain class implements the <code>org.apache.isis.applib.bookmarks.BookmarkHolder</code> interface then the <code>BookmarkService</code> will appear as a contributed action.  Otherwise the service is hidden from view, intended to be injected into domain objects as a supporting domain service.</p>
+
+<h3>Usage within the framework</h3>
+
+<p>Bookmarks are used [1.4.0-SNAPSHOT onwards] by the <a href="./background-service.html">BackgroundCommandService</a>, which uses a bookmark to capture the target object on which an action will be invoked subsequently.</p>
+
+<p>Bookmarks are also used by the <a href="./publishing-service.html">PublishingService</a> and the <a href="./auditing-service.html">AuditingService</a>.</p>
+
+<h3>Implementations</h3>
+
+<p>The core framework provides a default implementation of this API:</p>
+
+<ul>
+<li><code>org.apache.isis.core.metamodel.services.bookmarks.BookmarkServiceDefault</code></li>
+</ul>
+
+<h3>Register the Service</h3>
+
+<p>Register this service like any other service, in <code>isis.properties</code>, eg:</p>
+
+<pre><code>isis.services=...,\
+              org.apache.isis.core.metamodel.services.bookmarks.BookmarkServiceDefault,\
+              ...
+</code></pre>
+
+
+
+      </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>

Added: websites/staging/isis/trunk/content/reference/services/bulk-interaction.html
==============================================================================
--- websites/staging/isis/trunk/content/reference/services/bulk-interaction.html (added)
+++ websites/staging/isis/trunk/content/reference/services/bulk-interaction.html Mon Feb 10 21:28:21 2014
@@ -0,0 +1,404 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+
+    <meta charset="utf-8">
+      <title>Bulk Interaction [1.4.0-SNAPSHOT]</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 */
+
+        .container {
+          width: 940px;
+        }
+
+        .markdown-content .documentation .span-one-third p {
+          margin-bottom: 0px;
+        }
+
+        .markdown-content .documentation .group {
+          margin-top: 9px;
+        }
+
+        .documentation .group h2 {
+          border-bottom: 1px solid #DDD
+        }
+        .documentation h2 a, .documentation h3 a {
+          /* 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;
+        }
+        
+    </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=Bulk Interaction [1.4.0-SNAPSHOT]",
+                  '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><a href="./../../download.html">Download</a></li>
+          <li><a href="./../../documentation.html">Documentation</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="http://isisdemo.mmyco.co.uk/">Online Demo</a></li>
+            </ul>
+          </li>
+
+          <li class="dropdown">
+            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Support<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=">ML Archives</a></li>
+              <li><a href="https://issues.apache.org/jira/browse/ISIS">JIRA</a></li>
+              <li><a href="http://stackoverflow.com/questions/tagged/isis">Stack Overflow</a></li>
+              <li><a href="http://github.com/apache/isis">Github mirror</a></li>
+            </ul>
+          </li>
+
+          <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>
+          
+          <li class="dropdown  navbar-right">
+            <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>
+        </ul>
+
+      </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="./../../reference/about.html">Reference</a>&nbsp;&raquo&nbsp;<a href="./../../reference/services/about.html">Services</a></p>
+<h1>Bulk Interaction [1.4.0-SNAPSHOT]
+
+</h1>
+</div>
+
+<blockquote>
+  <p>this is a stub, see <a href="https://issues.apache.org/jira/browse/ISIS-655">ISIS-655</a></p>
+</blockquote>
+
+<h3>API</h3>
+
+<pre><code>@RequestScoped
+public static class InteractionContext {
+
+    public static enum InvokedAs { BULK, REGULAR }
+
+    public InvokedAs getInvokedAs() { ... }
+
+    public List&lt;Object&gt; getDomainObjects() { ... }
+    public int getSize() { ... }
+    public int getIndex() { ... }
+    public boolean isFirst() { ... }
+    public boolean isLast() { ... }
+
+}
+
+
+
+    /**
+     * Whether this particular {@link InteractionContext} was applied as a {@link InvokedAs#BULK bulk} action 
+     * (against each domain object in a list of domain objects) or as a {@link InvokedAs#REGULAR regular} 
+     * action (against a single domain object).
+     */
+    @Programmatic
+
+
+    /**
+     * The list of domain objects which are being acted upon.
+     */
+
+
+    /**
+     * The 0-based index to the object being acted upon.
+     * 
+     * &lt;p&gt;
+     * Will be a value in range [0, {@link #getSize() size}).
+     */
+</code></pre>
+
+<h3>Usage</h3>
+
+<h3>Implementation</h3>
+
+<h3>Registering the Service</h3>
+
+<h3>Related Services</h3>
+
+<h3>Unit testing support</h3>
+
+<pre><code>@RequestScoped
+public static class InteractionContext {
+
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static InteractionContext regularAction(Object domainObject) {
+        return new InteractionContext(InvokedAs.REGULAR, Collections.singletonList(domainObject));
+    }
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static InteractionContext bulkAction(Object... domainObjects) {
+        return bulkAction(Arrays.asList(domainObjects));
+    }
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static InteractionContext bulkAction(List&lt;Object&gt; domainObjects) {
+        return new InteractionContext(InvokedAs.BULK, domainObjects);
+    }
+
+}
+</code></pre>
+
+
+
+      </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>