http://git-wip-us.apache.org/repos/asf/isis-site/blob/2f475bbf/content/versions/2.0.0-M1/guides/rgsvc/rgsvc.html
----------------------------------------------------------------------
diff --git a/content/versions/2.0.0-M1/guides/rgsvc/rgsvc.html 
b/content/versions/2.0.0-M1/guides/rgsvc/rgsvc.html
new file mode 100644
index 0000000..46e4eca
--- /dev/null
+++ b/content/versions/2.0.0-M1/guides/rgsvc/rgsvc.html
@@ -0,0 +1,10721 @@
+<!doctype html>
+<html>
+ <head> 
+  <!--
+        Licensed to the Apache Software Foundation (ASF) under one
+        or more contributor license agreements.  See the NOTICE file
+        distributed with this work for additional information
+        regarding copyright ownership.  The ASF licenses this file
+        to you under the Apache License, Version 2.0 (the
+        "License"); you may not use this file except in compliance
+        with the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+        Unless required by applicable law or agreed to in writing,
+        software distributed under the License is distributed on an
+        "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+        KIND, either express or implied.  See the License for the
+        specific language governing permissions and limitations
+        under the License.
+    --> 
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
+  <meta charset="utf-8"> 
+  <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
+  <!-- No caching headers --> 
+  <meta http-equiv="cache-control" content="no-cache"> 
+  <meta http-equiv="pragma" content="no-cache"> 
+  <meta http-equiv="expires" content="-1"> 
+  <title>Domain Services</title> 
+  <link rel="icon" type="image/png" href="../../images/isis-favicon.png"> 
+  <!--
+        Based on DataNucleus' template,
+        that was in turn based on an earlier version of Apache Isis' template,
+        that was in turn based on Apache Deltaspike's template.
+
+        This template uses
+        * Bootstrap v3.3.7 (https://getbootstrap.com/) for navbar.
+        * Bootstrap TOC plugin v0.4.1 (https://afeld.github.io/bootstrap-toc/)
+          for the table of contents.
+        * jQuery (necessary for Bootstrap's JavaScript plugins)
+        * Font-Awesome for some icons used by Asciidoctor
+
+        Also:
+        * Bootswatch "flatly" theme for Bootstrap 
(https://bootswatch.com/flatly).
+        * slick.js (carousel)
+        * add a link to all headers (home-grown, adapted from blog posts)
+        * integration of elasticlunr.js (home-grown, adapted from blog posts)
+    --> 
+  <link 
href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/flatly/bootstrap.min.css";
 rel="stylesheet"> 
+  <link href="../../css/bootstrap-toc/0.4.1/bootstrap-toc.min.css" 
rel="stylesheet"> 
+  <link href="../../css/asciidoctor/foundation.css" rel="stylesheet"> 
+  <link 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css";
 rel="stylesheet"> 
+  <link href="../../css/slick/1.5.0/slick.css" rel="stylesheet"> 
+  <link href="../../css/slick/1.5.0/slick-theme.css" rel="stylesheet"> 
+  <link href="../../css/search-panel/search-panel.css" rel="stylesheet"> 
+  <link href="../../css/header-links/header-links.css" rel="stylesheet"> 
+  <link href="../../css/sticky-header/sticky-header.css" rel="stylesheet"> 
+  <link href="../../css/customisations.css" rel="stylesheet"> 
+  <!-- Coderay syntax formatter --> 
+  <style type="text/css">
+        /* Stylesheet for CodeRay to match GitHub theme | MIT License | 
http://foundation.zurb.com */
+/*pre.CodeRay {background-color:#f7f7f8;}*/
+.CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
+.CodeRay 
span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
+.CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
+table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
+table.CodeRay td{vertical-align: top;line-height:1.45}
+table.CodeRay td.line-numbers{text-align:right}
+table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
+table.CodeRay td.code{padding:0 0 0 .5em}
+table.CodeRay td.code>pre{padding:0}
+.CodeRay .debug{color:#fff !important;background:#000080 !important}
+.CodeRay .annotation{color:#007}
+.CodeRay .attribute-name{color:#000080}
+.CodeRay .attribute-value{color:#700}
+.CodeRay .binary{color:#509}
+.CodeRay .comment{color:#998;font-style:italic}
+.CodeRay .char{color:#04d}
+.CodeRay .char .content{color:#04d}
+.CodeRay .char .delimiter{color:#039}
+.CodeRay .class{color:#458;font-weight:bold}
+.CodeRay .complex{color:#a08}
+.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
+.CodeRay .color{color:#099}
+.CodeRay .class-variable{color:#369}
+.CodeRay .decorator{color:#b0b}
+.CodeRay .definition{color:#099}
+.CodeRay .delimiter{color:#000}
+.CodeRay .doc{color:#970}
+.CodeRay .doctype{color:#34b}
+.CodeRay .doc-string{color:#d42}
+.CodeRay .escape{color:#666}
+.CodeRay .entity{color:#800}
+.CodeRay .error{color:#808}
+.CodeRay .exception{color:inherit}
+.CodeRay .filename{color:#099}
+.CodeRay .function{color:#900;font-weight:bold}
+.CodeRay .global-variable{color:#008080}
+.CodeRay .hex{color:#058}
+.CodeRay .integer,.CodeRay .float{color:#099}
+.CodeRay .include{color:#555}
+.CodeRay .inline{color:#000}
+.CodeRay .inline .inline{background:#ccc}
+.CodeRay .inline .inline .inline{background:#bbb}
+.CodeRay .inline .inline-delimiter{color:#d14}
+.CodeRay .inline-delimiter{color:#d14}
+.CodeRay .important{color:#555;font-weight:bold}
+.CodeRay .interpreted{color:#b2b}
+.CodeRay .instance-variable{color:#008080}
+.CodeRay .label{color:#970}
+.CodeRay .local-variable{color:#963}
+.CodeRay .octal{color:#40e}
+.CodeRay .predefined{color:#369}
+.CodeRay .preprocessor{color:#579}
+.CodeRay .pseudo-class{color:#555}
+.CodeRay .directive{font-weight:bold}
+.CodeRay .type{font-weight:bold}
+.CodeRay .predefined-type{color:inherit}
+.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
+.CodeRay .key{color:#808}
+.CodeRay .key .delimiter{color:#606}
+.CodeRay .key .char{color:#80f}
+.CodeRay .value{color:#088}
+.CodeRay .regexp .delimiter{color:#808}
+.CodeRay .regexp .content{color:#808}
+.CodeRay .regexp .modifier{color:#808}
+.CodeRay .regexp .char{color:#d14}
+.CodeRay .regexp .function{color:#404;font-weight:bold}
+.CodeRay .string{color:#d20}
+.CodeRay .string .string .string{background:#ffd0d0}
+.CodeRay .string .content{color:#d14}
+.CodeRay .string .char{color:#d14}
+.CodeRay .string .delimiter{color:#d14}
+.CodeRay .shell{color:#d14}
+.CodeRay .shell .delimiter{color:#d14}
+.CodeRay .symbol{color:#990073}
+.CodeRay .symbol .content{color:#a60}
+.CodeRay .symbol .delimiter{color:#630}
+.CodeRay .tag{color:#008080}
+.CodeRay .tag-special{color:#d70}
+.CodeRay .variable{color:#036}
+.CodeRay .insert{background:#afa}
+.CodeRay .delete{background:#faa}
+.CodeRay .change{color:#aaf;background:#007}
+.CodeRay .head{color:#f8f;background:#505}
+.CodeRay .insert .insert{color:#080}
+.CodeRay .delete .delete{color:#800}
+.CodeRay .change .change{color:#66f}
+.CodeRay .head .head{color:#f4f}
+    </style> 
+ </head> 
+ <body data-spy="scroll" data-target="#toc"> 
+  <div id="basedir" style="display:none;">
+   ../../
+  </div> 
+  <div id="docname" style="display:none;">
+   rgsvc
+  </div> 
+  <div id="filetype" style="display:none;">
+   html
+  </div> 
+  <!-- Navbar --> 
+  <nav class="navbar navbar-default navbar-static-top header"> 
+   <div class="container"> 
+    <div class="navbar-header"> 
+     <!-- Three line menu button for use on mobile screens --> 
+     <button type="button" class="navbar-toggle collapsed" 
data-toggle="collapse" data-target="#navbar" aria-expanded="false" 
aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span 
class="icon-bar"></span> <span class="icon-bar"></span> <span 
class="icon-bar"></span> </button> 
+     <a class="navbar-brand" href="../../index.html"> <img alt="Brand" 
src="../../images/isis-logo-48x48.png"> </a> 
+     <a class="navbar-brand" href="../../index.html">Apache Isis</a> 
+    </div> 
+    <!-- Navbar that will collapse on mobile screens --> 
+    <div id="navbar" class="navbar-collapse collapse"> 
+     <ul class="nav navbar-nav"> 
+      <li class="dropdown"> <a href="#" class="dropdown-toggle" 
data-toggle="dropdown" role="button" aria-haspopup="true" 
aria-expanded="false">Documentation<span class="caret"></span></a> 
+       <ul class="dropdown-menu"> 
+        <li><a href="../../documentation.html">Table of Contents</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li class="dropdown-header">User Guides</li> 
+        <li><a href="../../guides/ugfun/ugfun.html">Fundamentals</a></li> 
+        <li><a href="../../guides/ugvw/ugvw.html">Wicket Viewer</a></li> 
+        <li><a href="../../guides/ugvro/ugvro.html">Restful Objects 
Viewer</a></li> 
+        <li><a href="../../guides/ugodn/ugodn.html">DataNucleus Object 
Store</a></li> 
+        <li><a href="../../guides/ugsec/ugsec.html">Security</a></li> 
+        <li><a href="../../guides/ugtst/ugtst.html">Testing</a></li> 
+        <li><a href="../../guides/ugbtb/ugbtb.html">Beyond the Basics</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li class="dropdown-header">Reference Guides</li> 
+        <li><a href="../../guides/rgant/rgant.html">Annotations</a></li> 
+        <li><a href="../../guides/rgsvc/rgsvc.html">Domain Services</a></li> 
+        <li><a href="../../guides/rgcfg/rgcfg.html">Core Config' 
Properties</a></li> 
+        <li><a href="../../guides/rgcms/rgcms.html">Classes, Methods and 
Schema</a></li> 
+        <li><a href="../../guides/rgmvn/rgmvn.html">Maven plugin</a></li> 
+        <li><a href="../../guides/rgfis/rgfis.html">Framework Internal 
Services</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li class="dropdown-header">Javadoc</li> 
+        <li><a 
href="http://javadoc.io/doc/org.apache.isis.core/isis-core-applib";>Applib</a></li>
 
+       </ul> </li> 
+      <li class="dropdown  hidden-sm hidden-md"> <a href="#" 
class="dropdown-toggle" data-toggle="dropdown" role="button" 
aria-haspopup="true" aria-expanded="false">Downloads<span 
class="caret"></span></a> 
+       <ul class="dropdown-menu"> 
+        <li class="dropdown-header">Maven archetypes</li> 
+        <li><a 
href="../../guides/ugfun/ugfun.html#_ugfun_getting-started_helloworld-archetype">helloworld</a></li>
 
+        <li><a 
href="../../guides/ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">simpleapp</a></li>
 
+        <li role="separator" class="divider"></li> 
+        <li><a href="../../downloads.html">Downloads</a></li> 
+        <li><a href="../../release-notes/release-notes.html">Release 
Notes</a></li> 
+        <li><a href="../../migration-notes/migration-notes.html">Migration 
Notes</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li><a href="https://github.com/apache/isis";>Github mirror</a></li> 
+       </ul> </li> 
+      <li class="dropdown  hidden-sm"> <a href="#" class="dropdown-toggle" 
data-toggle="dropdown" role="button" aria-haspopup="true" 
aria-expanded="false">Support<span class="caret"></span></a> 
+       <ul class="dropdown-menu"> 
+        <li class="dropdown-header">Guides</li> 
+        <li><a href="../../guides/dg/dg.html">Developers' Guide</a></li> 
+        <li><a href="../../guides/cgcom/cgcom.html">Committers' Guide</a></li> 
+        <li><a href="../../guides/htg.html">Hints-n-Tips Guide</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li class="dropdown-header">Mailing Lists</li> 
+        <li><a href="../../support.html">How to subscribe</a></li> 
+        <li><a 
href="https://lists.apache.org/list.html?us...@isis.apache.org";>Archives (ASF 
Pony mail)</a></li> 
+        <li><a href="http://isis.markmail.org/search/?q=";>Archives 
(Markmail)</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li class="dropdown-header">Other Resources</li> 
+        <li><a href="https://issues.apache.org/jira/browse/ISIS";>ASF 
JIRA</a></li> 
+        <li><a href="https://stackoverflow.com/questions/tagged/isis";>Stack 
Overflow</a></li> 
+        <li><a href="../../help.html">Wiki, Fisheye etc.</a></li> 
+       </ul> </li> 
+      <li class="dropdown hidden-sm hidden-md"> <a href="#" 
class="dropdown-toggle" data-toggle="dropdown" role="button" 
aria-haspopup="true" aria-expanded="false">@ASF<span class="caret"></span></a> 
+       <ul class="dropdown-menu"> 
+        <li><a href="https://www.apache.org/";>Apache Homepage</a></li> 
+        <li><a 
href="https://www.apache.org/events/current-event";>Events</a></li> 
+        <li><a href="https://www.apache.org/licenses/";>Licenses</a></li> 
+        <li><a href="https://www.apache.org/security/";>Security</a></li> 
+        <li><a 
href="https://www.apache.org/foundation/sponsorship.html";>Sponsorship</a></li> 
+        <li><a 
href="https://www.apache.org/foundation/thanks.html";>Thanks</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li><a href="https://whimsy.apache.org/board/minutes/Isis.html";>PMC 
board minutes</a></li> 
+       </ul> </li> 
+     </ul> 
+     <div class="nav navbar-nav navbar-right"> 
+      <!-- 'style' added to fix height of input box. FIX THIS --> 
+      <form class="navbar-form" role="search" id="search-form" style="padding: 
1px 15px;"> 
+       <div class="form-group"> 
+        <input class="form-control" id="search-field" type="text" size="30" 
placeholder="Search"> 
+       </div> 
+      </form> 
+     </div> 
+     <p class="nav navbar-text navbar-right small">v2.0.0-M1</p> 
+    </div> 
+   </div> 
+  </nav> 
+  <div class="container"> 
+   <div class="row-fluid"> 
+    <div class="col-xs-12 col-sm-12 col-md-12 col-lg-9"> 
+     <div id="search-panel"> 
+      <div id="search-results"></div> 
+      <div> 
+       <br> 
+       <a href="#" id="search-results-clear">clear</a> 
+      </div> 
+     </div> 
+     <span class="pdf-link"><a href="rgsvc.pdf"><img 
src="../../images/PDF-50.png"></a></span> 
+     <div class="page-title"> 
+      <h1>Domain Services</h1> 
+     </div> 
+     <div id="doc-content">
+      <div class="btn-group" style="float: right; font-size: small; padding: 
6px;  ">
+       <button type="button" class="btn btn-xs btn-default" 
onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/rgsvc.adoc&quot;";><i
 class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+       <button type="button" class="btn btn-xs btn-default dropdown-toggle" 
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span 
class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+       <ul class="dropdown-menu">
+        <li><a 
href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/rgsvc.adoc";
 target="_blank"><i class="fa fa-pencil-square-o fa-fw" 
aria-hidden="true"></i>&nbsp; Edit</a></li>
+        <li><a 
href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/rgsvc.adoc";
 target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; 
History</a></li>
+        <li><a 
href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/rgsvc.adoc";
 target="_blank"><i class="fa fa-file-text-o fa-fw" 
aria-hidden="true"></i>&nbsp; Raw</a></li>
+        <li><a 
href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/rgsvc.adoc";
 target="_blank"><i class="fa fa-hand-o-right fa-fw" 
aria-hidden="true"></i>&nbsp; Blame</a></li>
+       </ul>
+      </div> 
+      <div class="sect1"> 
+       <h2 id="__rgsvc">1. Domain Services</h2> 
+       <div class="sectionbody"> 
+        <div class="paragraph"> 
+         <p>This guide documents Apache Isis' domain services, both those that 
act as an API (implemented by the framework for your domain objects to call), 
and those domain services that act as an SPI (implemented by your domain 
application and which are called by the framework).</p> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="_other_guides">1.1. Other Guides</h3> 
+         <div class="paragraph"> 
+          <p>Apache Isis documentation is broken out into a number of user, 
reference and "supporting procedures" guides.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The user guides available are:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p><a href="../ugfun/ugfun.html">Fundamentals</a></p> </li> 
+           <li> <p><a href="../ugvw/ugvw.html">Wicket viewer</a></p> </li> 
+           <li> <p><a href="../ugvro/ugvro.html">Restful Objects 
viewer</a></p> </li> 
+           <li> <p><a href="../ugodn/ugodn.html">DataNucleus object 
store</a></p> </li> 
+           <li> <p><a href="../ugsec/ugsec.html">Security</a></p> </li> 
+           <li> <p><a href="../ugtst/ugtst.html">Testing</a></p> </li> 
+           <li> <p><a href="../ugbtb/ugbtb.html">Beyond the Basics</a></p> 
</li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The reference guides are:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p><a href="../rgant/rgant.html">Annotations</a></p> </li> 
+           <li> <p><a href="../rgsvc/rgsvc.html">Domain Services</a> (this 
guide)</p> </li> 
+           <li> <p><a href="../rgcfg/rgcfg.html">Configuration 
Properties</a></p> </li> 
+           <li> <p><a href="../rgcms/rgcms.html">Classes, Methods and 
Schema</a></p> </li> 
+           <li> <p><a href="../rgmvn/rgmvn.html">Apache Isis Maven 
plugin</a></p> </li> 
+           <li> <p><a href="../rgfis/rgfis.html">Framework Internal 
Services</a></p> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The remaining guides are:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p><a href="../dg/dg.html">Developers' Guide</a> (how to set 
up a development environment for Apache Isis and contribute back to the 
project)</p> </li> 
+           <li> <p><a href="../cgcom/cgcom.html">Committers' Guide</a> 
(release procedures and related practices)</p> </li> 
+          </ul> 
+         </div> 
+        </div> 
+       </div> 
+      </div> 
+      <div class="sect1"> 
+       <h2 id="_rgsvc_intro">2. Introduction</h2>
+       <div class="btn-group" style="float: right; font-size: small; padding: 
6px; margin-top: -55px; ">
+        <button type="button" class="btn btn-xs btn-default" 
onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_intro.adoc&quot;";><i
 class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+        <button type="button" class="btn btn-xs btn-default dropdown-toggle" 
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span 
class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+        <ul class="dropdown-menu">
+         <li><a 
href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_intro.adoc";
 target="_blank"><i class="fa fa-pencil-square-o fa-fw" 
aria-hidden="true"></i>&nbsp; Edit</a></li>
+         <li><a 
href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_intro.adoc";
 target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; 
History</a></li>
+         <li><a 
href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_intro.adoc";
 target="_blank"><i class="fa fa-file-text-o fa-fw" 
aria-hidden="true"></i>&nbsp; Raw</a></li>
+         <li><a 
href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_intro.adoc";
 target="_blank"><i class="fa fa-hand-o-right fa-fw" 
aria-hidden="true"></i>&nbsp; Blame</a></li>
+        </ul>
+       </div> 
+       <div class="sectionbody"> 
+        <div class="sect2"> 
+         <h3 id="__rgsvc_intro_types-of-domain-services">2.1. Types of Domain 
Service</h3> 
+         <div class="paragraph"> 
+          <p>The domain services also group into various broad categories. 
Many support functionality of the various layers of the system (presentation 
layer, application layer, core domain, persistence layer); others exist to 
allow the domain objects to integrate with other bounded contexts, or provide 
various metadata (eg for development-time tooling). The diagram below shows 
these categories:</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" 
href="images/reference-services/categories.png"><img 
src="images/reference-services/categories.png" alt="categories" 
width="600px"></a> 
+          </div> 
+         </div> 
+         <div class="paragraph"> 
+          <p>A small number of domain services can be considered both API and 
SPI; a good example is the <a 
href="../rgsvc/rgsvc.html#_rgsvc_integration-api_EmailService"><code>EmailService</code></a>
 that is of direct use for domain objects wishing to send out emails, but is 
also used by the framework to support the <a 
href="../ugvw/ugvw.html#_ugvw_features_user-registration">user registration</a> 
functionality supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>. 
The same is true of the <a 
href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService"><code>EventBusService</code></a>;
 this can be used by domain objects to broadcast arbitrary events, but is also 
used by the framework to automatically emit events for <a 
href="../rgant/rgant.html#_rgant-Action_domainEvent"><code>@Action#domainEvent()</code></a>
 etc.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>For these hybrid services we have categorized the service as an 
"API" service. This chapter therefore contains only the strictly SPI 
services.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>This rest of this guide is broken out into several chapters, one 
for each of the various types/categories of domain service.</p> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="__rgsvc_intro_public-api">2.2. Public API vs Internal 
Services</h3> 
+         <div class="paragraph"> 
+          <p>The vast majority of Apache Isis' domain services are defined in 
Apache Isis' applib (<code>o.a.i.core:isis-core-applib</code> module) as 
stable, public classes. Importantly, this also minimizes the coupling between 
your code and Apache Isis, allowing you to easily mock out these services in 
your unit tests.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The framework also defines a number of "internal" services. These 
are not part of the framework’s formal API, in that they use classes that are 
outside of the applib. These internal framework services should be thought of 
as part of the internal design of the framework, and are liable to change from 
release to release. The internal framework services are documented in the <a 
href="../rgfis/rgfis.html">Framework Internal Services</a> guide.</p> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="__rgsvc_intro_using-the-services">2.3. Using the 
services</h3> 
+         <div class="paragraph"> 
+          <p>Apache Isis includes an extensive number of domain services for 
your domain objects to use; simply define the service as an annotated field and 
Apache Isis will inject the service into your object.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>For example:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="java"><span 
class="directive">public</span> <span class="type">class</span> <span 
class="class">Customer</span> {
+
+    <span class="directive">public</span> <span class="type">void</span> 
sendEmail( <span class="predefined-type">String</span> subject, <span 
class="predefined-type">String</span> body) {
+        <span class="predefined-type">List</span>&lt;<span 
class="predefined-type">String</span>&gt; cc = <span 
class="predefined-type">Collections</span>.emptyList;
+        <span class="predefined-type">List</span>&lt;<span 
class="predefined-type">String</span>&gt; bcc = <span 
class="predefined-type">Collections</span>.emptyList;
+        emailService.send(getEmailAddress(), cc, bcc, subject, body);
+    }
+    <span class="directive">public</span> <span class="type">boolean</span> 
hideSendEmail() {
+        <span class="keyword">return</span> !emailService.isConfigured();
+    }
+
+    <span class="annotation">@Inject</span>                                    
                        <i class="conum" data-value="1"></i><b>(1)</b>
+    EmailService emailService;
+}</code></pre> 
+          </div> 
+         </div> 
+         <div class="colist arabic"> 
+          <table> 
+           <tbody>
+            <tr> 
+             <td><i class="conum" data-value="1"></i><b>1</b></td> 
+             <td>Service automatically injected by the framework.</td> 
+            </tr> 
+           </tbody>
+          </table> 
+         </div> 
+         <div class="paragraph"> 
+          <p>For objects that are already persisted, the service is 
automatically injected just after the object is rehydrated by 
JDO/DataNucleus.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>For transient objects (instantiated programmatically), the <a 
href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryService</code></a>'s
 <code>instantiate()</code> method (or the deprecated <a 
href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer"><code>DomainObjectContainer</code></a>'s
 <code>newTransientInstance()</code> method) will automatically inject the 
services.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Alternatively the object can be instantiated simply using 
<code>new</code>, then services injected using <a 
href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_ServiceRegistry"><code>ServiceRegistry</code></a>'s
 <code>injectServicesInto(…​)</code> method (or the deprecated <a 
href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer"><code>DomainObjectContainer</code></a>'s
 <code>injectServicesInto(…​)</code> method).</p> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="__rgsvc_intro_overriding-the-services">2.4. Overriding the 
services</h3> 
+         <div class="paragraph"> 
+          <p>The framework provides default implementations for many of the 
domain services. This is convenient, but sometimes you will want to replace the 
default implementation with your own service implementation.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The trick is to use the <a 
href="../rgant/rgant.html#_rgant-DomainServiceLayout_menuOrder"><code>@DomainServiceLayout#menuOrder()</code></a>
 attribute, specifying a low number (typically <code>"1"</code>).</p> 
+         </div> 
+         <div class="admonitionblock note"> 
+          <table> 
+           <tbody>
+            <tr> 
+             <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
+             <td class="content"> 
+              <div class="paragraph"> 
+               <p>For a small number of domain services, all implementations 
are used (following the chain-of-responsibility pattern), not just the first 
one. The services in question are: <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_ContentMappingService"><code>ContentMappingService</code></a>,
 <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_GridSystemService"><code>GridSystemService</code></a>,
 and <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_RoutingService"><code>RoutingService</code></a>.</p>
 
+              </div> </td> 
+            </tr> 
+           </tbody>
+          </table> 
+         </div> 
+         <div class="paragraph"> 
+          <p>For example, suppose you wanted to provide your own 
implementation of <a 
href="../rgsvc/rgsvc.html#_rgsvc_api_LocaleProvider"><code>LocaleProvider</code></a>.
 Here’s how:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="java"><span 
class="annotation">@DomainService</span>(
+        nature = NatureOfService.DOMAIN
+)
+<span class="annotation">@DomainServiceLayout</span>(
+        menuOrder = <span class="string"><span class="delimiter">"</span><span 
class="content">1</span><span class="delimiter">"</span></span>                 
            <i class="conum" data-value="1"></i><b>(1)</b>
+)
+<span class="directive">public</span> <span class="type">class</span> <span 
class="class">MyLocaleProvider</span> <span class="directive">implements</span> 
LocaleProvider {
+    <span class="annotation">@Override</span>
+    <span class="directive">public</span> <span 
class="predefined-type">Locale</span> getLocale() {
+        <span class="keyword">return</span> ...
+    }
+}</code></pre> 
+          </div> 
+         </div> 
+         <div class="colist arabic"> 
+          <table> 
+           <tbody>
+            <tr> 
+             <td><i class="conum" data-value="1"></i><b>1</b></td> 
+             <td>takes precedence over the default implementation.</td> 
+            </tr> 
+           </tbody>
+          </table> 
+         </div> 
+         <div class="paragraph"> 
+          <p>It’s also quite common to want to decorate the existing 
implementation (ie have your own implementation delegate to the default); this 
is also possible and quite easy (if using <code>1.10.0</code> or later). The 
idea is to have the framework inject all implementations of the service, and 
then to delegate to the first one that isn’t "this" one:</p> 
+         </div> 
+         <div class="listingblock"> 
+          <div class="content"> 
+           <pre class="CodeRay highlight"><code data-lang="java"><span 
class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN)
+<span class="annotation">@DomainServiceLayout</span>(
+        menuOrder = <span class="string"><span class="delimiter">"</span><span 
class="content">1</span><span class="delimiter">"</span></span>                 
                                                <i class="conum" 
data-value="1"></i><b>(1)</b>
+)
+<span class="directive">public</span> <span class="type">class</span> <span 
class="class">MyLocaleProvider</span> <span class="directive">implements</span> 
LocaleProvider {
+    <span class="annotation">@Override</span>
+    <span class="directive">public</span> <span 
class="predefined-type">Locale</span> getLocale() {
+        <span class="keyword">return</span> 
getDelegateLocaleProvider().getLocale();                                 <i 
class="conum" data-value="2"></i><b>(2)</b>
+    }
+    <span class="directive">private</span> LocaleProvider 
getDelegateLocaleProvider() {
+        <span class="keyword">return</span> Iterables.tryFind(localeProviders, 
input -&gt; input != <span class="local-variable">this</span>).orNull();     <i 
class="conum" data-value="3"></i><b>(3)</b>
+    }
+    <span class="annotation">@Inject</span>
+    <span class="predefined-type">List</span>&lt;LocaleProvider&gt; 
localeProviders;                                               <i class="conum" 
data-value="4"></i><b>(4)</b>
+}</code></pre> 
+          </div> 
+         </div> 
+         <div class="colist arabic"> 
+          <table> 
+           <tbody>
+            <tr> 
+             <td><i class="conum" data-value="1"></i><b>1</b></td> 
+             <td>takes precedence over the default implementation when 
injected elsewhere.</td> 
+            </tr> 
+            <tr> 
+             <td><i class="conum" data-value="2"></i><b>2</b></td> 
+             <td>this implementation merely delegates to the default 
implementation</td> 
+            </tr> 
+            <tr> 
+             <td><i class="conum" data-value="3"></i><b>3</b></td> 
+             <td>find the first implementation that isn’t <em>this</em> 
implementation (else infinite loop!)</td> 
+            </tr> 
+            <tr> 
+             <td><i class="conum" data-value="4"></i><b>4</b></td> 
+             <td>injects all implementations, including this 
implemenation</td> 
+            </tr> 
+           </tbody>
+          </table> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The above code could be improved by caching the 
delegateLocaleProvider once located (rather than searching each time).</p> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="__rgsvc_intro_commands-and-events">2.5. Command and 
Events</h3> 
+         <div class="paragraph"> 
+          <p>A good number of the domain services manage the execution of 
action invocations/property edits, along with the state of domain objects that 
are modified as a result of these. These services capture information which can 
then be used for various purposes, most notably for auditing or for publishing 
events, or for deferring execution such that the execution be performed in the 
background at some later date.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>The diagram below shows how these services fit together. The 
outline boxes are services while the coloured boxes represent data structures - 
defined in the applib and therefore accessible to domain applications - which 
hold various information about the executions.</p> 
+         </div> 
+         <div class="imageblock"> 
+          <div class="content"> 
+           <a class="image" 
href="images/reference-services/commands-and-events.png"><img 
src="images/reference-services/commands-and-events.png" alt="commands and 
events" width="960px"></a> 
+          </div> 
+         </div> 
+         <div class="paragraph"> 
+          <p>To explain:</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p>the (request-scoped) <a 
href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_CommandContext"><code>CommandContext</code></a>
 captures the user’s intention to invoke an action or edit a property; this 
is held by the <code>Command</code> object.</p> </li> 
+           <li> <p>if a <a 
href="../rgsvc/rgsvc.html#_rgsvc_application-layer-spi_CommandService"><code>CommandService</code></a>
 has been configured, then this will be used to create the <code>Command</code> 
object implementation, generally so that it can then also be persisted.</p> 
+            <div class="paragraph"> 
+             <p>If the action or property is annotated to be invoked in the 
background (using <a 
href="../rgant/rgant.html#_rgant-Action_command"><code>@Action#command…​()</code></a>
 or <a 
href="../rgant/rgant.html#_rgant-Property_command"><code>@Property#command…​()</code></a>)
 then no further work is done. But, if the action/property is to be executed in 
the foreground, then the interaction continues.</p> 
+            </div> </li> 
+           <li> <p>the (request-scoped) <a 
href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_InteractionContext"><code>InteractionContext</code></a>
 domain service acts as a factory for the <code>Interaction</code> object, 
which keeps track of the call-graph of executions 
(<code>Interaction.Execution</code>) of either action invocations or property 
edits. In the majority of cases there is likely to be just a single top-level 
node of this graph, but for applications that use the <a 
href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a>
 extensively each successive call results in a new child execution.</p> </li> 
+           <li> <p>before and after each action invocation/property edit, a <a 
href="../rgcms/rgcms.html#_rgcms_classes_domainevent">domain event</a> is may 
be broadcast to all subscribers. Whether this occurs depends on whether the 
action/property has been annotated (using <a 
href="../rgant/rgant.html#_rgant-Action_domainEvent"><code>@Action#domainEvent()</code></a>
 or <a 
href="../rgant/rgant.html#_rgant-Property_domainEvent"><code>@Property#domainEvent()</code></a>).</p>
 
+            <div class="paragraph"> 
+             <p>(Note that susbcribers will also receive events for vetoing 
the action/property; this is not shown on the diagram).</p> 
+            </div> </li> 
+           <li> <p>As each execution progresses, and objects that are modified 
are "enlisted" into the (internal) <a 
href="../rgfis/rgfis.html#_rgfis_persistence-layer_ChangedObjectsServiceInternal"><code>ChangedObjectsServiceInternal</code></a>
 domain service. Metrics as to which objects are merely loaded into memory are 
also captured using the <a 
href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-api_MetricsService"><code>MetricsService</code></a>
 (not shown on the diagram).</p> </li> 
+           <li> <p>At the end of each execution, details of that execution are 
published through the (internal) <a 
href="../rgfis/rgfis.html#_rgfis_spi_PublisherServiceInternal"><code>PublisherServiceInternal</code></a>
 domain service. This is only done for actions/properties annotated appropriate 
(with <a 
href="../rgant/rgant.html#_rgant-Action_publishing"><code>@Action#publishing()</code></a>
 or <a 
href="../rgant/rgant.html#_rgant-Property_publishing"><code>@Property#publishing()</code></a>).</p>
 
+            <div class="paragraph"> 
+             <p>The internal service delegates in turn to any registered <a 
href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-spi_PublisherService"><code>PublisherService</code></a>s
 (there may be more than one).</p> 
+            </div> </li> 
+           <li> <p>At the end of each transaction, details of all changed 
objects are published, again through the (internal) <a 
href="../rgfis/rgfis.html#_rgfis_spi_PublisherServiceInternal"><code>PublisherServiceInternal</code></a>
 to any registered <code>PublisherService</code> implementations. Only domain 
objects specified to be published with <a 
href="../rgant/rgant.html#_rgant-DomainObject_publishing"><code>@DomainObject#publishing()</code></a>
 are published.<br></p> 
+            <div class="admonitionblock note"> 
+             <table> 
+              <tbody>
+               <tr> 
+                <td class="icon"> <i class="fa icon-note" title="Note"></i> 
</td> 
+                <td class="content"> 
+                 <div class="paragraph"> 
+                  <p>Note that it’s possible for there to be more than one 
transaction per top-level interaction, by virtue of the <a 
href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_TransactionService"><code>TransactionService</code></a>.</p>
 
+                 </div> </td> 
+               </tr> 
+              </tbody>
+             </table> 
+            </div> </li> 
+           <li> <p>Also at the end of each transaction, details of all changed 
properties are passed to any registered <a 
href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-spi_AuditerService"><code>AuditerService</code></a>(s)
 by way of the (internal) <a 
href="../rgfis/rgfis.html#_rgfis_persistence-layer_AuditingServiceInternal"><code>AuditingServiceInternal</code></a>
 domain service.</p> </li> 
+          </ul> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Implementations of <a 
href="../rgsvc/rgsvc.html#_rgsvc_application-layer-spi_CommandService"><code>CommandService</code></a>
 can use the <code>Command#getMemento()</code> method to obtain a XML 
equivalent of that <code>Command</code>, reified using the <a 
href="../rgcms/rgcms.html#_rgcms_schema-cmd"><code>cmd.xsd</code></a> schema. 
This can be converted back into a <code>CommandDto</code> using the 
<code>CommandDtoUtils</code> utility class (part of the applib).</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Similarly, implementations of <a 
href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-spi_PublisherService"><code>PublisherService</code></a>
 can use the <code>InteractionDtoUtils</code> utility class to obtain a 
<code>InteractionDto</code> representing the interaction, either just for a 
single execution or for the entire call-graph. This can be converted into XML 
in a similar fashion.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>Likewise, the <code>PublishedObjects</code> class passed to the 
<code>PublisherService</code> at the end of the interaction provides the 
<code>PublishedObjects#getDto()</code> method which returns a 
<code>ChangesDto</code> instance. This can be converted into XML using the 
<code>ChangesDtoUtils</code> utility class.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>One final point: multiple <a 
href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-spi_PublisherService"><code>PublisherService</code></a>
 implementations are supported because different implementations may have 
different responsibilities. For example, the (non-ASF) <a 
href="http://platform.incode.org"; target="_blank">Incode Platform</a>'s 
publishmq module is responsible for publishing messages onto an ActiveMQ event 
bus, for inter-system communication. However, the SPI can also be used for 
profiling; each execution within the call-graph contains metrics of the number 
of objects loaded or modified as a result of that execution, and thus could be 
used for application profiling. The framework provides a default 
<code>PublisherServiceLogging</code> implementation that logs this using 
SLF4J.</p> 
+         </div> 
+        </div> 
+       </div> 
+      </div> 
+      <div class="sect1"> 
+       <h2 id="_rgsvc_presentation-layer-api">3. Presentation Layer API</h2>
+       <div class="btn-group" style="float: right; font-size: small; padding: 
6px; margin-top: -55px; ">
+        <button type="button" class="btn btn-xs btn-default" 
onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api.adoc&quot;";><i
 class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+        <button type="button" class="btn btn-xs btn-default dropdown-toggle" 
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span 
class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+        <ul class="dropdown-menu">
+         <li><a 
href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api.adoc";
 target="_blank"><i class="fa fa-pencil-square-o fa-fw" 
aria-hidden="true"></i>&nbsp; Edit</a></li>
+         <li><a 
href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api.adoc";
 target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; 
History</a></li>
+         <li><a 
href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api.adoc";
 target="_blank"><i class="fa fa-file-text-o fa-fw" 
aria-hidden="true"></i>&nbsp; Raw</a></li>
+         <li><a 
href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api.adoc";
 target="_blank"><i class="fa fa-hand-o-right fa-fw" 
aria-hidden="true"></i>&nbsp; Blame</a></li>
+        </ul>
+       </div> 
+       <div class="sectionbody"> 
+        <div class="paragraph"> 
+         <p>Domain service APIs for the presentation layer allow the domain 
objects to control aspects of the user interface. The implementations are 
specific to the particular viewer (<a href="../ugvw/ugvw.html">Wicket 
viewer</a> or <a href="../ugvro/ugvro.html">Restful Objects viewer</a>) so the 
domain code must guard against them being unavailable in some cases.</p> 
+        </div> 
+        <div class="paragraph"> 
+         <p>The table below summarizes the presentation layer APIs defined by 
Apache Isis. It also lists their corresponding implementation.</p> 
+        </div> 
+        <table class="tableblock frame-all grid-all spread"> 
+         <caption class="title">
+          Table 1. Presentation Layer API
+         </caption> 
+         <colgroup> 
+          <col style="width: 25%;"> 
+          <col style="width: 50%;"> 
+          <col style="width: 12.5%;"> 
+          <col style="width: 12.5%;"> 
+         </colgroup> 
+         <thead> 
+          <tr> 
+           <th class="tableblock halign-left valign-top">API</th> 
+           <th class="tableblock halign-left valign-top">Description</th> 
+           <th class="tableblock halign-left valign-top">Implementation</th> 
+           <th class="tableblock halign-left valign-top">Notes</th> 
+          </tr> 
+         </thead> 
+         <tbody> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-api_AcceptHeaderService"><code>o.a.i.applib.</code><br>
 <code>services.acceptheader</code><br> 
<code>AcceptHeaderService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Request-scoped access to HTTP Accept headers.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>AcceptHeaderServiceDefault</code><br> 
<code>o.a.i.core</code><br> 
<code>isis-core-viewer-restfulobjects-rendering</code></p></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">Implementation only usable within the <a 
href="../ugvro/ugvro.html">Restful Objects viewer</a>.</p></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-api_BookmarkUiService"><code>o.a.i.applib.</code><br>
 <code>services.bookmarkui</code><br> 
<code>BookmarkUiService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Manage bookmarks and breadcrumbs in the (Wicket) UI.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>BookmarkUiServiceWicket</code><br> 
<code>o.a.i.core</code><br> <code>isis-core-viewer-wicket-impl</code></p></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">(Implementation only usable within the <a 
href="../ugvw/ugvw.html">Wicket viewer</a>.</p></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-api_DeepLinkService"><code>o.a.i.applib</code><br>
 <code>services.deeplink</code><br> <code>DeepLinkService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Obtain a URL to a domain object (eg for use within an email 
or report)</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>DeepLinkServiceWicket</code><br> 
<code>o.a.i.viewer</code><br> 
<code>isis-core-viewer-wicket-impl</code></p></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">Implementation only usable within the <a 
href="../ugvw/ugvw.html">Wicket viewer</a>.</p></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-api_GuiceBeanProvider"><code>o.a.i.applib.</code><br>
 <code>services.guice</code><br> <code>GuiceBeanProvider</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Access to internal framework services initialized using Guice 
DI.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>GuiceBeanProviderWicket</code><br> 
<code>o.a.i.core</code><br> <code>isis-core-viewer-wicket-impl</code></p></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">Implementation only usable within the <a 
href="../ugvw/ugvw.html">Wicket viewer</a>.</p></td> 
+          </tr> 
+         </tbody> 
+        </table> 
+        <div class="paragraph"> 
+         <p>Key:</p> 
+        </div> 
+        <div class="ulist"> 
+         <ul> 
+          <li> <p><code>o.a.i</code> is an abbreviation for 
<code>org.apache.isis</code></p> </li> 
+          <li> <p><code>o.ia.m</code> is an abbreviation for 
<code>org.isisaddons.module</code></p> </li> 
+          <li> <p><code>o.a.i.c.m.s</code> is an abbreviation for 
<code>org.apache.isis.core.metamodel.services</code></p> </li> 
+          <li> <p><code>o.a.i.c.r.s</code> is an abbreviation for 
<code>org.apache.isis.core.runtime.services</code></p> </li> 
+         </ul> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="_rgsvc_presentation-layer-api_AcceptHeaderService">3.1. 
<code>AcceptHeaderService</code></h3>
+         <div class="btn-group" style="float: right; font-size: small; 
padding: 6px; margin-top: -55px; ">
+          <button type="button" class="btn btn-xs btn-default" 
onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api_AcceptHeaderService.adoc&quot;";><i
 class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+          <button type="button" class="btn btn-xs btn-default dropdown-toggle" 
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span 
class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+          <ul class="dropdown-menu">
+           <li><a 
href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api_AcceptHeaderService.adoc";
 target="_blank"><i class="fa fa-pencil-square-o fa-fw" 
aria-hidden="true"></i>&nbsp; Edit</a></li>
+           <li><a 
href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api_AcceptHeaderService.adoc";
 target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; 
History</a></li>
+           <li><a 
href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api_AcceptHeaderService.adoc";
 target="_blank"><i class="fa fa-file-text-o fa-fw" 
aria-hidden="true"></i>&nbsp; Raw</a></li>
+           <li><a 
href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-api_AcceptHeaderService.adoc";
 target="_blank"><i class="fa fa-hand-o-right fa-fw" 
aria-hidden="true"></i>&nbsp; Blame</a></li>
+          </ul>
+         </div> 
+         <div class="paragraph"> 
+          <p>The <code>AcceptHeaderService</code> domain service is a <a 
href="../rgant/rgant.html#_rgant-RequestScoped"><code>@RequestScoped</code></a> 
service that simply exposes the HTTP <code>Accept</code> header to the domain. 
Its intended use is to support multiple versions of a REST API, where the 
responsibility for content negotiation (determining which version of the REST 
API is to be used) is managed by logic in the domain objects themselves.</p> 
+         </div> 
+         <div class="admonitionblock note"> 
+          <table> 
+           <tbody>
+            <tr> 
+             <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
+             <td class="content"> 
+              <div class="paragraph"> 
+               <p>As an alternative to performing content negotiation within 
the domain classes, the <a 
href="../rgfis/rgfis.html#_rgfis_presentation-layer_ContentNegotiationService"><code>ContentNegotiationService</code></a>
 and <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_ContentMappingService"><code>ContentMappingService</code></a>
 SPI domain services allow the framework to perform the content negotiation 
responsibility.</p> 
+              </div> </td> 
+            </tr> 
+           </tbody>
+          </table> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_api_implementation">3.1.1. API &amp; Implementation</h4> 
+          <div class="paragraph"> 
+           <p>The API defined by the service is:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="annotation">@DomainService</span>(nature = NatureOfService.DOMAIN)
+<span class="annotation">@RequestScoped</span>                                 
     <i class="conum" data-value="1"></i><b>(1)</b>
+<span class="directive">public</span> <span class="type">interface</span> 
<span class="class">AcceptHeaderService</span> {
+    <span class="annotation">@Programmatic</span>
+    <span class="predefined-type">List</span>&lt;MediaType&gt; 
getAcceptableMediaTypes();      <i class="conum" data-value="2"></i><b>(2)</b>
+}</code></pre> 
+           </div> 
+          </div> 
+          <div class="colist arabic"> 
+           <table> 
+            <tbody>
+             <tr> 
+              <td><i class="conum" data-value="1"></i><b>1</b></td> 
+              <td>is <a 
href="../rgant/rgant.html#_rgant-RequestScoped"><code>@RequestScoped</code></a>,
 so this domain service instance is scoped to a particular request and is then 
destroyed</td> 
+             </tr> 
+             <tr> 
+              <td><i class="conum" data-value="2"></i><b>2</b></td> 
+              <td>returns the list of media types found in the HTTP Accept 
header.</td> 
+             </tr> 
+            </tbody>
+           </table> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The default implementation is provided by 
<code>o.a.i.v.ro.rendering.service.acceptheader.AcceptHeaderServiceForRest</code>.</p>
 
+          </div> 
+          <div class="admonitionblock note"> 
+           <table> 
+            <tbody>
+             <tr> 
+              <td class="icon"> <i class="fa icon-note" title="Note"></i> 
</td> 
+              <td class="content"> 
+               <div class="paragraph"> 
+                <p>Note that the service will only return a list when the 
request is initiated through the <a href="../ugvro/ugvro.html">Restful Objects 
viewer</a>. Otherwise the service will return <code>null</code>.</p> 
+               </div> </td> 
+             </tr> 
+            </tbody>
+           </table> 
+          </div> 
+          <div class="paragraph"> 
+           <p>To use an alternative implementation, use <a 
href="../rgant/rgant.html#_rgant-DomainServiceLayout_menuOrder"><code>@DomainServiceLayout#menuOrder()</code></a>
 (as explained in the <a 
href="../rgsvc/rgsvc.html#__rgsvc_intro_overriding-the-services">introduction</a>
 to this guide).</p> 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_usage">3.1.2. Usage</h4> 
+          <div class="paragraph"> 
+           <p>The intended use of this service is where there are multiple 
concurrent versions of a REST API, for backward compatibility of existing 
clients. The <code>AcceptHeaderService</code> allows the responsibility for 
content negotiation (determining which version of the REST API is to be used) 
to be performed by logic in the domain objects themselves.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The diagram below illustrated this:</p> 
+          </div> 
+          <div class="imageblock"> 
+           <div class="content"> 
+            <a class="image" 
href="images/reference-services-api/acceptheaderservice.png"><img 
src="images/reference-services-api/acceptheaderservice.png" 
alt="acceptheaderservice" width="700px"></a> 
+           </div> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The REST request is submitted to a domain service with a <a 
href="../rgant/rgant.html#_rgant-DomainService_nature">nature</a> of 
<code>VIEW_REST_ONLY</code> (<code>MyRestApi</code> in the diagram). This uses 
the <code>AcceptHeaderService</code> to obtain the values of the HTTP 
<code>Accept</code> header. Based on this it delegates to the appropriate 
underlying domain service (with a nature of <code>DOMAIN</code> so that they 
are not exposed in the REST API at all).</p> 
+          </div> 
+          <div class="admonitionblock tip"> 
+           <table> 
+            <tbody>
+             <tr> 
+              <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
+              <td class="content"> 
+               <div class="paragraph"> 
+                <p>The service does not define any conventions as to the 
format of the media types. The option is to use the media type’s 
type/subtype, eg <code>application/vnd.myrestapi-v1+json</code>; an alternative 
is to use a media type parameter as a hint, eg 
<code>application/json;x-my-rest-api-version=1</code> (where 
<code>x-my-rest-api-version</code> is the media type parameter).</p> 
+               </div> 
+               <div class="paragraph"> 
+                <p>The Restful Objects specification does this something 
similar with its own <code>x-ro-domain-type</code> media type parameter; this 
is used by the <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_ContentMappingService"><code>ContentMappingService</code></a>
 to determine how to map domain objects to view models/DTOs.</p> 
+               </div> </td> 
+             </tr> 
+            </tbody>
+           </table> 
+          </div> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="_rgsvc_presentation-api_BookmarkUiService">3.2. 
<code>BookmarkUiService</code></h3> 
+         <div class="paragraph"> 
+          <p>The <code>BookmarkUiService</code> provides the ability to 
programmatically interact with bookmarked pages and breadcrumbs, as rendered by 
the Wicket viewer.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>One possible use case is programmatically to support multiple 
"contexts" and allow the end-user to switch from one context to another.</p> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_api_implementation_2">3.2.1. API &amp; Implementation</h4> 
+          <div class="paragraph"> 
+           <p>The API defined by <code>BookmarkUiService</code> is:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="directive">public</span> <span class="type">interface</span> <span 
class="class">BookmarkUiService</span> {
+    <span class="type">void</span> clear();   <i class="conum" 
data-value="1"></i><b>(1)</b>
+}</code></pre> 
+           </div> 
+          </div> 
+          <div class="colist arabic"> 
+           <table> 
+            <tbody>
+             <tr> 
+              <td><i class="conum" data-value="1"></i><b>1</b></td> 
+              <td>Simply clears the current list of breadcrumbs and 
bookmarks.</td> 
+             </tr> 
+            </tbody>
+           </table> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The <a href="../ugvw/ugvw.html">Wicket viewer</a> provides an 
implementation of this service, 
<code>o.a.i.viewer.wicket.viewer.services.BookmarkUiServiceWicket</code>.</p> 
+          </div> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="_rgsvc_presentation-api_DeepLinkService">3.3. 
<code>DeepLinkService</code></h3> 
+         <div class="paragraph"> 
+          <p>The <code>DeepLinkService</code> provides the ability to obtain a 
<code>java.net.URI</code> that links to a representation of any (persisted) 
domain entity or view model.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>A typical use case is to generate a clickable link for rendering 
in an email, PDF, tweet or other communication.</p> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_api_implementation_3">3.3.1. API &amp; Implementation</h4> 
+          <div class="paragraph"> 
+           <p>The API defined by <code>DeepLinkService</code> is:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="directive">public</span> <span class="type">interface</span> <span 
class="class">DeepLinkService</span> {
+    <span class="predefined-type">URI</span> deepLinkFor(<span 
class="predefined-type">Object</span> domainObject); <i class="conum" 
data-value="1"></i><b>(1)</b>
+}</code></pre> 
+           </div> 
+          </div> 
+          <div class="colist arabic"> 
+           <table> 
+            <tbody>
+             <tr> 
+              <td><i class="conum" data-value="1"></i><b>1</b></td> 
+              <td>Creates a URI that can be used to obtain a representation of 
the provided domain object in one of the Apache Isis viewers.</td> 
+             </tr> 
+            </tbody>
+           </table> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The <a href="../ugvw/ugvw.html">Wicket viewer</a> provides an 
implementation of this service 
<code>o.a.i.viewer.wicket.viewer.services.DeepLinkServiceWicket</code>.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>For the <a href="../ugvro/ugvro.html">RestfulObjects viewer</a>, 
a URL can be constructed according to the <a 
href="http://www.restfulobjects.org";>Restful Objects spec</a> in conjunction 
with a <code>Bookmark</code> obtained via the <a 
href="../rgsvc/rgsvc.html#_rgsvc_integration-api_BookmarkService"><code>BookmarkService</code></a>.</p>
 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_usage_within_the_framework">3.3.2. Usage within the 
framework</h4> 
+          <div class="paragraph"> 
+           <p>The <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_EmailNotificationService"><code>EmailNotificationService</code></a>
 uses this service in order to generate emails as part of <a 
href="../ugvw/ugvw.html#_ugvw_features_user-registration">user 
registration</a>.</p> 
+          </div> 
+         </div> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="_rgsvc_presentation-api_GuiceBeanProvider">3.4. 
<code>GuiceBeanProvider</code></h3> 
+         <div class="paragraph"> 
+          <p>The <code>GuiceBeanProvider</code> domain service acts as a 
bridge between Apache Isis' <a href="../ugvw/ugvw.html">Wicket viewer</a> 
internal bootstrapping using <a href="https://github.com/google/guice";>Google 
Guice</a>.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>This service operates at a very low-level, and you are unlikely 
to have a need for it. It is used internally by the framework, in the default 
implementation of the <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-api_DeepLinkService"><code>DeepLinkService</code></a>.</p>
 
+         </div> 
+         <div class="admonitionblock note"> 
+          <table> 
+           <tbody>
+            <tr> 
+             <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
+             <td class="content"> 
+              <div class="paragraph"> 
+               <p>Currently Apache Isis uses a combination of Guice (within 
the Wicket viewer only) and a home-grown dependency injection framework. In 
future versions we intended to refactor the framework to use CDI throughout. At 
that time this service is likely to become redundant because we will allow any 
of the internal components of Apache Isis to be injected into your domain 
object code.</p> 
+              </div> </td> 
+            </tr> 
+           </tbody>
+          </table> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_api_implementation_4">3.4.1. API &amp; Implementation</h4> 
+          <div class="paragraph"> 
+           <p>The API defined by this service is:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="directive">public</span> <span class="type">interface</span> <span 
class="class">GuiceBeanProvider</span> {
+    <span class="annotation">@Programmatic</span>
+    &lt;T&gt; T lookup(<span class="predefined-type">Class</span>&lt;T&gt; 
beanType);
+    <span class="annotation">@Programmatic</span>
+    &lt;T&gt; T lookup(<span class="predefined-type">Class</span>&lt;T&gt; 
beanType, <span class="directive">final</span> <span 
class="predefined-type">Annotation</span> qualifier);
+}</code></pre> 
+           </div> 
+          </div> 
+          <div class="paragraph"> 
+           <p>The <a href="../ugvw/ugvw.html">Wicket viewer</a> this provides 
a default implementation of this service.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>To use an alternative implementation, implement the 
<code>GuideBeanProvider</code> interface and use <a 
href="../rgant/rgant.html#_rgant-DomainServiceLayout_menuOrder"><code>@DomainServiceLayout#menuOrder()</code></a>
 (as explained in the <a 
href="../rgsvc/rgsvc.html#__rgsvc_intro_overriding-the-services">introduction</a>
 to this guide).</p> 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_usage_2">3.4.2. Usage</h4> 
+          <div class="paragraph"> 
+           <p>Using the <a href="../ugvw/ugvw.html">Wicket viewer</a> requires 
subclassing of <code>IsisWicketApplication</code>. In the subclass it is 
commonplace to override <code>newIsisWicketModule()</code>, for example:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="annotation">@Override</span>
+<span class="directive">protected</span> Module newIsisWicketModule() {
+    <span class="directive">final</span> Module isisDefaults = <span 
class="local-variable">super</span>.newIsisWicketModule();
+    <span class="directive">final</span> Module overrides = <span 
class="keyword">new</span> AbstractModule() {
+        <span class="annotation">@Override</span>
+        <span class="directive">protected</span> <span 
class="type">void</span> configure() {
+            bind(<span 
class="predefined-type">String</span>.class).annotatedWith(Names.named(<span 
class="string"><span class="delimiter">"</span><span 
class="content">applicationName</span><span class="delimiter">"</span></span>))
+                              .toInstance(<span class="string"><span 
class="delimiter">"</span><span class="content">ToDo App</span><span 
class="delimiter">"</span></span>);
+            bind(<span 
class="predefined-type">String</span>.class).annotatedWith(Names.named(<span 
class="string"><span class="delimiter">"</span><span 
class="content">applicationCss</span><span class="delimiter">"</span></span>))
+                              .toInstance(<span class="string"><span 
class="delimiter">"</span><span class="content">css/application.css</span><span 
class="delimiter">"</span></span>);
+            bind(<span 
class="predefined-type">String</span>.class).annotatedWith(Names.named(<span 
class="string"><span class="delimiter">"</span><span 
class="content">applicationJs</span><span class="delimiter">"</span></span>))
+                              .toInstance(<span class="string"><span 
class="delimiter">"</span><span 
class="content">scripts/application.js</span><span 
class="delimiter">"</span></span>);
+            ...
+        }
+    };
+    <span class="keyword">return</span> 
Modules.override(isisDefaults).with(overrides);
+}</code></pre> 
+           </div> 
+          </div> 
+          <div class="paragraph"> 
+           <p>This "module" is in fact a Guice module, and so the 
<code>GuiceBeanProvider</code> service can be used to lookup any of the 
components bound into it.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>For example:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="directive">public</span> <span class="type">class</span> <span 
class="class">SomeDomainObject</span> {
+    <span class="directive">private</span> <span 
class="predefined-type">String</span> lookupApplicationName() {
+        <span class="keyword">return</span> guiceBeanProvider.lookup(<span 
class="predefined-type">String</span>.class, Names.named(<span 
class="string"><span class="delimiter">"</span><span 
class="content">applicationName</span><span class="delimiter">"</span></span>));
+    }
+    <span class="annotation">@Inject</span>
+    GuiceBeanProvider guiceBeanProvider;
+}</code></pre> 
+           </div> 
+          </div> 
+          <div class="paragraph"> 
+           <p>should return "ToDo App".</p> 
+          </div> 
+         </div> 
+        </div> 
+       </div> 
+      </div> 
+      <div class="sect1"> 
+       <h2 id="_rgsvc_presentation-layer-spi">4. Presentation Layer SPI</h2>
+       <div class="btn-group" style="float: right; font-size: small; padding: 
6px; margin-top: -55px; ">
+        <button type="button" class="btn btn-xs btn-default" 
onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi.adoc&quot;";><i
 class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+        <button type="button" class="btn btn-xs btn-default dropdown-toggle" 
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span 
class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+        <ul class="dropdown-menu">
+         <li><a 
href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi.adoc";
 target="_blank"><i class="fa fa-pencil-square-o fa-fw" 
aria-hidden="true"></i>&nbsp; Edit</a></li>
+         <li><a 
href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi.adoc";
 target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; 
History</a></li>
+         <li><a 
href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi.adoc";
 target="_blank"><i class="fa fa-file-text-o fa-fw" 
aria-hidden="true"></i>&nbsp; Raw</a></li>
+         <li><a 
href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi.adoc";
 target="_blank"><i class="fa fa-hand-o-right fa-fw" 
aria-hidden="true"></i>&nbsp; Blame</a></li>
+        </ul>
+       </div> 
+       <div class="sectionbody"> 
+        <div class="paragraph"> 
+         <p>Domain service SPIs for the presentation layer influence how the 
Apache Isis viewers behave.</p> 
+        </div> 
+        <div class="paragraph"> 
+         <p>The table below summarizes the presentation layer SPIs defined by 
Apache Isis. It also lists their corresponding implementation, either a default 
implementation provided by Apache Isis itself, or provided by one of the 
(non-ASF) <a href="http://platform.incode.org"; target="_blank">Incode 
Platform</a> modules.</p> 
+        </div> 
+        <table class="tableblock frame-all grid-all spread"> 
+         <caption class="title">
+          Table 2. Presentation Layer SPI
+         </caption> 
+         <colgroup> 
+          <col style="width: 25%;"> 
+          <col style="width: 50%;"> 
+          <col style="width: 12.5%;"> 
+          <col style="width: 12.5%;"> 
+         </colgroup> 
+         <thead> 
+          <tr> 
+           <th class="tableblock halign-left valign-top">SPI</th> 
+           <th class="tableblock halign-left valign-top">Description</th> 
+           <th class="tableblock halign-left valign-top">Implementation</th> 
+           <th class="tableblock halign-left valign-top">Notes</th> 
+          </tr> 
+         </thead> 
+         <tbody> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_ContentMappingService"><code>o.a.i.applb.</code><br>
 <code>services.conmap</code><br> 
<code>ContentMappingService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>(Attempt to) map the returned data into the representation 
required by the client’s HTTP <code>Accept</code> header.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">Replaces (and simplifies) the earlier 
<code>ContentMappingService</code> that defined an SPI using classes internal 
to the framework.<br> + No default implementation.</p></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_EmailNotificationService"><code>o.a.i.applib.</code><br>
 <code>services.userreg</code><br> 
<code>EmailNotificationService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Notify a user during <a 
href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-spi_UserRegistrationService">self-registration</a>
 of users.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>EmailNotificationService-</code><br> 
<code>Default</code><br> <code>o.a.i.core</code><br> 
<code>isis-core-runtime</code></p></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">depends on:<br> a configured 
<code>EmailService</code></p></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_ErrorReportingService"><code>o.a.i.applib.</code><br>
 <code>services.error</code><br> 
<code>ErrorReportingService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Record details of an error occurring in the system (eg in an 
external incident recording system such as JIRA), and return a more friendly 
(jargon-free) message to display to the end user, with optional reference (eg 
<code>XXX-1234</code>).</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">(none)</p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_ExceptionRecognizer"><code>o.a.i.applib.</code><br>
 <code>services.exceprecog</code><br> 
<code>ExceptionRecognizer</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Convert certain exceptions (eg foreign or unique key 
violation in the database) into a format that can be rendered to the 
end-user.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>ExceptionRecognizer-</code><br> 
<code>CompositeFor-</code><br> <code>JdoObjectStore</code><br> 
<code>o.a.i.core</code><br> <code>isis-core-applib</code></p></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">Extensible using composite pattern if required</p></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_GridSystemService"><code>o.a.i.applib.</code><br>
 <code>services.grid</code><br> <code>GridSystemService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Validates and normalizes the grid layout for a domain class 
(with respect to a particular grid system such as Bootstrap3), also providing a 
default grid (for those domain classes where there is no grid layout).</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>GridSystemServiceBS3</code><br> 
<code>o.a.i.core</code><br> <code>isis-core-metamodel</code></p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_GridLoaderService"><code>o.a.i.applib.</code><br>
 <code>services.grid</code><br> <code>GridLoaderService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Responsible for loading a grid layout for a domain class, eg 
from a <code>layout.xml</code> file.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>GridLoaderServiceDefault</code><br> 
<code>o.a.i.core</code><br> <code>isis-core-metamodel</code></p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_GridService"><code>o.a.i.applib.</code><br>
 <code>services.grid</code><br> <code>GridService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>A facade on top of both <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_GridLoaderService"><code>GridLoaderService</code></a>
 and <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_GridSystemService"><code>GridSystemService</code></a>,
 thus being able to return normalized grids for any domain class.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>GridServiceDefault</code><br> 
<code>o.a.i.core</code><br> <code>isis-core-metamodel</code></p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_HintStore"><code>o.a.i.applib.</code><br>
 <code>services.hint</code><br> <code>HintStore</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Stores UI hints on a per-object basis. For example, the 
viewer remembers which tabs are selected, and for collections which view is 
selected (eg table or hidden), which page of a table to render, or whether 
"show all" (rows) is toggled.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>HintStoreUsingWicketSession</code><br> 
<code>o.a.i.viewer</code><br> <code>isis-viewer-wicket-impl</code></p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_LocaleProvider"><code>o.a.i.applib.</code><br>
 <code>services.i18n</code><br> <code>LocaleProvider</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Request-scoped service to return the locale of the current 
user, in support of i18n (ie so that the app’s UI, messages and exceptions 
can be translated to the required locale by the <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_TranslationService"><code>TranslationService</code></a>.</p>
 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>LocaleProviderWicket</code><br> 
<code>o.a.i.viewer</code><br> <code>isis-viewer-wicket-impl</code></p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_RoutingService"><code>o.a.i.applib.</code><br>
 <code>services.routing</code><br> <code>RoutingService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Return an alternative object than that returned by an 
action.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>RoutingServiceDefault</code><br> 
<code>o.a.i.core</code><br> <code>isis-core-applib</code></p></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">The default implementation will return the home page (per <a 
href="../rgsvc/rgsvc.html#_rgsvc_application-layer-spi_HomePageProviderService"><code>HomePageProviderService</code></a>)
 if a void or null is returned.<br> Used by the <a 
href="../ugvw/ugvw.html">Wicket viewer</a> only.</p></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_TableColumnOrderService"><code>o.a.i.applib.</code><br>
 <code>services.tablecol</code><br> <code>TableColumn-</code><br> 
<code>OrderService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Allows the columns of a parented or standalone table to be 
reordered, based upon the parent object, collection id and type of object in 
the collection..</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>TableColumn-</code><br> 
<code>OrderService.Default</code><br> <code>o.a.i.core</code><br> 
<code>isis-core-applib</code></p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_TranslationService"><code>o.a.i.applib.</code><br>
 <code>services.i18n</code><br> <code>TranslationService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Translate an app’s UI, messages and exceptions for the 
current user (as per the locale provided by <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_LocaleProvider"><code>LocalProvider</code></a>.</p>
 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>TranslationServicePo</code><br> 
<code>o.a.i.core</code><br> <code>isis-core-runtime</code></p></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock">related services: <code>TranslationServicePoMenu</code><br> 
depends on:<br> <code>TranslationsResolver</code>, 
<code>LocaleProvider</code></p></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_TranslationsResolver"><code>o.a.i.applib.</code><br>
 <code>services.i18n</code><br> <code>TranslationsResolver</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Obtain translations for a particuar phrase and locale, in 
support of i18n (ie so that the app’s UI, messages and exceptions can be 
translated to the required locale by the <a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_TranslationService"><code>TranslationService</code></a></p>
 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>TranslationsResolverWicket</code><br> 
<code>o.a.i.viewer</code><br> <code>isis-viewer-wicket-impl</code></p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_UrlEncodingService"><code>o.a.i.applib.</code><br>
 <code>services.urlencoding</code><br> 
<code>UrlEncodingService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Converts strings into a form safe for use within a URL. Used 
to convert view models mementos into usable URL form.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><code>UrlEncodingService</code><br> 
<code>UsingBaseEncoding</code><br> <code>o.a.i.applib</code><br> 
<code>isis-core-applib</code></p></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+          <tr> 
+           <td class="tableblock halign-left valign-top"><p 
class="tableblock"><a 
href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_UserProfileService"><code>o.a.i.applib.</code><br>
 <code>services.userprof</code><br> 
<code>UserProfileService</code></a></p></td> 
+           <td class="tableblock halign-left valign-top">
+            <div>
+             <div class="paragraph"> 
+              <p>Obtain an alternative (usually enriched/customized) name for 
the current user, to render in the UI.</p> 
+             </div>
+            </div></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+           <td class="tableblock halign-left valign-top"></td> 
+          </tr> 
+         </tbody> 
+        </table> 
+        <div class="paragraph"> 
+         <p>Key:</p> 
+        </div> 
+        <div class="ulist"> 
+         <ul> 
+          <li> <p><code>o.a.i</code> is an abbreviation for 
<code>org.apache.isis</code></p> </li> 
+          <li> <p><code>o.ia.m</code> is an abbreviation for 
<code>org.isisaddons.module</code></p> </li> 
+          <li> <p><code>o.a.i.c.m.s</code> is an abbreviation for 
<code>org.apache.isis.core.metamodel.services</code></p> </li> 
+          <li> <p><code>o.a.i.c.r.s</code> is an abbreviation for 
<code>org.apache.isis.core.runtime.services</code></p> </li> 
+         </ul> 
+        </div> 
+        <div class="sect2"> 
+         <h3 id="_rgsvc_presentation-layer-spi_ContentMappingService">4.1. 
<code>ContentMappingService</code></h3>
+         <div class="btn-group" style="float: right; font-size: small; 
padding: 6px; margin-top: -55px; ">
+          <button type="button" class="btn btn-xs btn-default" 
onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_ContentMappingService.adoc&quot;";><i
 class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+          <button type="button" class="btn btn-xs btn-default dropdown-toggle" 
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span 
class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+          <ul class="dropdown-menu">
+           <li><a 
href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_ContentMappingService.adoc";
 target="_blank"><i class="fa fa-pencil-square-o fa-fw" 
aria-hidden="true"></i>&nbsp; Edit</a></li>
+           <li><a 
href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/rgsvc/_rgsvc_presentation-layer-spi_ContentMappingService.adoc";
 target="_blank"><i class

<TRUNCATED>

Reply via email to