You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/03/08 00:00:19 UTC

[21/44] isis-site git commit: ISIS-1594: provide an 'edit' button

http://git-wip-us.apache.org/repos/asf/isis-site/blob/83a3755a/content/guides/ugfun.html
----------------------------------------------------------------------
diff --git a/content/guides/ugfun.html b/content/guides/ugfun.html
index 4025855..f1610ad 100644
--- a/content/guides/ugfun.html
+++ b/content/guides/ugfun.html
@@ -1,12 +1,10 @@
 <!doctype html>
 <html class="no-js" lang="en">
-<head>
-    <meta charset="utf-8"/>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
-
-    <title>Fundamentals</title>
-
-    <!--
+ <head> 
+  <meta charset="utf-8"> 
+  <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
+  <title>Fundamentals</title> 
+  <!--
         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
@@ -23,31 +21,21 @@
         KIND, either express or implied.  See the License for the
         specific language governing permissions and limitations
         under the License.
-    -->
-
-    <!-- No caching headers -->
-    <meta http-equiv="cache-control" content="no-cache" />
-    <meta http-equiv="pragma" content="no-cache" />
-    <meta http-equiv="expires" content="-1" />
-
-
-    <!-- TODO: need to (re)instate CDN in the future (not using for now just so can develop off-line -->
-    <link href="../css/foundation/5.5.1/foundation.css" rel="stylesheet" />
-    <script src="../js/foundation/5.5.1/vendor/modernizr.js"></script>
-    <link href="../css/asciidoctor/colony.css" rel="stylesheet">
-    <link href="../css/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
-
-
-
-
-    <link href="../css/github-fork-ribbon-css/0.1.1/gh-fork-ribbon.css" rel="stylesheet" />
-    <!--[if lt IE 9]>
+    --> 
+  <!-- No caching headers --> 
+  <meta http-equiv="cache-control" content="no-cache"> 
+  <meta http-equiv="pragma" content="no-cache"> 
+  <meta http-equiv="expires" content="-1"> 
+  <!-- TODO: need to (re)instate CDN in the future (not using for now just so can develop off-line --> 
+  <link href="../css/foundation/5.5.1/foundation.css" rel="stylesheet"> 
+  <script src="../js/foundation/5.5.1/vendor/modernizr.js"></script> 
+  <link href="../css/asciidoctor/colony.css" rel="stylesheet"> 
+  <link href="../css/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet"> 
+  <link href="../css/github-fork-ribbon-css/0.1.1/gh-fork-ribbon.css" rel="stylesheet"> 
+  <!--[if lt IE 9]>
       <link href="../css/github-fork-ribbon-css/0.1.1/gh-fork-ribbon.ie.css" rel="stylesheet" />
-    <![endif]-->
-
-
-
-    <style type="text/css">
+    <![endif]--> 
+  <style type="text/css">
         pre code {
             background-color: inherit;
             border-style: none;
@@ -192,9 +180,8 @@ table.CodeRay td.code>pre{padding:0}
         color:#fff;
         font-size: 1.1em;
     }
-    </style>
-
-    <style>
+    </style> 
+  <style>
         @media only screen and (min-width: 40.063em) {
           .top-bar {
             .contain-to-grid .top-bar {
@@ -205,9 +192,8 @@ table.CodeRay td.code>pre{padding:0}
         .row {
             max-width: 80rem;
         }
-    </style>
-
-    <style>
+    </style> 
+  <style>
         .extended-quote,
         .extended-quote-first {
             margin-left: 40px;
@@ -231,9 +217,8 @@ table.CodeRay td.code>pre{padding:0}
             text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
         }
         
-    </style>
-
-    <style>
+    </style> 
+  <style>
         body {
           position: relative;
         }
@@ -255,6 +240,7 @@ table.CodeRay td.code>pre{padding:0}
 
         div#doc-content {
             margin-top: 30px;
+            padding-top: 30px;
         }
 
         div.documentation-page table.frame-all {
@@ -286,9 +272,8 @@ table.CodeRay td.code>pre{padding:0}
             min-height: 2000px;
         }
 
-    </style>
-
-    <style>
+    </style> 
+  <style>
 
         @media only screen and (min-width: 768px) {
           #toc.toc2 ul ul { margin-left: -10px; }
@@ -316,15 +301,13 @@ table.CodeRay td.code>pre{padding:0}
         body div#toc2 li.tocify-item.active a {
             color: red;
         }
-    </style>
-
-    <style>
+    </style> 
+  <style>
         footer {
             margin-top: 1000px;
         }
-    </style>
-
-    <style>
+    </style> 
+  <style>
         /* overriding colony.css stylesheet */
         .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] {
            /*padding: 1.25em 1.5625em 1.125em 1.5625em;*/
@@ -372,9 +355,8 @@ table.CodeRay td.code>pre{padding:0}
         .imageblock img {
             margin-bottom: 10px;
         }
-    </style>
-
-    <style>
+    </style> 
+  <style>
         /* from http://ben.balter.com/2014/03/13/pages-anchor-links/ */
         .header-link {
           position: absolute;
@@ -395,9 +377,8 @@ table.CodeRay td.code>pre{padding:0}
         h6:hover .header-link {
           opacity: 1;
         }
-    </style>
-
-    <style>
+    </style> 
+  <style>
         .top-bar
         {
             -webkit-transition-duration: .5s;
@@ -425,1843 +406,1485 @@ table.CodeRay td.code>pre{padding:0}
             -webkit-transition-property: -webkit-transform;
             transition-property: transform;
         }
-    </style>
-
-    <style>
+    </style> 
+  <style>
         #doc-content a.guide {
             color: white;
         }
-    </style>
-
-    <style>
+    </style> 
+  <style>
+        .tocify {
+            margin-top: 80px;
+        }
+    </style> 
+  <style>
         .tocify {
             margin-top: 80px;
         }
-    </style>
-
-
-</script>
-
-</head>
-<body>
-
-<<div class="github-fork-ribbon-wrapper right" style="position: fixed;">
-    <div class="github-fork-ribbon">
-        <a href="https://github.com/apache/isis#fork-destination-box">Fork me on GitHub</a>
-    </div>
-</div>
-
-
-<div class="row">
-
-    <div class="fixed contain-to-grid header">
-        <nav class="top-bar" data-topbar role="navigation" style="max-width: 80rem">
-            <ul class="title-area">
-                <li class="name">
-                    <h1>
-                        <a href="/index.html">Apache Isis&trade;</a>
-                    </h1>
-                </li>
-                <!-- Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone -->
-                <li class="toggle-topbar menu-icon"><a href="#"><span>Menu</span></a></li>
-            </ul>
-
-            <section class="top-bar-section">
-                <ul class="right">
-
-                    <li class="has-form">
-                       <FORM class="searchbox navbar-form navbar-right" id="searchbox_012614087480249044419:dn-q5gtwxya" action="http://www.google.com/cse">
-                        <div class="row collapse">
-                            <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>
-
-                </ul>
-
-                <!-- Left Nav Section -->
-                <ul class="left">
-
-                    <li><a href="/documentation.html">Documentation</a></li>
-                    <li><a href="/downloads.html">Downloads</a></li>
-                    <li><a href="/help.html">Help</a></li>
-                    <li><a href="/asf.html">@ASF</a></li>
-
-                </ul>
-
-            </section>
-        </nav>
-    </div>
-</div>
-
-<div class="row">
-
-    <div id="doc-content-left" class="large-9 medium-9 columns">
-
-
-        <div id="doc-content">
-          <div class="sect1">
-<h2 id="_ugfun">1. Fundamentals</h2>
-<div class="sectionbody">
-<div class="paragraph">
-<p>This guide introduces the <a href="#_ugfun_core-concepts">core concepts</a> and ideas behind Apache Isis,
-and tells you how to <a href="#_ugfun_getting-started">get started</a> with a Maven archetype.</p>
-</div>
-<div class="paragraph">
-<p>It also describes a number of <a href="#_ugfun_how-tos">how-to</a>s, describes how to influence the
-<a href="#_ugfun_object-layout">UI layout</a> of your domain objects (this is ultimately just a type of metadata), and it
- catalogues various <a href="#_ugfun_faqs.adoc">FAQ</a>s.</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="#">Fundamentals</a> (this guide)</p>
-</li>
-<li>
-<p><a href="ugvw.html">Wicket viewer</a></p>
-</li>
-<li>
-<p><a href="ugvro.html">Restful Objects viewer</a></p>
-</li>
-<li>
-<p><a href="ugdno.html">DataNucleus object store</a></p>
-</li>
-<li>
-<p><a href="ugsec.html">Security</a></p>
-</li>
-<li>
-<p><a href="ugtst.html">Testing</a></p>
-</li>
-<li>
-<p><a href="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.html">Annotations</a></p>
-</li>
-<li>
-<p><a href="rgsvc.html">Domain Services</a></p>
-</li>
-<li>
-<p><a href="rgcfg.html">Configuration Properties</a></p>
-</li>
-<li>
-<p><a href="rgcms.html">Classes, Methods and Schema</a></p>
-</li>
-<li>
-<p><a href="rgmvn.html">Apache Isis Maven plugin</a></p>
-</li>
-<li>
-<p><a href="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.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.html">Committers' Guide</a> (release procedures and related practices)</p>
-</li>
-</ul>
-</div>
-</div>
-</div>
-</div>
-<div class="sect1">
-<h2 id="_ugfun_core-concepts">2. Core Concepts</h2>
-<div class="sectionbody">
-<div class="paragraph">
-<p>This introductory chapter should give you a good about what Apache Isis actually <strong>is</strong>: the fundamental ideas and principles that it builds upon, how it compares with other frameworks, what the fundamental building blocks are for actually writing an Isis application, and what services and features the framework provides for you to leverage in your own apps.</p>
-</div>
-<div class="admonitionblock tip">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-tip" title="Tip"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>Parts of this chapter have been adapted from Dan Haywood&#8217;s 2009 book, 'Domain Driven Design using Naked Objects'.  We&#8217;ve also added some new insights and made sure the material we&#8217;ve used is relevant to Apache Isis.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-<div class="sect2">
-<h3 id="_ugfun_core-concepts_philosophy">2.1. Philosophy and Architecture</h3>
-<div class="paragraph">
-<p>This section describes some of the core ideas and architectural patterns upon which Apache Isis builds.</p>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_philosophy_domain-driven-design">2.1.1. Domain-Driven Design</h4>
-<div class="paragraph">
-<p>There&#8217;s no doubt that we developers love the challenge of understanding and deploying complex technologies. But understanding the nuances and subtleties of the business domain itself is just as great a challenge, perhaps more so. If we devoted our efforts to understanding and addressing those subtleties, we could build better, cleaner, and more maintainable software that did a better job for our stakeholders. And there&#8217;s no doubt that our stakeholders would thank us for it.</p>
-</div>
-<div class="paragraph">
-<p>A couple of years back Eric Evans wrote his book <a href="http://www.amazon.co.uk/Domain-driven-Design-Tackling-Complexity-Software/dp/0321125215">Domain-Driven Design</a>, which is well on its way to becoming a seminal work. In fact, most if not all of the ideas in Evans' book have been expressed before, but what he did was pull those ideas together to show how predominantly object-oriented techniques can be used to develop rich, deep, insightful, and ultimately useful business applications.</p>
-</div>
-<div class="paragraph">
-<p>There are two central ideas at the heart of domain-driven design.</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p>the <strong><em>ubiquitous language</em></strong> is about getting the whole team (both domain experts and developers) to communicate more transparently using a domain model.</p>
-</li>
-<li>
-<p>Meanwhile, <strong><em>model-driven design</em></strong> is about capturing that model in a very straightforward manner in code.</p>
-</li>
-</ul>
-</div>
-<div class="paragraph">
-<p>Let&#8217;s look at each in turn.</p>
-</div>
-<div class="sect4">
-<h5 id="_ugfun_core-concepts_philosophy_domain-driven-design_ubiquitous-language">Ubiquitous Language</h5>
-<div class="paragraph">
-<p>It&#8217;s no secret that the IT industry is plagued by project failures. Too often systems take longer than intended to implement, and when finally implemented, they don&#8217;t address the real requirements anyway.</p>
-</div>
-<div class="paragraph">
-<p>Over the years we in IT have tried various approaches to address this failing. Using waterfall methodologies, we&#8217;ve asked for requirements to be fully and precisely written down before starting on anything else. Or, using agile methodologies, we&#8217;ve realized that requirements are likely to change anyway and have sought to deliver systems incrementally using feedback loops to refine the implementation.</p>
-</div>
-<div class="paragraph">
-<p>But let&#8217;s not get distracted talking about methodologies. At the end of the day what really matters is communication between the domain experts (that is, the business) who need the system and the techies actually implementing it. If the two don&#8217;t have and cannot evolve a shared understanding of what is required, then the chance of delivering a useful system will be next to nothing.</p>
-</div>
-<div class="paragraph">
-<p>Bridging this gap is traditionally what business analysts are for; they act as interpreters between the domain experts and the developers. However, this still means there are two (or more) languages in use, making it difficult to verify that the system being built is correct. If the analyst mistranslates a requirement, then neither the domain expert nor the application developer will discover this until (at best) the application is first demonstrated or (much worse) an end user sounds the alarm once the application has been deployed into production.</p>
-</div>
-<div class="paragraph">
-<p>Rather than trying to translate between a business language and a technical language, with  <em>DDD</em> we aim to have the business and developers using the same terms for the same concepts in order to create a single <strong><em>domain model</em></strong>. This domain model identifies the relevant concepts of the domain, how they relate, and ultimately where the responsibilities are. This single domain model provides the vocabulary for the  ubiquitous language for our system.</p>
-</div>
-<div class="sidebarblock">
-<div class="content">
-<div class="title">Ubiquitous Language</div>
-<div class="paragraph">
-<p>Build a common language between the domain experts and developers by using the concepts of the domain model as the primary means of communication. Use the terms in speech, in diagrams, in writing, and when presenting.</p>
-</div>
-<div class="paragraph">
-<p>If an idea cannot be expressed using this set of concepts, then go back and extend the model. Look for and remove ambiguities and inconsistencies.</p>
-</div>
-</div>
-</div>
-<div class="paragraph">
-<p>Creating a  ubiquitous language calls upon everyone involved in the system&#8217;s development to express what they are doing through the vocabulary provided by the model. If this can&#8217;t be done, then our model is incomplete. Finding the missing words deepens our understanding of the domain being modeled.</p>
-</div>
-<div class="paragraph">
-<p>This might sound like nothing more than me insisting that the developers shouldn&#8217;t use jargon when talking to the business. Well, that&#8217;s true enough, but it&#8217;s not a one-way street. A  <strong>ubiquitous language</strong> demands that the developers work hard to understand the problem domain, but it also demands that the business works hard in being  <strong>precise</strong> in its naming and descriptions of those concepts. After all, ultimately the developers will have to express those concepts in a computer programming language.</p>
-</div>
-<div class="paragraph">
-<p>Also, although here I&#8217;m talking about the "domain experts" as being a homogeneous group of people, often they may come from different branches of the business. Even if we weren&#8217;t building a computer system, there&#8217;s a lot of value in helping the domain experts standardize their own terminology. Is the marketing department&#8217;s "prospect" the same as sales' "customer," and is that the same as an after-sales "contract"?</p>
-</div>
-<div class="paragraph">
-<p>The need for precision within the  ubiquitous language also helps us scope the system. Most business processes evolve piecemeal and are often quite ill-defined. If the domain experts have a very good idea of what the business process should be, then that&#8217;s a good candidate for automation, that is, including it in the scope of the system. But if the domain experts find it hard to agree, then it&#8217;s probably best to leave it out. After all, human beings are rather more capable of dealing with fuzzy situations than computers.</p>
-</div>
-<div class="paragraph">
-<p>So, if the development team (business and developers together) continually searches to build their  ubiquitous language, then the domain model naturally becomes richer as the nuances of the domain are uncovered. At the same time, the knowledge of the business domain experts also deepens as edge conditions and contradictions that have previously been overlooked are explored.</p>
-</div>
-<div class="paragraph">
-<p>We use the  ubiquitous language to build up a domain model. But what do we do  <strong>with</strong> that model? The answer to that is the second of our central ideas.</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_model_driven_design">Model-Driven Design</h5>
-<div class="paragraph">
-<p>Of the various methodologies that the IT industry has tried, many advocate the production of separate analysis models and implementation models. One example (from the mid 2000s) was that of the  <em>OMG</em>'s Model-Driven Architecture ( <em>MDA</em>) initiative, with its platform-independent model (the  <em>PIM</em>) and a platform-specific model (the  <em>PSM</em>).</p>
-</div>
-<div class="paragraph">
-<p>Bah and humbug! If we use our  ubiquitous language just to build up a high-level analysis model, then we will re-create the communication divide. The domain experts and business analysts will look only to the analysis model, and the developers will look only to the implementation model. Unless the mapping between the two is completely mechanical, inevitably the two will diverge.</p>
-</div>
-<div class="paragraph">
-<p>What do we mean by  <strong>model</strong> anyway? For some, the term will bring to mind  UML class or sequence diagrams and the like. But this isn&#8217;t a model; it&#8217;s a visual  <strong>representation</strong> of some aspect of a model. No, a domain model is a group of related concepts, identifying them, naming them, and defining how they relate. What is in the model depends on what our objective is. We&#8217;re not looking to simply model everything that&#8217;s out there in the real world. Instead, we want to take a relevant abstraction or simplification of it and then make it do something useful for us.  A model is neither right nor wrong, just more or less useful.</p>
-</div>
-<div class="paragraph">
-<p>For our  ubiquitous language to have value, the domain model that encodes it must have a straightforward, literal representation to the design of the software, specifically to the implementation. Our software&#8217;s design should be driven by this model; we should have a model-driven design.</p>
-</div>
-<div class="sidebarblock">
-<div class="content">
-<div class="title">Model-Driven Design</div>
-<div class="paragraph">
-<p>There must be a straightforward and very literal way to represent the domain model in terms of software. The model should balance these two requirements: form the  ubiquitous language of the development team and be representable in code.</p>
-</div>
-<div class="paragraph">
-<p>Changing the code means changing the model; refining the model requires a change to the code.</p>
-</div>
-</div>
-</div>
-<div class="paragraph">
-<p>Here also the word  <strong>design</strong> might mislead; some might be thinking of design documents and design diagrams, or perhaps of user interface (UX) design. But by  <strong>design</strong> we mean a way of organizing the domain concepts, which in turn leads to the way in which we organize their representation in code.</p>
-</div>
-<div class="paragraph">
-<p>Luckily, using <strong><em>object-oriented</em></strong> (<em>OO</em>) languages such as Java, this is relatively easy to do;  <em>OO</em> is based on a modeling paradigm anyway. We can express domain concepts using classes and interfaces, and we can express the relationships between those concepts using associations.</p>
-</div>
-<div class="paragraph">
-<p>So far so good. Or maybe, so far so much motherhood and apple pie. Understanding the  <em>DDD</em> concepts isn&#8217;t the same as being able to apply them, and some of the  <em>DDD</em> ideas can be difficult to put into practice. Time to discuss the naked objects pattern and how it eases that path by applying these central ideas of <em>DDD</em> in a very concrete way.</p>
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_philosophy_naked-objects-pattern">2.1.2. Naked Objects Pattern</h4>
-<div class="paragraph">
-<p>Apache Isis implements the naked objects pattern, originally formulated by Richard Pawson.  So who better than Richard to explain the origination of the idea?</p>
-</div>
-<div class="paragraph">
-<p><div class="extended-quote-first"><p>The Naked Objects pattern arose, at least in part, from my own frustration at the lack of success of the domain-driven approach. Good examples were hard to find&#8212;&#8203;as they are still.
-</p></div></p>
-</div>
-<div class="paragraph">
-<p><div class="extended-quote"><p>A common complaint from <em>DDD</em> practitioners was that it was hard to gain enough commitment from business stakeholders, or even to engage them at all. My own experience suggested that it was nearly impossible to engage business managers with UML diagrams.  It was much easier to engage them in rapid prototyping&#8201;&#8212;&#8201;where they could see and interact with the results&#8201;&#8212;&#8201;but most forms of rapid prototyping concentrate on the presentation layer, often at the expense of the underlying model and certainly at the expense of abstract thinking.
-</p></div></p>
-</div>
-<div class="paragraph">
-<p><div class="extended-quote"><p>Even if you could engage the business sponsors sufficiently to design a domain model, by the time you&#8217;d finished developing the system on top of the domain model, most of its benefits had disappeared. It&#8217;s all very well creating an agile domain object model, but if any change to that model also dictates the modification of one or more layers underneath it (dealing with persistence) and multiple layers on top (dealing with presentation), then that agility is practically worthless.
-</p></div></p>
-</div>
-<div class="paragraph">
-<p><div class="extended-quote"><p>The other concern that gave rise to the birth of Naked Objects was how to make user interfaces of mainstream business systems more "expressive"&#8201;&#8212;&#8201;how to make them feel more like using a drawing program or <em>CAD</em> system. Most business systems are not at all expressive; they treat the user merely as a dumb <strong>process-follower</strong>, rather than as an empowered <strong>problem-solver</strong>.  Even the so-called usability experts had little to say on the subject: try finding the word "empowerment" or any synonym thereof in the index of any book on usability. Research had demonstrated that the best way to achieve expressiveness was to create an object-oriented user interface (<em>OOUI</em>). In practice, though, <em>OOUI</em>s were notoriously hard to develop.
-</p></div></p>
-</div>
-<div class="paragraph">
-<p><div class="extended-quote"><p>Sometime in the late 1990s, it dawned on me that if the domain model really did represent the "ubiquitous language" of the business and those domain objects were behaviorally rich (that is, business logic is encapsulated as methods on the domain objects rather than in procedural scripts on top of them), then the <em>UI</em> could be nothing more than a reflection of the user interface. This would solve both of my concerns. It would make it easier to do domain-driven design, because one could instantly translate evolving domain modeling ideas into a working prototype. And it would deliver an expressive, object-oriented user interface for free. Thus was born the idea of Naked Objects.
-</p></div></p>
-</div>
-<div class="paragraph">
-<p><div class="extended-quote-attribution"><p>-- Richard Pawson
-</p></div></p>
-</div>
-<div class="paragraph">
-<p>You can learn much more about the pattern in the book, <a href="http://www.amazon.com/exec/obidos/ISBN=0470844205/">Naked Objects</a>, also freely available to <a href="http://www.nakedobjects.org/book/">read online</a>.  Richard co-wrote the book with one of Apache Isis' committers, Robert Matthews, who was in turn the author of the Naked Objects Framework for Java (the original codebase of of Apache Isis).</p>
-</div>
-<div class="paragraph">
-<p>You might also want to read Richard&#8217;s <a href="resources/core-concepts/Pawson-Naked-Objects-thesis.pdf">PhD on the subject</a>.</p>
-</div>
-<div class="admonitionblock tip">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-tip" title="Tip"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>One of the external examiners for Richard&#8217;s PhD was <a href="http://en.wikipedia.org/wiki/Trygve_Reenskaug">Trygve Reenskaug</a>, who originally formulated the MVC pattern at Xeroc PARC.  In his paper, <a href="http://heim.ifi.uio.no/~trygver/2007/2007.02.13-babyUML.pdf">Baby UML</a>, Reenskaug describes that when implemented the first MVC, "the conventional wisdom in the group was that objects should be visible and tangible, thus bridging the gap between the human brain and the abstract data within the computer."  Sound familiar?  It&#8217;s interesting to speculate what might have been if this idea had been implemented back then in the late 70s.</p>
-</div>
-<div class="paragraph">
-<p>Reenskaug then goes on to say that "this simple and powerful idea failed because &#8230;&#8203; users were used to seeing [objects] from different perspectives. The visible and tangible object would get very complex if it should be able to show itself and be manipulated in many different ways."</p>
-</div>
-<div class="paragraph">
-<p>In Apache Isis the responsibility of rendering an object is not the object itself, it is the framework.  Rather, the object inspects the object and uses that to decide how to render the object.  This is also extensible.  In the <a href="http://www.isisaddons.org">Isis Addons</a> (non-ASF) the <a href="http://github.com/isisaddons/isis-wicket-gmap3">Isis addons' gmap3</a> wicket extension renders any object with latitude/longitude on a map, while <a href="http://github.com/isisaddons/isis-wicket-fullcalendar2">Isis addons' fullcalendar2 wicket extension</a> renders any object with date(s) on a calendar.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-<div class="sect4">
-<h5 id="_ugfun_core-concepts_philosophy_naked-objects-pattern_object-interface-mapping">Object Interface Mapping</h5>
-<div class="paragraph">
-<p>Another&#8201;&#8212;&#8201;more technical&#8201;&#8212;&#8201;way to think about the naked objects pattern is as an <em>object interface mapper</em>, or <code>OIM</code>.  We sometimes use this idea to explain naked objects to a bunch of developers.</p>
-</div>
-<div class="paragraph">
-<p>Just as an ORM (such as <a href="http://datanucleus.org">DataNucleus</a> or <a href="http://hibernate.org">Hibernate</a>) maps domain entities to a database, you can think of the naked objects pattern as representing the concept of mapping domain objects to a user interface.</p>
-</div>
-<div class="paragraph">
-<p>This is the way that the <a href="http://metawidget.org/">MetaWidget</a> team, in particular Richard Kennard, the primary contributor, likes to describe their tool.  MetaWidget has a number of ideas in common with Apache Isis, specifically the runtime generation of a UI for domain objects.  You can hear more from Kennard and others on this <a href="http://devchat.tv/js-jabber/150-jsj-oims">Javascript Jabber podcast</a>.</p>
-</div>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>We compare Apache Isis' with MetaWidget <a href="#_ugfun_core-concepts_principles_apache-isis-vs_metawidget">here</a>.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_what_this_means_in_practice">What this means in practice</h5>
-<div class="paragraph">
-<p>This <a href="https://www.youtube.com/watch?v=ludOLyi6VyY">screencast</a> shows what all of this means in practice, showing the relationship between a running app and the actual code underneath.</p>
-</div>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>This screencast shows Apache Isis v1.0.0, Jan 2013.  The UI has been substantially refined since that release.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_philosophy_hexagonal-architecture">2.1.3. Hexagonal Architecture</h4>
-<div class="paragraph">
-<p>One of the patterns that Evans discusses in his book is that of a <strong>layered architecture</strong>.  In it he describes why the domain model lives in its own layer within the architecture. The other layers of the application (usually presentation, application, and persistence) have their own responsibilities, and are completely separate.  Each layer is cohesive and depending only on the layers below.  In particular, we have a layer dedicated to the domain model. The code in this layer is unencumbered with the (mostly technical) responsibilities of the other layers and so can evolve to tackle complex domains as well as simple ones.</p>
-</div>
-<div class="paragraph">
-<p>This is a well-established pattern, almost a de-facto; there&#8217;s very little debate that these responsibilities should be kept separate from each other.  With Apache Isis the responsibility for presentation is a framework concern, the responsibility for the domain logic is implemented by the (your) application code.</p>
-</div>
-<div class="paragraph">
-<p>A few years ago Alistair Cockburn reworked the traditional layered architecture diagram and came up with the <strong><em>hexagonal architecture</em></strong>:.</p>
-</div>
-<div class="admonitionblock tip">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-tip" title="Tip"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>The hexagonal architecture is also known as the <a href="http://c2.com/cgi/wiki?PortsAndAdaptersArchitecture">Ports and Adapters</a> architecture or (less frequently) as the <a href="http://jeffreypalermo.com/blog/the-onion-architecture-part-1/">Onion</a> architecture.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-<div class="imageblock">
-<div class="content">
-<img src="images/core-concepts/philosophy/hexagonal-architecture.png" alt="hexagonal architecture" width="700px">
-</div>
-<div class="title">Figure 1. The hexagonal architecture emphasizes multiple implementations of the different layers.</div>
-</div>
-<div class="paragraph">
-<p>What Cockburn is emphasizing is that there&#8217;s usually more than one way <strong>into</strong> an application (what he called the <strong><em>user-side' ports</em></strong>) and more than one way  <strong>out of</strong> an application too (the <strong><em>data-side ports</em></strong>). This is very similar to the concept of primary and secondary actors in use cases: a primary actor (often a human user but not always) is active and initiates an interaction, while a secondary actor (almost always an external system) is passive and waits to be interacted with.</p>
-</div>
-<div class="paragraph">
-<p>Associated with each port can be an <strong><em>adapter</em></strong> (in fact, Cockburn&#8217;s alternative name for this architecture is <strong><em>ports and adapters</em></strong>). An adapter is a device (piece of software) that talks in the protocol (or  <em>API</em>) of the port. Each port could have several adapters.</p>
-</div>
-<div class="paragraph">
-<p>Apache Isis maps very nicely onto the  <strong>hexagonal architecture</strong>.  Apache Isis' viewers act as user-side adapters and use the Apache Isis metamodel API as a port into the domain objects.   For the data side, we are mostly concerned with persisting domain objects to some sort of object store.  Here Apache Isis delegates most of the heavy lifting to ORM implementing the JDO API.  Most of the time this will be DataNucleus configured to persist to an RDBMS, but DataNucleus can also support other object stores, for example Neo4J.  Alternatively Apache Isis can be configured to persist using some other JDO implementation, for example Google App Engine.</p>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_philosophy_aop">2.1.4. Aspect Oriented</h4>
-<div class="paragraph">
-<p>Although not a book about object modelling, Evans' "Domain Driven Design" does use object orientation as its primary modelling tool; while <a href="#_ugfun_core-concepts_philosophy_naked-objects-pattern">naked objects pattern</a> very much comes from an OO background (it even has 'object' in its name); Richard Pawson lists Alan Kay as a key influence.</p>
-</div>
-<div class="paragraph">
-<p>It&#8217;s certainly true that to develop an Apache Isis application you will need to have good object oriented modelling skills.  But given that all the mainstream languages for developing business systems are object oriented (Java, C#, Ruby), that&#8217;s not such a stretch.</p>
-</div>
-<div class="paragraph">
-<p>However, what you&#8217;ll also find as you write your applications is that in some ways an Isis application is more aspect-oriented than it is object oriented.  Given that aspect-orientation&#8201;&#8212;&#8201;as a programming paradigm at least&#8201;&#8212;&#8201;hasn&#8217;t caught on, that statement probably needs unpacking a little.</p>
-</div>
-<div class="sect4">
-<h5 id="_aop_concepts">AOP Concepts</h5>
-<div class="paragraph">
-<p>Aspect-orientation, then, is a different way of decomposing your application, by treating <em>cross-cutting concerns</em> as a first-class citizen.  The canonical (also rather boring) example of a cross-cutting concern is that of logging (or tracing) all method calls.  An aspect can be written that will weave in some code (a logging statement) at specified points in the code).</p>
-</div>
-<div class="paragraph">
-<p>This idea sounds rather abstract, but what it really amounts to is the idea of interceptors.  When one method calls another the AOP code is called in first.  This is actually then one bit of AOP that is quite mainstream; DI containers such as Spring provide aspect orientation in supporting annotations such as <code>@Transactional</code> or <code>@Secured</code> to java beans.</p>
-</div>
-<div class="paragraph">
-<p>Another aspect (ahem!) of aspect-oriented programming has found its way into other programming languages, that of a mix-in or trait.  In languages such as Scala these mix-ins are specified statically as part of the inheritance hierarchy, whereas with AOP the binding of a trait to some other class/type is done without the class "knowing" that additional behaviour is being mixed-in to it.</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_realization_within_apache_isis">Realization within Apache Isis</h5>
-<div class="paragraph">
-<p>What has all this to do with Apache Isis, then?</p>
-</div>
-<div class="paragraph">
-<p>Well, a different way to think of the naked objects pattern is that the visualization of a domain object within a UI is a cross-cutting concern.  By following certain very standard programming conventions that represent the <em>Apache Isis Programming Model</em> (POJOs plus annotations), the framework is able to build a metamodel and from this can render your domain objects in a standard generic fashion.  That&#8217;s a rather more interesting cross-cutting concern than boring old logging!</p>
-</div>
-<div class="paragraph">
-<p>Isis also draws heavily on the AOP concept of interceptors.  Whenever an object is rendered in the UI, it is filtered with respect to the user&#8217;s permissions.  That is, if a user is not authorized to either view or perhaps modify an object, then this is applied transparently by the framework.  The <a href="http://github.com/isisaddons/isis-module-security">Isis addons' security</a> module, mentioned previously, provides a rich user/role/permissions subdomain to use out of the box; but you can integrate with a different security mechanism if you have one already.</p>
-</div>
-<div class="paragraph">
-<p>Another example of interceptors are the <a href="http://github.com/isisaddons/isis-module-command">Isis addons' command</a> and <a href="http://github.com/isisaddons/isis-module-audit">Isis addons' audit</a> modules.  The command module captures every user interaction that modifies the state of the system (the "cause" of a change) while the audit module captures every change to every object (the "effect" of a change).  Again, this is all transparent to the user.</p>
-</div>
-<div class="paragraph">
-<p>Apache Isis also has an internal event bus (you can switch between an underlying implementation of Gauva or Axon).  A domain event is fired whenever an object is interacted with, and this allows any subscribers to influence the operation (or even veto it).  This is a key mechanism in ensuring that Isis applications are maintainable, and we discuss it in depth in the section on  <a href="ugbtb.html#_ugbtb_decoupling">Decoupling</a>.  But fundamentally its relying on this AOP concept of interceptors.</p>
-</div>
-<div class="paragraph">
-<p>Finally, Isis also a feature that is akin to AOP mix-ins.  A "contributed action" is one that is implemented on a domain service but that appears to be a behaviour of rendered domain object.  In other words, we can dissociate behaviour from data.  That&#8217;s not always the right thing to do of course.  In Richard Pawson&#8217;s description of the <a href="#_ugfun_core-concepts_philosophy_naked-objects-pattern">naked objects pattern</a> he talks about "behaviourally rich" objects, in other words where the business functionality encapsulated the data.   But on the other hand sometimes the behaviour and data structures change at different rates.  The <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">single responsibility principle</a> says we should only lump code together that changes at the same rate.  Apache Isis' support for contributions (not only contributed actions, but also contributed properties and contributed collections) enables this.  And again, t
 o loop back to the topic of this section, it&#8217;s an AOP concept that being implemented by the framework.</p>
-</div>
-<div class="paragraph">
-<p>The nice thing about aspect orientation is that for the most part you can ignore these cross-cutting concerns and - at least initially at least - just focus on implementing your domain object.  Later when your app starts to grow and you start to break it out into smaller modules, you can leverage Apache Isis' AOP support for (<a href="ugbtb.html#_ugbtb_decoupling_mixins">mixins</a>), (<a href="ugbtb.html#_ugbtb_decoupling_contributions">contributions</a>) and interceptors (the <a href="ugbtb.html#_ugbtb_decoupling_event-bus">event bus</a>) to ensure that your codebase remains maintainable.</p>
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_philosophy_how-eases-ddd">2.1.5. How Apache Isis eases DDD</h4>
-<div class="paragraph">
-<p>The case for  <em>DDD</em> might be compelling, but that doesn&#8217;t necessarily make it easy to do. Let&#8217;s take a look at some of the
-challenges that  <em>DDD</em> throws up and see how Apache Isis (and its implementation of the naked objects pattern) helps address them.</p>
-</div>
-<div class="sect4">
-<h5 id="_ddd_takes_a_conscious_effort">DDD takes a conscious effort</h5>
-<div class="paragraph">
-<p>Here&#8217;s what Eric Evans says about ubiquitous language:</p>
-</div>
-<div class="paragraph">
-<p><div class="extended-quote-first"><p>With a conscious effort by the [development] team the domain model can provide the backbone for [the] common [ubiquitous] language&#8230;&#8203;connecting team communication to the software implementation."
-</p></div></p>
-</div>
-<div class="paragraph">
-<p><div class="extended-quote-attribution"><p>-- Eric Evans
-</p></div></p>
-</div>
-<div class="paragraph">
-<p>The word to pick up on here is <strong>conscious</strong>.  It takes a conscious effort by the entire team to develop the ubiquitous language. Everyone in the team must challenge the use of new or unfamiliar terms, must clarify concepts when used in a new context, and in general must be on the lookout for sloppy thinking. This takes willingness on the part of all involved, not to mention some practice.</p>
-</div>
-<div class="paragraph">
-<p>With Apache Isis, though, the  ubiquitous language evolves with scarcely any effort at all. For the business experts, the Apache Isis viewers show the domain concepts they identify and the relationships between those concepts in a straightforward fashion. Meanwhile, the developers can devote themselves to encoding those domain concepts directly as domain classes. There&#8217;s no technology to get distracted by; there is literally nothing else for the developers to work on.</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_ddd_must_be_grounded">DDD must be grounded</h5>
-<div class="paragraph">
-<p>Employing a  model-driven design isn&#8217;t necessarily straightforward, and the development processes used by some organizations positively hinder it. It&#8217;s not sufficient for the business analysts or architects to come up with some idealized representation of the business domain and then chuck it over the wall for the programmers to do their best with.</p>
-</div>
-<div class="paragraph">
-<p>Instead, the concepts in the model must have a very literal representation in code. If we fail to do this, then we open up the communication divide, and our  ubiquitous language is lost. There is literally no point having a domain model that cannot be represented in code. We cannot invent our ubiquitous language in a vacuum, and the developers must ensure that the model remains grounded in the doable.</p>
-</div>
-<div class="paragraph">
-<p>In Apache Isis, we have a very pure one-to-one correspondence between the domain concepts and its implementation. Domain concepts are represented as classes and interfaces, easily demonstrated back to the business. If the model is clumsy, then the application will be clumsy too, and so the team can work together to find a better implementable model.</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_model_must_be_understandable">Model must be understandable</h5>
-<div class="paragraph">
-<p>If we are using code as the primary means of expressing the model, then we need to find a way to make this model understandable to the business.</p>
-</div>
-<div class="paragraph">
-<p>We could generate UML diagrams and the like from code. That will work for some members of the business community, but not for everyone. Or we could generate a PDF document from Javadoc comments, but comments aren&#8217;t code and so the document may be inaccurate.  Anyway, even if we do create such a document, not everyone will read it.</p>
-</div>
-<div class="paragraph">
-<p>A better way to represent the model is to show it in action as a working prototype. As we show in the <a href="#_ugfun_getting-started">Getting Started</a> section, Apache Isis enables this with ease. Such prototypes bring the domain model to life, engaging the audience in a way that a piece of paper never can.</p>
-</div>
-<div class="paragraph">
-<p>Moreover, with Apache Isis prototypes, the domain model will come shining through. If there are mistakes or misunderstandings in the domain model (inevitable when building any complex system), they will be obvious to all.</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_architecture_must_be_robust">Architecture must be robust</h5>
-<div class="paragraph">
-<p><em>DDD</em> rightly requires that the domain model lives in its own layer within the architecture. The other layers of the application (usually presentation, application, and persistence) have their own responsibilities, and are completely separate.</p>
-</div>
-<div class="paragraph">
-<p>However, there are two immediate issues. The first is rather obvious: custom coding each of those other layers is an expensive proposition. Picking up on the previous point, this in itself can put the kibosh on using prototyping to represent the model, even if we wanted to do so.</p>
-</div>
-<div class="paragraph">
-<p>The second issue is more subtle. It takes real skill to ensure the correct separation of concerns between these layers, if indeed you can get an agreement as to what those concerns actually are. Even with the best intentions, it&#8217;s all too easy for custom-written layers to blur the boundaries and put (for example) validation in the user interface layer when it should belong to the domain layer. At the other extreme, it&#8217;s quite possible for custom layers to distort or completely subvert the underlying domain model.</p>
-</div>
-<div class="paragraph">
-<p>Because of Apache Isis' generic  <em>OOUI</em>s, there&#8217;s no need to write the other layers of the architecture.  Of course, this reduces the development cost. But more than that, there will be no leakage of concerns outside the domain model. All the validation logic <strong>must</strong> be in the domain model because there is nowhere else to put it.</p>
-</div>
-<div class="paragraph">
-<p>Moreover, although Apache Isis does provide a complete runtime framework, there is no direct coupling of your domain model to the framework. That means it is very possible to take your domain model prototyped in Naked Objects and then deploy it on some other  <em>J(2)EE</em> architecture, with a custom <em>UI</em> if you want.  Apache Isis guarantees that your domain model is complete.</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_extending_the_reach_of_ddd">Extending the reach of DDD</h5>
-<div class="paragraph">
-<p>Domain-driven design is often positioned as  being applicable only to complex domains; indeed, the subtitle of Evans book is  "Tackling Complexity in the Heart of Software". The corollary is that DDD is overkill for simpler domains. The trouble is that we immediately have to make a choice: is the domain complex enough to warrant a domain-driven approach?</p>
-</div>
-<div class="paragraph">
-<p>This goes back to the previous point, building and maintaining a layered architecture. It doesn&#8217;t seem cost effective to go to all the effort of a DDD approach if the underlying domain is simple.</p>
-</div>
-<div class="paragraph">
-<p>However, with Apache Isis, we don&#8217;t write these other layers, so we don&#8217;t have to make a call on how complex our domain is. We can start working solely on our domain, even if we suspect it will be simple. If it is indeed a simple domain, then there&#8217;s no hardship, but if unexpected subtleties arise, then we&#8217;re in a good position to handle them.</p>
-</div>
-<div class="paragraph">
-<p>If you&#8217;re just starting out writing domain-driven applications, then Apache Isis should significantly ease your journey into applying <em>DDD</em>. On the other hand, if you&#8217;ve used <em>DDD</em> for a while, then you should find Isis a very useful new tool in your arsenal.</p>
-</div>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="_ugfun_core-concepts_principles">2.2. Principles and Values</h3>
-<div class="paragraph">
-<p>This section describes some of the core principles and values that the framework aims to honour and support.</p>
-</div>
-<div class="paragraph">
-<p>The first of these relate to how we believe your domain application should be written: it should be decoupled, testable and so on).  Others relate to the implementation of the framework itself.</p>
-</div>
-<div class="paragraph">
-<p>The section concludes by contrasting the framework with some other open source frameworks commonly used.</p>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_principles_your-apps">2.2.1. Your Applications</h4>
-<div class="paragraph">
-<p>Apache Isis is primarily aimed at custom-built "enterprise" applications.  The UI exposed by the <a href="ugvw.html">Wicket viewer</a> is intended to be usable by domain experts, typically end-users within the organization.  The REST API exposed by the <a href="ugvro.html">RestfulObjects viewer</a> allows custom apps to be developed - eg using AngularJS or similar - for use by those requiring more guidance; typically end-users outside of the organization.</p>
-</div>
-<div class="paragraph">
-<p>But should your organization buy, or build?  Buying packaged software makes sense for statutory requirements, such as payroll or general ledger, or document management/retrieval.  But it makes much less sense to buy packaged software for the systems that support the core business: the software should fit the business, not the other way around.</p>
-</div>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-TODO - flesh out the following:
-</td>
-</tr>
-</table>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p>Flexible, "just enough"</p>
-</li>
-<li>
-<p>Decoupled</p>
-</li>
-<li>
-<p>Long-term Cost of ownership</p>
-<div class="ulist">
-<ul>
-<li>
-<p>dependency injection of services</p>
-</li>
-<li>
-<p>OO design techniques, eg dependency inversion principle</p>
-</li>
-<li>
-<p>an in-memory event bus</p>
-</li>
-<li>
-<p>applib</p>
-</li>
-<li>
-<p>(no "Big Ball of Mud")</p>
-</li>
-</ul>
-</div>
-</li>
-<li>
-<p>Honouring the Single Responsibility Principle</p>
-<div class="ulist">
-<ul>
-<li>
-<p>behaviourally Complete vs Contributions/Mixins</p>
-</li>
-</ul>
-</div>
-</li>
-<li>
-<p>Testable<br></p>
-<div class="paragraph">
-<p>While Apache Isis can be used (very effectively) for simple CRUD-style applications, it is also intended to be used for complex business domains.  Ensuring that the business logic in
-such applications is correct means that the framework must (and does) provide robust testing support, both for developer-level unit testing and business-level (end-to-end) integration testing.</p>
-</div>
-</li>
-<li>
-<p>Reusable building blocks<br></p>
-<div class="paragraph">
-<p>Isis addons, catalog.incode.org</p>
-</div>
-</li>
-</ul>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_principles_isis-itself">2.2.2. Apache Isis itself</h4>
-<div class="paragraph">
-<p>This section discusses some of the principles and values we apply to the development of the Apache Isis framework itself.</p>
-</div>
-<div class="sect4">
-<h5 id="_full_stack_but_extensible">Full-stack but Extensible</h5>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-TODO
-</td>
-</tr>
-</table>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_focuses_on_its_usp">Focuses on its USP</h5>
-<div class="admonitionblock note">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-note" title="Note"></i>
-</td>
-<td class="content">
-TODO
-</td>
-</tr>
-</table>
-</div>
-<div class="paragraph">
-<p>add-ons</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p>Apache Isis is at heart a metamodel with runtime, and coordinates interations using an AOP set of principles</p>
-</li>
-<li>
-<p>Apache Isis vs Isis Addons</p>
-</li>
-<li>
-<p>Apache Isis vs Shiro vs DataNucleus</p>
-<div class="olist lowerroman">
-<ol class="lowerroman" type="i">
-<li>
-<p>all code has legacy in it&#8230;&#8203;. parts of the Isis codebase are well over a decade old; and back then a lot of the JEE technologies that we&#8217;d like to be using just didn&#8217;t exist, so we had to invent the features we required ourselves.</p>
-</li>
-<li>
-<p>also, Apache Isis today is more pragmatic than previously</p>
-</li>
-</ol>
-</div>
-</li>
-<li>
-<p>a client/server solution, with AWT-based client</p>
-</li>
-<li>
-<p>a HTML browser, Scimpi (JSF-like, but not using JSF), &#8230;&#8203;</p>
-</li>
-<li>
-<p>security</p>
-</li>
-<li>
-<p>objectstores</p>
-</li>
-</ul>
-</div>
-<div class="paragraph">
-<p>We&#8217;re working hard to remove duplication, reuse existing open source/JEE, and simplify.</p>
-</div>
-<div class="paragraph">
-<p>The areas of Apache Isis we consider mature are those that have been developed in support of real-world applications implemented by the committers.  Foremost among these is Estatio.</p>
-</div>
-<div class="paragraph">
-<p>Focus on enterprise / line-of-business applications, for use by internal staff.</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p>problem solvers, not process followers</p>
-</li>
-<li>
-<p>view models</p>
-</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_principles_apache-isis-vs">2.2.3. Apache Isis vs &#8230;&#8203;</h4>
-<div class="paragraph">
-<p>Many other frameworks promise rapid application development and provide automatically generated user interfaces, so how
-do they compare to Apache Isis?</p>
-</div>
-<div class="sect4">
-<h5 id="_ugfun_core-concepts_principles_apache-isis-vs_mvc-server-side-frameworks">vs MVC server-side frameworks</h5>
-<div class="paragraph">
-<p>Some of most commonly used frameworks today are <a href="http://www.spring.io/">Spring MVC</a>, <a href="http://rubyonrails.org/">Ruby on Rails</a> and <a href="http://www.grails.org">Grails</a>, all of which implement one flavour or another of the server-side MVC pattern.  The MVC 1.0 specification (scheduled for JavaEE 8) is also similar.</p>
-</div>
-<div class="paragraph">
-<p>These frameworks all use the classic  <strong>model-view-controller</strong> ( <em>MVC</em>) pattern for web applications, with scaffolding, code-generation, and/or metaprogramming tools for the controllers and views, as well as convention over configuration to define how these components interact.  The views provided out of the box by these frameworks tend to be simple  <em>CRUD</em>-style interfaces. More sophisticated behavior is accomplished by customizing the generated controllers.</p>
-</div>
-<div class="paragraph">
-<p>The most obvious difference when developing an Apache Isis application is its deliberate lack of an explicit controller layer; non- <em>CRUD</em> behavior is automatically made available in its generic object-oriented  _UI_s.  More sophisticated UIs can be built either by <a href="ugvw.html#_ugvw_extending">extending Apache Isis' Wicket viewer</a> or by writing a bespoke UI leveraging the REST (hypermedia) API automatically exposed by <a href="ugvro.html">Isis' Restful Objects viewer</a>.  Other frameworks can also be used to implement REST APIs, of course, but generally they require a significant amount of development to get anywhere near the level of sophistication provided automatically by Apache Isis' REST API.</p>
-</div>
-<div class="paragraph">
-<p>Although these frameworks all provide their own ecosystems of extensions, Apache Isis' equivalent <a href="http://www.isisaddons.org">Isis Addons</a> (non-ASF) tend to work at a higher-level of abstraction.  For example, each of these frameworks will integrate with various security mechanism, but the <a href="http://github.com/isisaddons/isis-module-security">Isis addons' security module</a> provides a full subdomain of users, roles, features and permissions that can be plugged into any Isis application.  Similarly, the <a href="http://github.com/isisaddons/isis-module-command">Isis addons' command</a> and <a href="http://github.com/isisaddons/isis-module-audit">Isis addons' audit</a> modules in combination provide a support for auditing and traceability that can also be used for out of the box profiling.  Again, these addons can be plugged into any Isis app.</p>
-</div>
-<div class="paragraph">
-<p>In terms of testing support, each of these other frameworks provide mechanisms to allow the webapp to be tested from within a JUnit test harness. Apache Isis' support is similar.  Where Apache Isis differs though is that it enables end-to-end testing without the need for slow and fragile Selenium tests. Instead, Apache Isis provides a "<a href="ugtst.html#_ugtst_integ-test-support_wrapper-factory">WrapperFactory</a>" domain service that allows the generic UI provided to in essence be simulated. On a more pragmatic level, the <a href="http://github.com/isisaddons/isis-module-fakedata">Isis addons' fakedata</a> module does "what it says on the tin", allowing both unit- and integration-tests to focus on the salient data and fake out the rest.</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_ugfun_core-concepts_principles_apache-isis-vs_cqrs">vs CQRS</h5>
-<div class="paragraph">
-<p>The CQRS architectural pattern (it stands for "Command Query Responsbility Separation") is the idea that the domain objects that mutate the state of the system - to which commands are sent and which then execute - should be separated from the mechanism by which the state of the system is queried (rendered).  The former are sometimes called the "write (domain) model", the latter the "read model".</p>
-</div>
-<div class="paragraph">
-<p>In the canonical version of this pattern there are separate datastores.  The commands act upon a command/write datastore.  The data in this datastore is then replicated in some way to the query/read datastore, usually denormalized or otherwise such that it is easy to query.  CQRS advocates recommend using very simple (almost naive) technology for the query/read model; it should be a simple projection of the query datastore.  Complexity instead lives elsewhere: business logic in the command/write model, and in the transformation logic betweeen the command/write and read/query datastores.  In particular, there is no requirement for the two datastores to use the same technology: one might be an RDBMS while the other a NoSQL datastore or even datawarehouse.</p>
-</div>
-<div class="paragraph">
-<p>In most implementations the command and query datastores are <em>not</em> updated in the same transaction; instead there is some sort of replication mechanism.  This also means that the query datastore is eventually consistent rather than always consistent; there could be a lag of a few seconds before it is updated.  This means in turn that CQRS implementations require mechanisms to cater for offline query datastores; usually some sort of event bus.</p>
-</div>
-<div class="paragraph">
-<p>The CQRS architecture&#8217;s extreme separation of responsibilities can result in a lot of boilerplate.  Any given domain concept, eg <code>Customer</code>, must be represented both in the command/write model and also in the query/read model.  Each business operation upon the command model is reified as a command object, for example <code>PlaceOrderCommand</code>.</p>
-</div>
-<div class="paragraph">
-<p>Comparing CQRS to Apache Isis, the most obvious difference is that Apache Isis does not separate out a command/write model from a query/read model, and there is usually just a single datastore.  But then again, having a separate read model just so that the querying is very straightforward is pointless with Apache Isis because, of course, Isis provides the UI "for free".</p>
-</div>
-<div class="paragraph">
-<p>There are other reasons though why a separate read model might make sense, such as to precompute particular queries, or against denormalized data.  In these cases Apache Isis can often provide a reasonable alternative, namely to map domain entities against RDBMS views, either materialized views or dynamic.  In such cases there is still only a single physical datastore, and so transactional integrity is retained.</p>
-</div>
-<div class="paragraph">
-<p>Or, the CQRS architecture can be more fully implemented with Apache Isis by introducing a separate read model, synchronized using the <a href="rgsvc.html#_rgsvc_api_PublishingService"><code>PublishingService</code></a>, or using <a href="rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscribers</a>  on the <a href="rgsvc.html#_rgsvc_api_EventBusService"><code>EventBusService</code></a>.  One can then use <a href="ugbtb.html#_ugbtb_view-models">view models</a> to surface the data in the external read datastore.</p>
-</div>
-<div class="paragraph">
-<p>With respect to commands, Apache Isis does of course support the <a href="rgsvc.html#_rgsvc_spi_CommandService"><code>CommandService</code></a> which allows each business action to be reified into a <code>Command</code>.  However, names are misleading here: Apache Isis' commands are relatively passive, merely recording the intent of the user to invoke some operation.  In a CQRS architecture, though, commands take a more active role, locating and acting upon the domain objects.  More significantly, in CQRS each command has its own class, such as <code>PlaceOrderCommand</code>, instantiated by the client and then executed.  With Apache Isis, though, the end-user merely invokes the <code>placeOrder(&#8230;&#8203;)</code> action upon the domain object; the framework itself creates the <code>Command</code> as a side-effect of this.</p>
-</div>
-<div class="paragraph">
-<p>In CQRS the commands correspond to the business logic that mutates the system.  Whether this logic is part of the command class (<code>PlaceOrderCommand</code>) or whether that command delegates to methods on the domain object is an implementation detail; but it certainly is common for the business logic to be wholly within the command object and for the domain object to be merely a data holder of the data within the command/write datastore.</p>
-</div>
-<div class="paragraph">
-<p>In Apache Isis this same separation of business logic from the underlying data can be accomplished most straightforwardly using <a href="ugbtb.html#_ugbtb_decoupling_mixins">mixins</a> or <a href="#_ugfun_how-tos_contributed-members">contributions</a>.  In the UI (surfaced by the <a href="ugvw.html">Wicket viewer</a>) or in the REST API (surfaced by the <a href="ugvro.html">RestfulObjects viewer</a>) the behaviour appears to reside on the domain object; however the behaviour actually resides on separate classes and is mixed in (like a trait) only at runtime.</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_ugfun_core-concepts_principles_apache-isis-vs_event-sourcing">vs Event Sourcing</h5>
-<div class="paragraph">
-<p>The <a href="_ugfun_core-concepts_principles_apache-isis-vs_cqrs">CQRS architecture</a>, discussed above, is often combined with <em>Event Sourcing</em> pattern, though they are separate ideas.</p>
-</div>
-<div class="paragraph">
-<p>With event sourcing, each business operation emits a domain event (or possibly events) that allow other objects in the system to act accordingly.  For example, if a customer places an order then this might emit the <code>OrderPlacedEvent</code>.  Most significantly, the subscribers to these events can include the datastore itself; the state of the system is in effect a transaction log of every event that has occurred since "the beginning of time": it is sometimes called an event store.   With CQRS, this event datastore corresponds to the command/write datastore (the query/read datastore is of course derived from the command datastore).</p>
-</div>
-<div class="paragraph">
-<p>Although it might seem counter-intuitive to be able store persistent state in this way (as a souped up "transaction log"), the reality is that with modern compute capabilities make it quite feasible to replay many 10s/100s of thousands of events in a second.  And the architecture supports some interesting use cases; for example it becomes quite trivial to rewind the system back to some previous point in time.</p>
-</div>
-<div class="paragraph">
-<p>When combined with CQRS we see a command that triggers a business operation, and an event that results from it.  So, a <code>PlaceOrderCommand</code> command can result in an <code>OrderPlacedEvent</code> event.  A subscriber to this event might then generate a further command to act upon some other system (eg to dispatch the system).  Note that the event might be dispatched and consumed in-process or alternatively this might occur out-of-process.  If the latter, then the subscriber will operate within a separate transaction, meaning the usual eventual consistency concerns and also compensating actions if a rollback is required.  CQRS/event sourcing advocates point out - correctly  that this is just how things are in the "real world" too.</p>
-</div>
-<div class="paragraph">
-<p>In Apache Isis every business action (and indeed, property and collection) emits domain events through the <a href="rgsvc.html#_rgsvc_api_EventBusService"><code>EventBusService</code></a> , and can optionally also be published through the <a href="rgsvc.html#_rgsvc_spi_PublishingService"><code>PublishingService</code></a>.  The former are dispatched and consumed in-process and within the same transaction, and for this reason the <a href="rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscribers</a> can also veto the events.  The latter are intended for out-of-process consumption; the (non-ASF) <a href="http://github.com/isisaddons/isis-module-publishing">Isis addons' publishing</a> and <a href="http://github.com/isisaddons/isis-module-publishmq">Isis addons' publishmq</a> modules provide implementations for dispatching either through a RDBMS database table, or directly through to an <a href="http://camel.apache.org">ActiveMQ</a> message queue (eg wired up to <a href="http:/
 /camel.apache.org">Apache Camel</a> event bus).</p>
-</div>
-</div>
-<div class="sect4">
-<h5 id="_ugfun_core-concepts_principles_apache-isis-vs_metawidget">vs MetaWidget</h5>
-<div class="paragraph">
-<p>MetaWidget (mentioned <a href="#_ugfun_core-concepts_philosophy_naked-objects-pattern_object-interface-mapping">earlier</a> has a number of ideas in common with Apache Isis, specifically the runtime generation of a UI for domain objects.  And like Apache Isis, MetaWidget builds its own metamodel of the domain objects and uses this to render the object.</p>
-</div>
-<div class="paragraph">
-<p>However, there is a difference in philosophy in that MW is not a full-stack framework and does not (in their words) try to "own the UI".  Rather they support a huge variety of UI technologies and allow the domain object to be rendered in any of them.</p>
-</div>
-<div class="paragraph">
-<p>In contrast, Apache Isis is full-stack and does generate a complete UI; we then allow you to customize or extend this UI (as per the various <a href="http://www.isisaddons.org">Isis Addons</a> (non-ASF), and we also provide a full REST API through the <a href="ugvro.html">Restful Objects viewer</a></p>
-</div>
-<div class="paragraph">
-<p>Also, it&#8217;s worth noting that MetaWidget does have an elegant pipeline architecture, with APIs to allow even its metamodel to be replaced.  It would be feasible and probably quite straightforward to use Apache Isis' own metamodel as an implementation of the MetaWidget API.  This would allow MetaWidget to be able to render an Apache Isis domain application.</p>
-</div>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="_ugfun_core-concepts_building-blocks">2.3. Building Blocks</h3>
-<div class="paragraph">
-<p>In this section we run through the main building blocks that make up an Apache Isis application.</p>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_building-blocks_metamodel">2.3.1. A MetaModel</h4>
-<div class="paragraph">
-<p>At its core, Apache Isis is a metamodel that is built at runtime from the domain classes (eg <code>Customer.java</code>), along
-with optional supporting metadata (eg <code>Customer.layout.json</code>).</p>
-</div>
-<div class="paragraph">
-<p>The contents of this metamodel is inferred from the Java classes discovered on the classpath: the entities and
-supporting services, as well the members of those classes.  The detail of the metamodel is generally explicit, usually
-represented by Java annotations such as <code>@Title</code> or <code>@Action</code>.  Notably the metamodel is
-<a href="ugbtb.html#_ugbtb_programming-model">extensible</a>; it is possible to teach Apache Isis new programming
-conventions/rules (and conversely to remove those that are built in).</p>
-</div>
-<div class="paragraph">
-<p>Most of the annotations recognized by the framework are defined by the Apache Isis framework itself.  For example the
-<code>@Title</code> annotation - which identifies how the framework should derive a human-readable label for each rendered
-domain object - is part of the <code>org.apache.isis.applib.annotations</code> package.  However the framework also recognizes
-certain other JEE annotations such as <code>@javax.inject.Inject</code> (used for dependency injection).</p>
-</div>
-<div class="paragraph">
-<p>The framework uses DataNucleus for its persistence mechanism.  This is an ORM that implements the JDO and JPA APIs, and
-which can map domain objects either to an RDBMS or to various NoSQL objectstores such as MongoDB or Neo4J.  Apache Isis
-recognizes a number of the JDO annotations such as <code>@javax.jdo.annotations.Column(allowsNull=&#8230;&#8203;)</code>.</p>
-</div>
-<div class="paragraph">
-<p>In addition, the framework builds up the metamodel for each domain object using
-<a href="#_ugfun_object-layout">layout hints</a>, such as <code>Customer.layout.json</code>.  These provide metadata such as
-grouping elements of the UI together, using multi-column layouts, and so on.  The layout file can be modified while the
-application is still running, and are picked up automatically; a useful way to speed up feedback.</p>
-</div>
-<div class="admonitionblock tip">
-<table>
-<tr>
-<td class="icon">
-<i class="fa icon-tip" title="Tip"></i>
-</td>
-<td class="content">
-<div class="paragraph">
-<p>At the time of writing Apache Isis only recognizes and supports the JDO API, though we expect JPA to be supported
-in the future.  We also expect to generalize support for <code>.layout.json</code> to be able to read such metadata from other
-sources.</p>
-</div>
-</td>
-</tr>
-</table>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_building-blocks_types-of-domain-objects">2.3.2. Type of Domain Objects</h4>
-<div class="paragraph">
-<p>Most domain objects that the end-user interacts with are <strong>domain entities</strong>, such as <code>Customer</code>, <code>Order</code>, <code>Product</code> and
-so on.  These are persistent objects and which are mapped to a database (usually relational), using JDO/DataNucleus
-annotations.  From the end-user&#8217;s perspective the UI displays a single domain object per page; they can then inspect
-and modify its state, and navigate to related objects.</p>
-</div>
-<div class="paragraph">
-<p>The next type of domain object to discuss is <strong>domain services</strong>.  These are (usually) singleton stateless services
-that provide additional functionality.  The behaviour of these services is rendered in various ways, though the most
-obvious is as the menu actions on the top-level menu bars in the <a href="ugvw.html">Wicket viewer</a>'s UI.</p>
-</div>
-<div class="paragraph">
-<p>Domain objects can also delegate to domain services; domain services are automatically injected into every other domain
-object; this includes domain entities as well as other services.  This injection of domain services into entities is
-significant: it allows business logic to be implemented in the domain entities, rather than have it "leach away" into
-supporting service layers.  Said another way: it is the means by which Apache Isis helps you avoid the anaemic
-domain model anti-pattern.</p>
-</div>
-<div class="paragraph">
-<p>As well as domain entities - mapped to a datastore - Apache Isis also supports <strong>view models</strong>.  End users interact with
-view models in the same way as a domain entity, indeed they are unlikely to distinguish one from the other.  However
-view models are <em>not</em> mapped to the underlying database, rather they represent some aggregation of state from one or
-more underlying entities.  Their state is serialized and recreated from their internal identifier; this identifier is
-visible as the object&#8217;s URL in the <a href="ugvw.html">Wicket viewer</a> or
-<a href="ugvro.html">RestfulObjects viewer</a>.</p>
-</div>
-<div class="paragraph">
-<p>There&#8217;s no need though for the view model to aggregate the state of regular domain entities.  A view model could also
-be used as a proxy for some externally managed entity, accessed over a web service or REST API; it could even be a
-representation of state held in-memory (such as user preferences, for example).</p>
-</div>
-<div class="paragraph">
-<p>There are also several types of domain services.  Most easily described are those domain services (discussed above)
-that are represented as the menu actions on top-level menu bars.  Another variation are <strong>contributed services</strong> - domain
-services that contribute behaviour or (derived) state to entities/view models.  Finally domain services may also
-simply provide additional non-UI functionality; an example being to perform an address geocoding lookup against the
-google-maps API.</p>
-</div>
-<div class="paragraph">
-<p>Also worth mentioning: domain services can also be either singletons (discussed above) or request-scoped; the latter
-being annotated with <code>@javax.enterprise.context.RequestScoped</code>.  An example of the request-scoped service is the
-<a href="rgsvc.html#_rgsvc_api_Scratchpad"><code>Scratchpad</code></a> service, for sharing arbitrary data between multiple objects.</p>
-</div>
-<div class="paragraph">
-<p>The final type of domain object is the <strong>mixin</strong>.  These are similar to contributed services in that they also contribute (or rather,
-mixin) both behaviour or (derived) state to entities/view models.  However, they provide a more control over contributed services,
-with a cleaner programming model similar to traits found in other languages.</p>
-</div>
-<div class="paragraph">
-<p>The diagram below summarizes the various types of domain object:</p>
-</div>
-<div class="imageblock">
-<div class="content">
-<a class="image" href="images/core-concepts/building-blocks/types-of-domain-object.png"><img src="images/core-concepts/building-blocks/types-of-domain-object.png" alt="types of domain object" width="860px"></a>
-</div>
-</div>
-<div class="paragraph">
-<p>The Apache Isis programming model uses annotations to distinguish these object types:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p><strong>view models</strong> are annotated either with <code>@DomainObject(nature=VIEW_MODEL)</code> or using <code>@ViewModel</code>.  Which is used is
-a matter of personal preference. <br></p>
-<div class="paragraph">
-<p>It is also possible to implement the <code>ViewModel</code> interface, for finer-grained control.</p>
-</div>
-</li>
-<li>
-<p><strong>domain entities</strong> that are persisted to the database (as the vast majority will) are annotated with
-<code>@DomainObject(nature=ENTITY)</code>. In addition such domain entities are annotated with the JDO/DataNucleus annotation of
-<code>@javax.jdo.annotations.PersistenceCapable</code>.<br></p>
-<div class="paragraph">
-<p>In addition, if a domain entity is a proxy for state managed in an external system, or merely for some state held
-in-memory, then <code>@DomainObject(nature=EXTERNAL_ENTITY)</code> or <code>@DomainObject(nature=INMEMORY_ENTITY)</code> can be used.</p>
-</div>
-</li>
-<li>
-<p><strong>mixins</strong> are annotated either with <code>@DomainObject(nature=MIXIN)</code> or using <code>@Mixin</code>.  As for view models, which is
-used is a matter of personal preference.</p>
-</li>
-<li>
-<p>finally, <strong>domain services</strong>` are annotated with <code>@DomainService(nature=&#8230;&#8203;)</code> where the nature is either
-<code>VIEW_MENU_ONLY</code> (for domain services whose actions appear on the top-level menu bars), or <code>VIEW_CONTRIBUTIONS_ONLY</code>
-(for domain services whose actions are contributed to entities or view models), or <code>DOMAIN</code> (for domain services whose
-functionality is simply for other domain objects to invoke programmatically).</p>
-<div class="paragraph">
-<p>It is also possible to specify a nature of simply <code>VIEW</code>, this combining <code>VIEW_MENU_ONLY</code> and <code>VIEW_CONTRIBUTIONS_ONLY</code>.
-This is in fact the default, useful for initial prototyping.  A final nature is <code>VIEW_REST_ONLY</code> which is for domain
-services whose functionality is surfaced only by the <a href="ugvro.html">RestfulObjects viewer</a>.</p>
-</div>
-</li>
-</ul>
-</div>
-<div class="paragraph">
-<p>Worth emphasising is that domain entities and view models hold state, whereas domain services are generally
-stateless.  If a domain service does hold state (eg the <code>Scratchpad</code> service noted above) then it should be
-<code>@RequestScoped</code> so that this state is short-lived and usable only within a single request.</p>
-</div>
-</div>
-<div class="sect3">
-<h4 id="_ugfun_core-concepts_building-blocks_objects-members">2.3.3. Object Members</h4>
-<div class="paragraph">
-<p>Every domain object in Apache Isis consists of (at most) three types of members:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p>properties, such as a `Customer&#8217;s `firstName</p>
-</li>
-<li>
-<p>collections, such as a <code>Customer&#8217;s `orders</code> collection of <code>Order</code>s</p>
-</li>
-<li>
-<p>actions, such as a <code>Customer'`s `placeOrder(&#8230;&#8203;)</code> method.</p>
-</li>
-</ul>
-</div>
-<div class="paragraph">
-<p>Some domain objects - specifically domain services and mixins - only have actions.  In the case of contributing services
-and mixins these actions can (depending upon their semantics and signatures) be represented as derived properties or
-collections on the entity/view model to which they contribute/mix-in.</p>
-</div>
-<div class="sect4">
-<h5 id="_properties">Properties</h5>
-<div class="paragraph">
-<p>Properties follow the standard getter/setter pattern, with the return type being a scalar (a value object or another
-entity or view model).</p>
-</div>
-<div class="paragraph">
-<p>For example, with:</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>
+    </style>  
+ </head> 
+ <body> 
+  <div class="row"> 
+   <div class="fixed contain-to-grid header"> 
+    <nav class="top-bar" data-topbar role="navigation" style="max-width: 80rem"> 
+     <ul class="title-area"> 
+      <li class="name"> <h1> <a href="/index.html">Apache Isis\u2122</a> </h1> </li> 
+      <!-- Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone --> 
+      <li class="toggle-topbar menu-icon"><a href="#"><span>Menu</span></a></li> 
+     </ul> 
+     <section class="top-bar-section"> 
+      <ul class="right"> 
+       <li class="has-form"> 
+        <form class="searchbox navbar-form navbar-right" id="searchbox_012614087480249044419:dn-q5gtwxya" action="http://www.google.com/cse"> 
+         <div class="row collapse"> 
+          <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> 
+      </ul> 
+      <!-- Left Nav Section --> 
+      <ul class="left"> 
+       <li><a href="/documentation.html">Documentation</a></li> 
+       <li><a href="/downloads.html">Downloads</a></li> 
+       <li><a href="/help.html">Help</a></li> 
+       <li><a href="/asf.html">@ASF</a></li> 
+      </ul> 
+     </section> 
+    </nav> 
+   </div> 
+  </div> 
+  <div class="row"> 
+   <div id="doc-content-left" class="large-9 medium-9 columns"> 
+    <div id="doc-content">
+     <button type="button" class="button secondary" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugfun.adoc&quot;" style="float: right; font-size: small; padding: 6px;  "><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button> 
+     <div class="sect1"> 
+      <h2 id="_ugfun">1. Fundamentals</h2>
+      <button type="button" class="button secondary" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/_ugfun.adoc&quot;" style="float: right; font-size: small; padding: 6px; margin-top: -55px; "><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button> 
+      <div class="sectionbody"> 
+       <div class="paragraph"> 
+        <p>This guide introduces the <a href="#_ugfun_core-concepts">core concepts</a> and ideas behind Apache Isis, and tells you how to <a href="#_ugfun_getting-started">get started</a> with a Maven archetype.</p> 
+       </div> 
+       <div class="paragraph"> 
+        <p>It also describes a number of <a href="#_ugfun_how-tos">how-to</a>s, describes how to influence the <a href="#_ugfun_object-layout">UI layout</a> of your domain objects (this is ultimately just a type of metadata), and it catalogues various <a href="#_ugfun_faqs.adoc">FAQ</a>s.</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="#">Fundamentals</a> (this guide)</p> </li> 
+          <li> <p><a href="ugvw.html">Wicket viewer</a></p> </li> 
+          <li> <p><a href="ugvro.html">Restful Objects viewer</a></p> </li> 
+          <li> <p><a href="ugdno.html">DataNucleus object store</a></p> </li> 
+          <li> <p><a href="ugsec.html">Security</a></p> </li> 
+          <li> <p><a href="ugtst.html">Testing</a></p> </li> 
+          <li> <p><a href="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.html">Annotations</a></p> </li> 
+          <li> <p><a href="rgsvc.html">Domain Services</a></p> </li> 
+          <li> <p><a href="rgcfg.html">Configuration Properties</a></p> </li> 
+          <li> <p><a href="rgcms.html">Classes, Methods and Schema</a></p> </li> 
+          <li> <p><a href="rgmvn.html">Apache Isis Maven plugin</a></p> </li> 
+          <li> <p><a href="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.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.html">Committers' Guide</a> (release procedures and related practices)</p> </li> 
+         </ul> 
+        </div> 
+       </div> 
+      </div> 
+     </div> 
+     <div class="sect1"> 
+      <h2 id="_ugfun_core-concepts">2. Core Concepts</h2>
+      <button type="button" class="button secondary" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/_ugfun_core-concepts.adoc&quot;" style="float: right; font-size: small; padding: 6px; margin-top: -55px; "><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button> 
+      <div class="sectionbody"> 
+       <div class="paragraph"> 
+        <p>This introductory chapter should give you a good about what Apache Isis actually <strong>is</strong>: the fundamental ideas and principles that it builds upon, how it compares with other frameworks, what the fundamental building blocks are for actually writing an Isis application, and what services and features the framework provides for you to leverage in your own apps.</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>Parts of this chapter have been adapted from Dan Haywood\u2019s 2009 book, 'Domain Driven Design using Naked Objects'. We\u2019ve also added some new insights and made sure the material we\u2019ve used is relevant to Apache Isis.</p> 
+            </div> </td> 
+          </tr> 
+         </tbody>
+        </table> 
+       </div> 
+       <div class="sect2"> 
+        <h3 id="_ugfun_core-concepts_philosophy">2.1. Philosophy and Architecture</h3> 
+        <div class="paragraph"> 
+         <p>This section describes some of the core ideas and architectural patterns upon which Apache Isis builds.</p> 
+        </div> 
+        <div class="sect3"> 
+         <h4 id="_ugfun_core-concepts_philosophy_domain-driven-design">2.1.1. Domain-Driven Design</h4> 
+         <div class="paragraph"> 
+          <p>There\u2019s no doubt that we developers love the challenge of understanding and deploying complex technologies. But understanding the nuances and subtleties of the business domain itself is just as great a challenge, perhaps more so. If we devoted our efforts to understanding and addressing those subtleties, we could build better, cleaner, and more maintainable software that did a better job for our stakeholders. And there\u2019s no doubt that our stakeholders would thank us for it.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>A couple of years back Eric Evans wrote his book <a href="http://www.amazon.co.uk/Domain-driven-Design-Tackling-Complexity-Software/dp/0321125215">Domain-Driven Design</a>, which is well on its way to becoming a seminal work. In fact, most if not all of the ideas in Evans' book have been expressed before, but what he did was pull those ideas together to show how predominantly object-oriented techniques can be used to develop rich, deep, insightful, and ultimately useful business applications.</p> 
+         </div> 
+         <div class="paragraph"> 
+          <p>There are two central ideas at the heart of domain-driven design.</p> 
+         </div> 
+         <div class="ulist"> 
+          <ul> 
+           <li> <p>the <strong><em>ubiquitous language</em></strong> is about getting the whole team (both domain experts and developers) to communicate more transparently using a domain model.</p> </li> 
+           <li> <p>Meanwhile, <strong><em>model-driven design</em></strong> is about capturing that model in a very straightforward manner 

<TRUNCATED>