content/versions/1.17.0/guides/rgcms/rgcms.html (8,024 lines of code) (raw):

<!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>Classes, Methods and Schema</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;"> rgcms </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?users@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">v1.17.0</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="rgcms.pdf"><img src="../../images/PDF-50.png"></a></span> <div class="page-title"> <h1>Classes, Methods and Schema</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/rgcms/rgcms.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/rgcms/rgcms.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/rgcms/rgcms.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/rgcms/rgcms.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/rgcms/rgcms.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="__rgcms">1. Classes, Methods and Schema</h2> <div class="sectionbody"> <div class="paragraph"> <p>This reference guide lists and describes various elements of the the Apache Isis Programming Model, specifically reserved and prefix <a href="../rgcms/rgcms.html#_rgcms_methods">methods</a> (such as <code>title()</code> and <code>validate…​()</code>) and various utility and supporting <a href="../rgcms/rgcms.html#_rgcms_classes">classes</a>.</p> </div> <div class="paragraph"> <p>It also describes the <a href="../rgcms/rgcms.html#_rgcms_schema">XSD schema</a> defined by Apache Isis. One use case is for the JAXB serialization of view models.</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></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> (this guide)</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="_rgcms_methods">2. Methods</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/rgcms/_rgcms_methods.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/rgcms/_rgcms_methods.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/rgcms/_rgcms_methods.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/rgcms/_rgcms_methods.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/rgcms/_rgcms_methods.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>The Apache Isis metamodel is built up from declaratively (ie, <a href="../rgant/rgant.html#_rgant">annotations</a>) and imperatively, from "supporting" methods and other reserved methods.</p> </div> <div class="paragraph"> <p>This chapter documents the supporting methods and the reserved methods. It also documents (separately) the reserved methods that act as callback hooks into the persistence lifecycle of domain entities.</p> </div> <div class="sect2"> <h3 id="_rgcms_methods_prefixes">2.1. Supporting Method Prefixes</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/rgcms/_rgcms_methods_prefixes.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/rgcms/_rgcms_methods_prefixes.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/rgcms/_rgcms_methods_prefixes.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/rgcms/_rgcms_methods_prefixes.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/rgcms/_rgcms_methods_prefixes.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>Supporting methods are those that are associated with properties, collections and actions, providing additional imperative business rule checking and behaviour to be performed when the user interacts with those object members.</p> </div> <div class="paragraph"> <p>This association is performed by name matching. Thus, a property called "firstName", derived from a method <code>getFirstName()</code> may have supporting methods <code>hideFirstName()</code>, <code>disableFirstName()</code> and <code>validateFirstName()</code>. Supporting methods are, therefore, each characterized by their own particular prefix.</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>Using name matching to associate supporting methods generally works very well, but of course if an object member’s method is renamed, there’s always the risk that the developer forgets to rename the supporting method; the supporting methods become "orphaned".</p> </div> <div class="paragraph"> <p>Apache Isis checks for this automatically, and will fail-fast (fail to boot) if any orphaned methods are located. A suitable error message is logged so that the issue can be easily diagnosed.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The table below lists the method prefixes that are recognized as part of Apache Isis' default programming model.</p> </div> <table class="tableblock frame-all grid-all spread"> <caption class="title"> Table 1. Recognized Method Prefixes </caption> <colgroup> <col style="width: 18.1818%;"> <col style="width: 9.0909%;"> <col style="width: 9.0909%;"> <col style="width: 9.0909%;"> <col style="width: 9.0909%;"> <col style="width: 9.0909%;"> <col style="width: 36.3637%;"> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Prefix</th> <th class="tableblock halign-left valign-top">Object</th> <th class="tableblock halign-left valign-top">Property</th> <th class="tableblock halign-left valign-top">Collection</th> <th class="tableblock halign-left valign-top">Action</th> <th class="tableblock halign-left valign-top">Action<br> Param</th> <th class="tableblock halign-left valign-top">Description</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_addTo"><code>addTo…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>add object to a collection <br></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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_removeFrom"><code>removeFrom…​()</code></a>`</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_autoComplete"><code>autoComplete…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Return a list of matching elements for a property or an action parameter.<br></p> </div> <div class="paragraph"> <p>Alternatively, can specify for a class using <a href="../rgant/rgant.html#_rgant-DomainObject_autoCompleteRepository"><code>@DomainObject</code><br> <code>#autoCompleteRepository</code></a><br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_choices"><code>choices…​()</code></a></p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_choices"><code>choices…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Provide list of choices for a property or action parameter.<br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_autoComplete"><code>autoComplete…​()</code></a>.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_clear"><code>clear…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Clear a property (set it to null).<br></p> </div> <div class="paragraph"> <p>Allows business logic to be placed apart from the setter.<br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_modify"><code>modify…​()</code></a></p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_default"><code>default…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Default value for a property or an action parameter.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_disable"><code>disable…​()</code></a></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Disables (makes read-only) a property, a collection or an action.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_get"><code>get…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Access the value of a property or collection.<br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_set"><code>set…​()</code></a>.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_hide"><code>hide…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Hides a property, a collection or an action.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_modify"><code>modify…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Modify a property (set it to a non-null) value.<br></p> </div> <div class="paragraph"> <p>Allows business logic to be placed apart from the setter.<br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_clear"><code>clear…​()</code></a>`.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_removeFrom"><code>removeFrom…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>remove object from a collection.<br></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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_addTo"><code>addTo…​()</code></a>`</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_set"><code>set…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Sets the value of a property or a collection.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validate"><code>validate…​()</code></a></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Check that a proposed value of a property or a set of action parameters or a single action parameter is valid.<br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validateAddTo"><code>validateAddTo…​()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validateRemoveFrom"><code>validateRemoveFrom…​()</code></a> to validate modifications to collections.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validateAddTo"><code>validate<br> AddTo…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Check that a proposed object to add to a collection is valid.<br></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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validateRemoveFrom"><code>validateRemoveFrom…​()</code></a>, and <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validate"><code>validate…​()</code></a> for properties and actions.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validateRemoveFrom"><code>validate<br> RemoveFrom…​()</code></a></p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Y</p></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Check that a proposed object to remove from a collection is valid.<br></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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validateAddTo"><code>validateAddTo…​()</code></a>, and <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validate"><code>validate…​()</code></a> for properties and actions.</p> </div> </div></td> </tr> </tbody> </table> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_addTo">2.1.1. <code>addTo…​()</code> (deprecated)</h4> <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/rgcms/_rgcms_methods_prefixes_addTo.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/rgcms/_rgcms_methods_prefixes_addTo.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/rgcms/_rgcms_methods_prefixes_addTo.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/rgcms/_rgcms_methods_prefixes_addTo.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/rgcms/_rgcms_methods_prefixes_addTo.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>addTo…​()</code> supporting method is called whenever an object is added to a collection. Its purpose is to allow additional business logic to be performed.</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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>. The suggested workaround is to simply define an action.</p> </div> </td> </tr> </tbody> </table> </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">LibraryMember</span> { <span class="directive">public</span> <span class="predefined-type">SortedSet</span>&lt;<span class="predefined-type">Book</span>&gt; getBorrowed() { ... } <span class="directive">public</span> <span class="type">void</span> setBorrowed(<span class="predefined-type">SortedSet</span>&lt;<span class="predefined-type">Book</span>&gt; borrowed) { ... } <span class="directive">public</span> <span class="type">void</span> addToBorrowed(<span class="predefined-type">Book</span> book) { getBorrowed().add(book); <i class="conum" data-value="1"></i><b>(1)</b> reminderService.addReminder(<span class="local-variable">this</span>, book, clock.today().plusDays(<span class="integer">21</span>)); <i class="conum" data-value="2"></i><b>(2)</b> } <span class="directive">public</span> <span class="type">void</span> removeFromBorrowed(<span class="predefined-type">Book</span> book) { ... } ... }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>update the collection</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>perform some additional business logic</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_removeFrom"><code>removeFrom…​()</code></a>`</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_autoComplete">2.1.2. <code>autoComplete…​()</code></h4> <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/rgcms/_rgcms_methods_prefixes_autoComplete.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/rgcms/_rgcms_methods_prefixes_autoComplete.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/rgcms/_rgcms_methods_prefixes_autoComplete.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/rgcms/_rgcms_methods_prefixes_autoComplete.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/rgcms/_rgcms_methods_prefixes_autoComplete.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>autoComplete…​()</code> supporting method is called for action parameters and for properties to find objects from a drop-down list box. The use case is when the number of candidate objects is expected to be large, so the user is required to enter some characters to narrow the search down.</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>If the number of candidate objects is comparatively small, then use <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_choices"><code>choices…​()</code></a> supporting method instead.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The signature of the supporting method depends on whether it is for a parameter or a property.</p> </div> <div class="sect4"> <h5 id="_parameters">Parameters</h5> <div class="paragraph"> <p>For an action parameter in (0-based) position <em>N</em>, and of type <code>T</code>, the signature is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">List</span>&lt;T&gt; autoCompleteNXxx(<span class="predefined-type">String</span> search) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>It is also valid to return <code>T[]</code>, a <code>Set&lt;T&gt;</code> or a <code>Collection&lt;T&gt;</code>.</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">ShoppingCartItem</span> { <span class="annotation">@Property</span>(editing=Editing.DISABLED) <span class="directive">public</span> Product getProduct() { ... } <span class="directive">public</span> <span class="type">void</span> setProduct(Product product) { ... } <span class="annotation">@Property</span>(editing=Editing.DISABLED) <span class="directive">public</span> <span class="type">int</span> getQuantity() { ... } <span class="directive">public</span> <span class="type">void</span> setQuantity(<span class="type">int</span> quantity) { ... } <span class="annotation">@Action</span>(semantics=SemanticsOf.IDEMPOTENT) <span class="directive">public</span> ShoppingCartItem updateProduct( Product product, <span class="annotation">@ParameterLayout</span>(named=<span class="string"><span class="delimiter">"</span><span class="content">Quantity</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="type">int</span> quantity) { setProduct(product); setQuantity(quantity); } <span class="directive">public</span> <span class="predefined-type">Collection</span>&lt;Product&gt; autoComplete0UpdateProduct( <i class="conum" data-value="1"></i><b>(1)</b> <span class="annotation">@MinLength</span>(<span class="integer">3</span>) <span class="predefined-type">String</span> search <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><code>product</code> is the 0th argument of the action.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the <a href="../rgant/rgant.html#_rgant-MinLength"><code>@MinLength</code></a> annotation specifies the minimum number of characters that must be entered before a search is performed for matching objects</td> </tr> </tbody> </table> </div> </div> <div class="sect4"> <h5 id="_properties">Properties</h5> <div class="paragraph"> <p>For a property of type <code>T</code>, the signature is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">List</span>&lt;T&gt; autoCompleteXxx(<span class="predefined-type">String</span> search) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>(As for action parameters) it is also valid to return <code>T[]</code>, a <code>Set&lt;T&gt;</code> or a <code>Collection&lt;T&gt;</code>.</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">ShoppingCartItem</span> { <span class="directive">public</span> Product getProduct() { ... } <span class="directive">public</span> <span class="type">void</span> setProduct(Product product) { ... } <span class="directive">public</span> <span class="predefined-type">Collection</span>&lt;Product&gt; autoCompleteProduct( <span class="annotation">@MinLength</span>(<span class="integer">3</span>) <span class="predefined-type">String</span> search <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>the <a href="../rgant/rgant.html#_rgant-MinLength"><code>@MinLength</code></a> annotation specifies the minimum number of characters that must be entered before a search is performed for matching objects</td> </tr> </tbody> </table> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_choices">2.1.3. <code>choices…​()</code></h4> <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/rgcms/_rgcms_methods_prefixes_choices.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/rgcms/_rgcms_methods_prefixes_choices.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/rgcms/_rgcms_methods_prefixes_choices.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/rgcms/_rgcms_methods_prefixes_choices.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/rgcms/_rgcms_methods_prefixes_choices.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>choices…​()</code> supporting method is called for both action parameters and for properties, to find objects from a drop-down list box. Unlike <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_autoComplete"><code>autoComplete…​()</code></a>, the use case is when the number of objects is comparatively small and can be selected from a drop-down without any additional filtering.</p> </div> <div class="paragraph"> <p>The signature of the supporting method depends on whether it is for an action parameter or a property.</p> </div> <div class="sect4"> <h5 id="_parameters_2">Parameters</h5> <div class="paragraph"> <p>For an action parameter in (0-based) position <em>N</em>, and of type <code>T</code>, the signature is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">Collection</span>&lt;T&gt; choicesNXxx() { ... }</code></pre> </div> </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">ShoppingCartItem</span> { <span class="annotation">@Property</span>(editing=Editing.DISABLED) <span class="directive">public</span> Product getProduct() { ... } <span class="directive">public</span> <span class="type">void</span> setProduct(Product product) { ... } <span class="annotation">@Property</span>(editing=Editing.DISABLED) <span class="directive">public</span> <span class="type">int</span> getQuantity() { ... } <span class="directive">public</span> <span class="type">void</span> setQuantity(<span class="type">int</span> quantity) { ... } <span class="annotation">@Action</span>(semantics=SemanticsOf.IDEMPOTENT) <span class="directive">public</span> ShoppingCartItem updateProduct( Product product, <span class="annotation">@ParameterLayout</span>(named=<span class="string"><span class="delimiter">"</span><span class="content">Quantity</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="predefined-type">Integer</span> quantity) { setProduct(product); setQuantity(quantity); } <span class="directive">public</span> <span class="predefined-type">Collection</span>&lt;<span class="predefined-type">Integer</span>&gt; choices1UpdateProduct() { <span class="keyword">return</span> <span class="predefined-type">Arrays</span>.asList(<span class="integer">1</span>,<span class="integer">2</span>,<span class="integer">3</span>,<span class="integer">5</span>,<span class="integer">10</span>,<span class="integer">25</span>,<span class="integer">50</span>,<span class="integer">100</span>); } ... }</code></pre> </div> </div> <div class="sect5"> <h6 id="_dependent_choices">Dependent Choices</h6> <div class="paragraph"> <p>Action parameters also support the notion of dependent choices, whereby the list of choices is dependent upon the value of some other argument.</p> </div> <div class="paragraph"> <p>An example can be found in the (non-ASF) <a href="http://github.com/isisaddons/isis-app-todoapp">Isis addons' todoapp</a>, whereby `ToDoItem`s are categorized and then can also be subcategorized:</p> </div> <div class="imageblock"> <div class="content"> <a class="image" href="images/reference-methods/prefixes/choices/dependent.png"><img src="images/reference-methods/prefixes/choices/dependent.png" alt="dependent" width="800px"></a> </div> </div> <div class="paragraph"> <p>This functionality is actually implemented as a <a href="../ugfun/ugfun.html#_ugfun_how-tos_contributed-members">contributed action</a>, so the code for this is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature = NatureOfService.VIEW_CONTRIBUTIONS_ONLY) <span class="directive">public</span> <span class="type">class</span> <span class="class">UpdateCategoryContributions</span> ... { <span class="annotation">@ActionLayout</span>( describedAs = <span class="string"><span class="delimiter">"</span><span class="content">Update category and subcategory</span><span class="delimiter">"</span></span> ) <span class="annotation">@Action</span>(semantics = SemanticsOf.IDEMPOTENT) <span class="directive">public</span> Categorized updateCategory( <span class="directive">final</span> Categorized item, <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">final</span> Category category, <span class="annotation">@Parameter</span>(optionality = Optionality.OPTIONAL) <span class="directive">final</span> Subcategory subcategory) { item.setCategory(category); item.setSubcategory(subcategory); <span class="keyword">return</span> item; } <span class="directive">public</span> <span class="predefined-type">List</span>&lt;Subcategory&gt; choices2UpdateCategory( <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">final</span> Categorized item, <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">final</span> Category category) { <i class="conum" data-value="4"></i><b>(4)</b> <span class="keyword">return</span> Subcategory.listFor(category); } ... }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td><code>ToDoItem</code> implements <code>Categorized</code></td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>subcategory is the 2-th argument (0-based)</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>the item contributed to</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>the category selected</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>Dependent choices are not restricted to enums, however. Going back to the shopping cart example shown above, the choices for the <code>quantity</code> parameter could be dependent upon the selected <code>Product</code>:</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">ShoppingCartItem</span> { ... <span class="annotation">@Action</span>(semantics=SemanticsOf.IDEMPOTENT) <span class="directive">public</span> ShoppingCartItem updateProduct( Product product, <span class="annotation">@ParameterLayout</span>(named=<span class="string"><span class="delimiter">"</span><span class="content">Quantity</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="predefined-type">Integer</span> quantity) { setProduct(product); setQuantity(quantity); } <span class="directive">public</span> <span class="predefined-type">Collection</span>&lt;<span class="predefined-type">Integer</span>&gt; choices1UpdateProduct(Product product) { <span class="keyword">return</span> productService.quantityChoicesFor(product); <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><code>productService</code> is a (fictitous) injected service that knows what the quantity choices should be for any given product</td> </tr> </tbody> </table> </div> </div> </div> <div class="sect4"> <h5 id="_properties_2">Properties</h5> <div class="paragraph"> <p>For a property of type <code>T</code>, the signature is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">Collection</span>&lt;T&gt; choicesXxx() { ... }</code></pre> </div> </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">ShoppingCartItem</span> { <span class="directive">public</span> Product getProduct() { ... } <span class="directive">public</span> <span class="type">void</span> setProduct(Product product) { ... } <span class="directive">public</span> <span class="predefined-type">Collection</span>&lt;Product&gt; choicesProduct() { ... }</code></pre> </div> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_clear">2.1.4. <code>clear…​()</code> (deprecated)</h4> <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/rgcms/_rgcms_methods_prefixes_clear.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/rgcms/_rgcms_methods_prefixes_clear.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/rgcms/_rgcms_methods_prefixes_clear.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/rgcms/_rgcms_methods_prefixes_clear.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/rgcms/_rgcms_methods_prefixes_clear.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>clear…​()</code> supporting method is called — instead of the setter — whenever an (optional) property is to be set to <code>null</code>. Its purpose is to allow additional business logic to be performed.</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>DataNucleus' smart handling of setters means that this supporting methods are in essence redundant, and so should be considered deprecated.</p> </div> </td> </tr> </tbody> </table> </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">LibraryMember</span> { <span class="directive">public</span> Title getFavoriteTitle() { ... } <span class="directive">public</span> <span class="type">void</span> setFavoriteTitle(Title title) { ... } <span class="directive">public</span> <span class="type">void</span> modifyFavoriteTitle(Title title) { ... } <span class="directive">public</span> <span class="type">void</span> clearFavoriteTitle() { <span class="keyword">if</span>(getTitle() == <span class="predefined-constant">null</span>) { <span class="keyword">return</span>; } setFavoriteTitle(<span class="predefined-constant">null</span>); <i class="conum" data-value="1"></i><b>(1)</b> titleFavoritesService.decrement(title); <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>update the property</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>perform some additional business logic</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_modify"><code>modify…​()</code></a>`</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_default">2.1.5. <code>default…​()</code></h4> <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/rgcms/_rgcms_methods_prefixes_default.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/rgcms/_rgcms_methods_prefixes_default.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/rgcms/_rgcms_methods_prefixes_default.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/rgcms/_rgcms_methods_prefixes_default.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/rgcms/_rgcms_methods_prefixes_default.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>default…​()</code> supporting method is called for action parameters to return the initial argument value. This may be some sensible default (eg today’s date, or 0 or 1), or — for an action that is modifying the state of an object — might default to the current value of a corresponding property.</p> </div> <div class="paragraph"> <p>The method is <em>also</em> called for properties in the case when an object is newly instantiated using <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService#instantiate(…​)</code></a> or <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryService#instantiate(…​)</code></a>. This is a much less common use case. If a default is not specified then properties are initialized to a default based on their type (eg 0 or <code>false</code>).</p> </div> <div class="paragraph"> <p>The signature of the supporting method depends on whether it is for an action parameter or a property.</p> </div> <div class="sect4"> <h5 id="_parameters_3">Parameters</h5> <div class="paragraph"> <p>For an action parameter in (0-based position n), and of type <code>T</code>, the signature is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> T defaultNXxx() { ... }</code></pre> </div> </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">ShoppingCartItem</span> { <span class="annotation">@Property</span>(editing=Editing.DISABLED) <span class="directive">public</span> Product getProduct() { ... } <span class="directive">public</span> <span class="type">void</span> setProduct(Product product) { ... } <span class="annotation">@Property</span>(editing=Editing.DISABLED) <span class="directive">public</span> <span class="type">int</span> getQuantity() { ... } <span class="directive">public</span> <span class="type">void</span> setQuantity(<span class="type">int</span> quantity) { ... } <span class="annotation">@Action</span>(semantics=SemanticsOf.IDEMPOTENT) <span class="directive">public</span> ShoppingCartItem updateProduct( Product product, <span class="annotation">@ParameterLayout</span>(named=<span class="string"><span class="delimiter">"</span><span class="content">Quantity</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="predefined-type">Integer</span> quantity) { setProduct(product); setQuantity(quantity); } <span class="directive">public</span> Product default0UpdateProduct() { <i class="conum" data-value="1"></i><b>(1)</b> <span class="keyword">return</span> getProduct(); } <span class="directive">public</span> <span class="type">int</span> default1UpdateProduct() { <i class="conum" data-value="2"></i><b>(2)</b> <span class="keyword">return</span> getQuantity(); } ... }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>default the 0-th parameter using the current value of the <code>product</code> property</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>default the 1-th parameter using the current value of the <code>quantity</code> property</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>Defaults are also supported (of course) for <a href="../ugfun/ugfun.html#_ugfun_how-tos_contributed-members">contributed actions</a>. For example, here is a contributed action for updating category/subcategory of the (non-ASF) <a href="http://github.com/isisaddons/isis-app-todoapp">Isis addons' todoapp</a>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span>(nature = NatureOfService.VIEW_CONTRIBUTIONS_ONLY) <span class="directive">public</span> <span class="type">class</span> <span class="class">UpdateCategoryContributions</span> ... { <span class="annotation">@ActionLayout</span>( describedAs = <span class="string"><span class="delimiter">"</span><span class="content">Update category and subcategory</span><span class="delimiter">"</span></span> ) <span class="annotation">@Action</span>(semantics = SemanticsOf.IDEMPOTENT) <span class="directive">public</span> Categorized updateCategory( <span class="directive">final</span> Categorized item, <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">final</span> Category category, <span class="annotation">@Parameter</span>(optionality = Optionality.OPTIONAL) <span class="directive">final</span> Subcategory subcategory) { item.setCategory(category); item.setSubcategory(subcategory); <span class="keyword">return</span> item; } <span class="directive">public</span> Category default1UpdateCategory( <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">final</span> Categorized item) { <span class="keyword">return</span> item != <span class="predefined-constant">null</span>? item.getCategory(): <span class="predefined-constant">null</span>; } <span class="directive">public</span> Subcategory default2UpdateCategory( <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">final</span> Categorized item) { <span class="keyword">return</span> item != <span class="predefined-constant">null</span>? item.getSubcategory(): <span class="predefined-constant">null</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><code>ToDoItem</code> implements <code>Categorized</code></td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>defaults the 1-th parameter using the item’s <code>category</code> property</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>defaults the 2-th parameter using the item’s <code>subcategory</code> property</td> </tr> </tbody> </table> </div> </div> <div class="sect4"> <h5 id="_properties_3">Properties</h5> <div class="paragraph"> <p>For a property of type <code>T</code>, the signature is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> T defaultXxx() { ... }</code></pre> </div> </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">ShoppingCartItem</span> { <span class="directive">public</span> <span class="type">int</span> getQuantity() { ... } <span class="directive">public</span> <span class="type">void</span> setQuantity(<span class="type">int</span> quantity) { ... } <span class="directive">public</span> <span class="type">int</span> defaultProduct() { <span class="keyword">return</span> <span class="integer">1</span>; }</code></pre> </div> </div> <div class="sect5"> <h6 id="_alternatives">Alternatives</h6> <div class="paragraph"> <p>There are, in fact, two other ways to set properties of a newly instantiated object to default values.</p> </div> <div class="paragraph"> <p>The first is to use the <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_created"><code>created()</code></a> callback, called by the framework when <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService#instantiate(…​)</code></a> or <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryService#instantiate(…​)</code></a> is called. This method is called after any services have been injected into the domain object.</p> </div> <div class="paragraph"> <p>The second is more straightforward: simply initialize properties in the constructor. However, this cannot use any injected services as they will not have been initialized.</p> </div> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_disable">2.1.6. <code>disable…​()</code></h4> <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/rgcms/_rgcms_methods_prefixes_disable.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/rgcms/_rgcms_methods_prefixes_disable.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/rgcms/_rgcms_methods_prefixes_disable.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/rgcms/_rgcms_methods_prefixes_disable.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/rgcms/_rgcms_methods_prefixes_disable.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>disable…​()</code> supporting method is called for properties, collections and actions. It allows the modification of the property/collection to be vetoed (ie made read-only) and to prevent the invocation of the action ("grey it out").</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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>; they are always implicitly disabled.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>Typically modification/invocation is vetoed based on the state of the domain object being interacted with, though it could be any reason at all (eg the current date/time of the interaction, or the state of some other related data such as stock levels, or the identity of the calling user).</p> </div> <div class="paragraph"> <p>The reason for vetoing a modification/invocation is normally returned as a string. However, Apache Isis' <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18n support</a> extends this so that reasons can be internationalized.</p> </div> <div class="paragraph"> <p>The signature of the supporting method is simply:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">String</span> disableXxx() { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where the returned string is the reason the property cannot be edited, or the action invoked.</p> </div> <div class="paragraph"> <p>For i18n, the supporting method returns a <code>TranslatableString</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> TranslatableString disableXxx() { ... }</code></pre> </div> </div> <div class="paragraph"> <p>The returned string is then automatically translated to the locale of the current user.</p> </div> <div class="paragraph"> <p>For example, to disable an action:</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">boolean</span> isBlacklisted() { ... } <span class="directive">public</span> Order placeOrder( <span class="directive">final</span> Product product, <span class="annotation">@ParameterLayout</span>(named=<span class="string"><span class="delimiter">"</span><span class="content">Quantity</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="type">int</span> quantity) { ... } <span class="directive">public</span> <span class="predefined-type">String</span> disablePlaceOrder() { <span class="keyword">return</span> isBlacklisted() ? <span class="string"><span class="delimiter">"</span><span class="content">Blacklisted customers cannot place orders</span><span class="delimiter">"</span></span> : <span class="predefined-constant">null</span>; } ... }</code></pre> </div> </div> <div class="paragraph"> <p>Or, to disable a property:</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">boolean</span> isBlacklisted() { ... } <span class="directive">public</span> <span class="predefined-type">BigDecimal</span> getCreditLimit() { ... } <span class="directive">public</span> <span class="type">void</span> setCreditLimit(<span class="predefined-type">BigDecimal</span> creditLimit) { ... } <span class="directive">public</span> <span class="predefined-type">String</span> disableCreditLimit() { <span class="keyword">return</span> isBlacklisted() ? <span class="string"><span class="delimiter">"</span><span class="content">Cannot change credit limit for blacklisted customers</span><span class="delimiter">"</span></span> : <span class="predefined-constant">null</span>; } ... }</code></pre> </div> </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>In the case of actions, the framework will also search for supporting method that has the exact same parameter types as the action itself. Enabling <code>isis.reflector.validator.noParamsOnly</code> configuration property switches this off, so that the framework will only search for supporting method with no parameters.</p> </div> <div class="paragraph"> <p>Note that enabling this configuration property in effect means that <a href="../ugfun/ugfun.html#_ugfun_building-blocks_types-of-domain-objects_mixins">mixins</a> must be used instead of <a href="../ugfun/ugfun.html#_ugfun_programming-model_domain-services_contributions">contributed services</a> (because contributed actions are the one case where the value of a parameter to a supporting method may be non-null).</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_get">2.1.7. <code>get…​()</code></h4> <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/rgcms/_rgcms_methods_prefixes_get.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/rgcms/_rgcms_methods_prefixes_get.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/rgcms/_rgcms_methods_prefixes_get.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/rgcms/_rgcms_methods_prefixes_get.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/rgcms/_rgcms_methods_prefixes_get.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>get…​()</code> prefix is simply the normal JavaBean getter prefix that denotes properties or collections.</p> </div> <div class="paragraph"> <p>When Apache Isis builds its metamodel, it first searches for the getter methods, characterizing them as either properties or collections based on the return type. It then refines the metamodel based on the presence of annotations and supporting methods.</p> </div> <div class="paragraph"> <p>All remaining <code>public</code> methods (that do not use one of the Apache Isis prefixes) are interpreted as actions.</p> </div> <div class="paragraph"> <p>Any methods "left over" that <em>do</em> use one of the Apache Isis prefixes, are interpreted to be orphaned. Apache Isis "fails-fast" and will not boot, instead printing an error message to the log so that the issue can be easily diagnosed.</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_set"><code>set…​()</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_hide">2.1.8. <code>hide…​()</code></h4> <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/rgcms/_rgcms_methods_prefixes_hide.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/rgcms/_rgcms_methods_prefixes_hide.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/rgcms/_rgcms_methods_prefixes_hide.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/rgcms/_rgcms_methods_prefixes_hide.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/rgcms/_rgcms_methods_prefixes_hide.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>hide…​()</code> supporting method is called for properties, collections and actions. It allows the property/collection to be completely hidden from view.</p> </div> <div class="paragraph"> <p>It’s comparatively rare for properties or collections to be imperatively hidden from view, but actions are sometimes hidden or shown visible (as opposed to being just <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_disable">disabled</a>, ie greyed out).</p> </div> <div class="paragraph"> <p>The signature of the supporting method is simply:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">boolean</span> hideXxx() { ... }</code></pre> </div> </div> <div class="paragraph"> <p>Returning <code>true</code> will hide the property, collection or action, returning <code>false</code> leaves it visible.</p> </div> <div class="paragraph"> <p>For example, to hide an action:</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">boolean</span> isBlacklisted() { ... } <span class="directive">public</span> Order placeOrder( <span class="directive">final</span> Product product, <span class="annotation">@ParameterLayout</span>(named=<span class="string"><span class="delimiter">"</span><span class="content">Quantity</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="type">int</span> quantity) { ... } <span class="directive">public</span> <span class="type">boolean</span> hidePlaceOrder() { <span class="keyword">return</span> isBlacklisted(); } ... }</code></pre> </div> </div> <div class="paragraph"> <p>Or, to hide a property:</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">boolean</span> isBlacklisted() { ... } <span class="directive">public</span> <span class="predefined-type">BigDecimal</span> getCreditLimit() { ... } <span class="directive">public</span> <span class="type">void</span> setCreditLimit(<span class="predefined-type">BigDecimal</span> creditLimit) { ... } <span class="directive">public</span> <span class="type">boolean</span> hideCreditLimit() { <span class="keyword">return</span> isBlacklisted(); } ... }</code></pre> </div> </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>In the case of actions, the framework will also search for supporting method that has the exact same parameter types as the action itself. Enabling <code>isis.reflector.validator.noParamsOnly</code> configuration property switches this off, so that the framework will only search for supporting method with no parameters.</p> </div> <div class="paragraph"> <p>Note that enabling this configuration property in effect means that <a href="../ugfun/ugfun.html#_ugfun_building-blocks_types-of-domain-objects_mixins">mixins</a> must be used instead of <a href="../ugfun/ugfun.html#_ugfun_programming-model_domain-services_contributions">contributed services</a> (because contributed actions are the one case where the value of a parameter to a supporting method may be non-null).</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_modify">2.1.9. <code>modify…​()</code> (deprecated)</h4> <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/rgcms/_rgcms_methods_prefixes_modify.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/rgcms/_rgcms_methods_prefixes_modify.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/rgcms/_rgcms_methods_prefixes_modify.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/rgcms/_rgcms_methods_prefixes_modify.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/rgcms/_rgcms_methods_prefixes_modify.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>modify…​()</code> supporting method is called — instead of the setter — whenever a property has been set to be set to a new value. Its purpose is to allow additional business logic to be performed.</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>DataNucleus' smart handling of setters means that this supporting methods are in essence redundant, and so should be considered deprecated.</p> </div> </td> </tr> </tbody> </table> </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">LibraryMember</span> { <span class="directive">public</span> Title getFavoriteTitle() { ... } <span class="directive">public</span> <span class="type">void</span> setFavoriteTitle(Title title) { ... } <span class="directive">public</span> <span class="type">void</span> modifyFavoriteTitle(Title title) { <span class="keyword">if</span>(getTitle() != <span class="predefined-constant">null</span>) { titleFavoritesService.decrement(getTitle()); <i class="conum" data-value="1"></i><b>(1)</b> } setFavoriteTitle(title); <i class="conum" data-value="2"></i><b>(2)</b> titleFavoritesService.decrement(title); <i class="conum" data-value="3"></i><b>(3)</b> } <span class="directive">public</span> <span class="type">void</span> clearFavoriteTitle() { ... } ... }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>perform some additional business logic</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>update the property</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>perform some additional business logic</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_clear"><code>clear…​()</code></a>`</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_removeFrom">2.1.10. <code>removeFrom…​()</code> (deprecated)</h4> <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/rgcms/_rgcms_methods_prefixes_removeFrom.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/rgcms/_rgcms_methods_prefixes_removeFrom.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/rgcms/_rgcms_methods_prefixes_removeFrom.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/rgcms/_rgcms_methods_prefixes_removeFrom.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/rgcms/_rgcms_methods_prefixes_removeFrom.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>removeFrom…​()</code> supporting method is called whenever an object is removed from a collection. Its purpose is to allow additional business logic to be performed.</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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>. The suggested workaround is to simply define an action.</p> </div> </td> </tr> </tbody> </table> </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">LibraryMember</span> { <span class="directive">public</span> <span class="predefined-type">SortedSet</span>&lt;<span class="predefined-type">Book</span>&gt; getBorrowed() { ... } <span class="directive">public</span> <span class="type">void</span> setBorrowed(<span class="predefined-type">SortedSet</span>&lt;<span class="predefined-type">Book</span>&gt; borrowed) { ... } <span class="directive">public</span> <span class="type">void</span> addToBorrowed(<span class="predefined-type">Book</span> book) { ... } <span class="directive">public</span> <span class="type">void</span> removeFromBorrowed(<span class="predefined-type">Book</span> book) { getBorrowed().remove(book); <i class="conum" data-value="1"></i><b>(1)</b> reminderService.removeReminder(<span class="local-variable">this</span>, book); <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>update the collection</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>perform some additional business logic</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_addTo"><code>addTo…​()</code></a>`</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_set">2.1.11. <code>set…​()</code></h4> <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/rgcms/_rgcms_methods_prefixes_set.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/rgcms/_rgcms_methods_prefixes_set.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/rgcms/_rgcms_methods_prefixes_set.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/rgcms/_rgcms_methods_prefixes_set.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/rgcms/_rgcms_methods_prefixes_set.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>set…​()</code> prefix is simply the normal JavaBean setter prefix that denotes writeable properties or collections.</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_get"><code>get…​()</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_validate">2.1.12. <code>validate…​()</code></h4> <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/rgcms/_rgcms_methods_prefixes_validate.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/rgcms/_rgcms_methods_prefixes_validate.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/rgcms/_rgcms_methods_prefixes_validate.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/rgcms/_rgcms_methods_prefixes_validate.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/rgcms/_rgcms_methods_prefixes_validate.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>validate…​()</code> supporting method is called for properties, actions and action parameters. It allows the proposed new value for a property to be rejected, or the proposed argument of an action parameter to be rejected, or to reject a whole set of action arguments for an actio invocation.</p> </div> <div class="paragraph"> <p>The reason for vetoing a modification/invocation is normally returned as a string. However, Apache Isis' <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18n support</a> extends this so that reasons can be internationalized if required.</p> </div> <div class="sect4"> <h5 id="_action_parameter">Action Parameter</h5> <div class="paragraph"> <p>For an action parameter in (0-based) position <em>N</em>, and of type <code>T</code>, the signature is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">String</span> validateNXxx(T proposed) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where the returned string is the reason why the argument is rejected (or <code>null</code> if not vetoed).</p> </div> <div class="paragraph"> <p>For i18n, the supporting method returns a <code>TranslatableString</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> TranslatableString validateNXxx(T proposed) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>The returned string is then automatically translated to the locale of the current user.</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> Order placeOrder( <span class="directive">final</span> Product product, <span class="annotation">@ParameterLayout</span>(named=<span class="string"><span class="delimiter">"</span><span class="content">Quantity</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="type">int</span> quantity) { ... } <span class="directive">public</span> <span class="predefined-type">String</span> validate0PlaceOrder( <span class="directive">final</span> Product product) { <span class="keyword">return</span> product.isDiscontinued() ? <span class="string"><span class="delimiter">"</span><span class="content">Product has been discontinued</span><span class="delimiter">"</span></span> : <span class="predefined-constant">null</span>; } ... }</code></pre> </div> </div> </div> <div class="sect4"> <h5 id="_action_parameter_set">Action Parameter Set</h5> <div class="paragraph"> <p>In addition to validating a single single action argument, it is also possible to validate a complete set of action arguments. The signature is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">String</span> validateXxx(...) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where the returned string is the reason why the argument is rejected (or <code>null</code> if not vetoed), and the supporting method takes the same parameter types as the action itself.</p> </div> <div class="paragraph"> <p>For i18n, the supporting method returns a <code>TranslatableString</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> TranslatableString validateXxx(...) { ... }</code></pre> </div> </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> Order placeOrder( <span class="directive">final</span> Product product, <span class="annotation">@ParameterLayout</span>(named=<span class="string"><span class="delimiter">"</span><span class="content">Quantity</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="type">int</span> quantity) { ... } <span class="directive">public</span> <span class="predefined-type">String</span> validatePlaceOrder( <span class="directive">final</span> Product product, <span class="directive">final</span> <span class="type">int</span> quantity) { <span class="keyword">return</span> quantity &gt; product.getOrderLimit() ? <span class="string"><span class="delimiter">"</span><span class="content">May not order more than </span><span class="delimiter">"</span></span> + product.getOrderLimit() + <span class="string"><span class="delimiter">"</span><span class="content"> items for this product</span><span class="delimiter">"</span></span> : <span class="predefined-constant">null</span>; } ... }</code></pre> </div> </div> </div> <div class="sect4"> <h5 id="_properties_4">Properties</h5> <div class="paragraph"> <p>For properties of type <code>T</code> the signature of the supporting method is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">String</span> validateXxx(T proposed) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where the returned string is the reason the modification is vetoed (or <code>null</code> if not vetoed).</p> </div> <div class="paragraph"> <p>For i18n, the supporting method returns a <code>TranslatableString</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> TranslatableString validateXxx(T proposed) { ... }</code></pre> </div> </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="predefined-type">BigDecimal</span> getCreditLimit() { ... } <span class="directive">public</span> <span class="type">void</span> setCreditLimit(<span class="predefined-type">BigDecimal</span> creditLimit) { ... } <span class="directive">public</span> validateCreditLimit(<span class="predefined-type">BigDecimal</span> creditLimit) { <span class="keyword">return</span> creditLimit.compareTo(<span class="predefined-type">BigDecimal</span>.ZERO) &lt; <span class="integer">0</span> ? <span class="string"><span class="delimiter">"</span><span class="content">Credit limit cannot be negative</span><span class="delimiter">"</span></span> : <span class="predefined-constant">null</span>; } ... }</code></pre> </div> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_validateAddTo">2.1.13. <code>validateAddTo…​()</code> (deprecated)</h4> <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/rgcms/_rgcms_methods_prefixes_validateAddTo.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/rgcms/_rgcms_methods_prefixes_validateAddTo.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/rgcms/_rgcms_methods_prefixes_validateAddTo.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/rgcms/_rgcms_methods_prefixes_validateAddTo.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/rgcms/_rgcms_methods_prefixes_validateAddTo.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>validateAddTo…​()</code> supporting method is called whenever an object is to be added to a collection. Its purpose is to validate the proposed object and possibly veto the change.</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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>. The suggested workaround is to simply define an action.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The signature of the supporting method for a collection with element type <code>E</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="predefined-type">String</span> validateAddToXxx(E element) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where the returned string is the reason the collection modification invocation is vetoed (or <code>null</code> if not vetoed). Apache Isis' <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18n support</a> extends this so that reasons can be internationalized if required.</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">LibraryMember</span> { <span class="directive">public</span> <span class="predefined-type">SortedSet</span>&lt;<span class="predefined-type">Book</span>&gt; getBorrowed() { ... } <span class="directive">public</span> <span class="type">void</span> setBorrowed(<span class="predefined-type">SortedSet</span>&lt;<span class="predefined-type">Book</span>&gt; borrowed) { ... } <span class="directive">public</span> <span class="predefined-type">String</span> validateAddToBorrowed(<span class="predefined-type">Book</span> book) { <span class="keyword">return</span> book.isReference()? <span class="string"><span class="delimiter">"</span><span class="content">Reference books cannot be borrowed</span><span class="delimiter">"</span></span>: <span class="predefined-constant">null</span>; } <span class="directive">public</span> <span class="type">void</span> validateRemoveFromBorrowed(<span class="predefined-type">Book</span> book) { ... } ... }</code></pre> </div> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_addTo"><code>addTo…​()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validateRemoveFrom"><code>validateRemoveFrom…​()</code></a>`</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_prefixes_validateRemoveFrom">2.1.14. <code>validateRemoveFrom…​()</code> (deprecated)</h4> <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/rgcms/_rgcms_methods_prefixes_validateRemoveFrom.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/rgcms/_rgcms_methods_prefixes_validateRemoveFrom.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/rgcms/_rgcms_methods_prefixes_validateRemoveFrom.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/rgcms/_rgcms_methods_prefixes_validateRemoveFrom.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/rgcms/_rgcms_methods_prefixes_validateRemoveFrom.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>validateRemoveFrom…​()</code> supporting method is called whenever an object is to be removed from a collection. Its purpose is to validate the proposed object removal and possibly veto the change.</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>Directly mutable collections are not currently supported by the <a href="../ugvw/ugvw.html">Wicket viewer</a>. The suggested workaround is to simply define an action.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The signature of the supporting method for a collection with element type <code>E</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="predefined-type">String</span> validateRemoveFromXxx(E element) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where the returned string is the reason the collection modification invocation is vetoed (or <code>null</code> if not vetoed). Apache Isis' <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18n support</a> extends this so that reasons can be internationalized if required.</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">LibraryMember</span> { <span class="directive">public</span> <span class="predefined-type">SortedSet</span>&lt;<span class="predefined-type">Book</span>&gt; getBorrowed() { ... } <span class="directive">public</span> <span class="type">void</span> setBorrowed(<span class="predefined-type">SortedSet</span>&lt;<span class="predefined-type">Book</span>&gt; borrowed) { ... } <span class="directive">public</span> <span class="predefined-type">String</span> validateAddToBorrowed(<span class="predefined-type">Book</span> book) { ... } <span class="directive">public</span> <span class="type">void</span> validateRemoveFromBorrowed(<span class="predefined-type">Book</span> book) { <span class="keyword">return</span> !book.hasBeenReadBy(<span class="local-variable">this</span>)? <span class="string"><span class="delimiter">"</span><span class="content">You didn't read this book yet</span><span class="delimiter">"</span></span>: <span class="predefined-constant">null</span>; } ... }</code></pre> </div> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_removeFrom"><code>removeFrom…​()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_validateAddTo"><code>validateAddTo…​()</code></a>`</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_methods_reserved">2.2. Reserved Methods</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/rgcms/_rgcms_methods_reserved.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/rgcms/_rgcms_methods_reserved.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/rgcms/_rgcms_methods_reserved.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/rgcms/_rgcms_methods_reserved.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/rgcms/_rgcms_methods_reserved.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 table below lists the reserved methods that are recognized as part of Apache Isis' default programming model.</p> </div> <table class="tableblock frame-all grid-all spread"> <caption class="title"> Table 2. Reserved Methods </caption> <colgroup> <col style="width: 20%;"> <col style="width: 80%;"> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Method</th> <th class="tableblock halign-left valign-top">Description</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_reserved_cssClass"><code>cssClass()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Provides a CSS class for this object instance. In conjunction with <a href="../rgcfg/rgcfg.html#_rgcfg_application-specific_application-css"><code>application.css</code></a>, can therefore provide custom styling of an object instance wherever it is rendered.<br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_title"><code>title()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_iconName"><code>iconName()</code></a>.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_reserved_disable"><code>disable(…​)</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Disable all or some of an object’s properties</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_reserved_getId"><code>getId()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Provides an optional unique identifier of a service.<br></p> </div> <div class="paragraph"> <p>If not provided, the service’s fully-qualified class name is used.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_reserved_hide"><code>hide(…​)</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Hide all or some of an object’s properties</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_reserved_iconName"><code>iconName()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Provides the name of the image to render, usually alongside the title, to represent the object. If not provided, then the class name is used to locate an image.<br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_title"><code>title()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_cssClass"><code>cssClass()</code></a></p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_reserved_title"><code>title()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Provides a title for the object.<br></p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_iconName"><code>iconName()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_cssClass"><code>cssClass()</code></a></p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_reserved_validate"><code>validate()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Validate the object’s state prior to persisting.</p> </div> </div></td> </tr> </tbody> </table> <div class="sect3"> <h4 id="_rgcms_methods_reserved_cssClass">2.2.1. <code>cssClass()</code></h4> <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/rgcms/_rgcms_methods_reserved_cssClass.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/rgcms/_rgcms_methods_reserved_cssClass.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/rgcms/_rgcms_methods_reserved_cssClass.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/rgcms/_rgcms_methods_reserved_cssClass.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/rgcms/_rgcms_methods_reserved_cssClass.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>cssClass()</code> returns a CSS class for a particular object instance.</p> </div> <div class="paragraph"> <p>The <a href="../ugvw/ugvw.html">Wicket viewer</a> wraps the object’s representation in a containing <code>&lt;div&gt;</code> with the class added. This is done both for rendering the object either in a table or when rendering the object on its own page.</p> </div> <div class="paragraph"> <p>In conjunction with <a href="../rgcfg/rgcfg.html#_rgcfg_application-specific_application-css"><code>application.css</code></a>, can therefore provide custom styling of an object instance wherever it is rendered.<br></p> </div> <div class="paragraph"> <p>For example, the (non-ASF) <a href="http://github.com/isisaddons/isis-app-todoapp">Isis addons' todoapp</a> uses this technique to add a strikethrough for completed todo items. This is shown on the home page:</p> </div> <div class="imageblock"> <div class="content"> <a class="image" href="images/reference-methods/reserved/cssClass/strikethrough.png"><img src="images/reference-methods/reserved/cssClass/strikethrough.png" alt="strikethrough" width="800px"></a> </div> </div> <div class="paragraph"> <p>The code to accomplish this is straightforward:</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">ToDoItem</span> ... { <span class="directive">public</span> <span class="predefined-type">String</span> cssClass() { <span class="keyword">return</span> !isComplete() ? <span class="string"><span class="delimiter">"</span><span class="content">todo</span><span class="delimiter">"</span></span> : <span class="string"><span class="delimiter">"</span><span class="content">done</span><span class="delimiter">"</span></span>; } ... }</code></pre> </div> </div> <div class="paragraph"> <p>In the <a href="../rgcfg/rgcfg.html#_rgcfg_application-specific_application-css">application.css</a>, the following styles were then added:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="css"><span class="tag">tr</span><span class="class">.todo</span> { } <span class="tag">tr</span><span class="class">.done</span> { <span class="key">text-decoration</span>: <span class="value">line-through</span>; <span class="key">color</span>: <span class="color">#d3d3d3</span>; }</code></pre> </div> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_title"><code>title()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_iconName"><code>iconName()</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_reserved_disable">2.2.2. <code>disabled()</code></h4> <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/rgcms/_rgcms_methods_reserved_disable.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/rgcms/_rgcms_methods_reserved_disable.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/rgcms/_rgcms_methods_reserved_disable.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/rgcms/_rgcms_methods_reserved_disable.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/rgcms/_rgcms_methods_reserved_disable.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>One use case that Apache Isis supports is that of a domain object with a lifecycle whereby at some stage it should become immutable: all its properties/collections should be disabled, and/or its actions become not invokable.</p> </div> <div class="paragraph"> <p>It would be painful to have to write a separate <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_disable"><code>disable…​()</code></a> method for each and every member, so instead Isis allows a single <code>disable…​(…​)</code> method to be implemented that is applied to all members.</p> </div> <div class="paragraph"> <p>The signature of the method is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">String</span> disabled(Identifier.Type identifierType) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where <code>Identifier.Type</code> is part of the Isis applib (nested static class of <code>o.a.i.applib.Identifier</code>) to distinguish between an interaction with an action, a property or an action.</p> </div> <div class="paragraph"> <p>Note that Apache Isis' <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18n support</a> extends this so that the returned reason can also be internationalized.</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="predefined-type">String</span> disabled(Identifier.Type identifierType) { <span class="keyword">return</span> !calendarService.isOfficeHours(clock.today() ? <span class="string"><span class="delimiter">"</span><span class="content">Cannot modify objects outside of office hours</span><span class="delimiter">"</span></span> : <span class="predefined-constant">null</span>; }</code></pre> </div> </div> <div class="paragraph"> <p>See also the similar methods to <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_hide"><code>hide()</code></a> object members en-masse.</p> </div> <div class="sect4"> <h5 id="_alternatives_2">Alternatives</h5> <div class="paragraph"> <p>An alternative design — and one that could be easily argued is actually more flexible — is to leverage domain events with vetoing subscribers.</p> </div> <div class="paragraph"> <p>With this approach we define, for a given domain class, a base <code>PropertyDomainEvent</code>, <code>CollectionDomainEvent</code> and <code>ActionDomainEvent</code>. A good pattern is to make these nested static classes. 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">ToDoItem</span> ... { <span class="directive">public</span> <span class="directive">static</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">PropertyDomainEvent</span>&lt;T&gt; <span class="directive">extends</span> ToDoAppDomainModule.PropertyDomainEvent&lt;ToDoItem, T&gt; { ... } ... }</code></pre> </div> </div> <div class="paragraph"> <p>where in turn:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">final</span> <span class="type">class</span> <span class="class">ToDoAppDomainModule</span> { <span class="directive">private</span> ToDoAppDomainModule(){} <span class="directive">public</span> <span class="directive">abstract</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">PropertyDomainEvent</span>&lt;S,T&gt; <span class="directive">extends</span> org.apache.isis.applib.services.eventbus.PropertyDomainEvent&lt;S,T&gt; { ... } ... }</code></pre> </div> </div> <div class="paragraph"> <p>Then, each property/collection/action emits either these base domain events or their own subclass:</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">ToDoItem</span> ... { <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">DescriptionDomainEvent</span> <span class="directive">extends</span> PropertyDomainEvent&lt;<span class="predefined-type">String</span>&gt; { ... } <span class="annotation">@Property</span>( domainEvent = DescriptionDomainEvent.class ) <span class="directive">public</span> <span class="predefined-type">String</span> getDescription() { ... } ... }</code></pre> </div> </div> <div class="paragraph"> <p>A vetoing subscriber can then subscribe to the domain events and veto access, eg:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainObject</span> <span class="directive">public</span> <span class="type">class</span> <span class="class">VetoOutOfOfficeHours</span> { <span class="annotation">@Subscribe</span> <span class="directive">public</span> <span class="type">void</span> on(ToDoItem.PropertyDomainEvent ev) { <span class="keyword">if</span>(!calendarService.isOfficeHours(clock.today()) { ev.veto(<span class="string"><span class="delimiter">"</span><span class="content">Cannot modify objects outside of office hours</span><span class="delimiter">"</span></span>); } } ... }</code></pre> </div> </div> <div class="paragraph"> <p>Obviously there’s an awful lot more boilerplate here, but there’s also a lot more flexibility.</p> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_reserved_getId">2.2.3. <code>getId()</code></h4> <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/rgcms/_rgcms_methods_reserved_getId.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/rgcms/_rgcms_methods_reserved_getId.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/rgcms/_rgcms_methods_reserved_getId.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/rgcms/_rgcms_methods_reserved_getId.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/rgcms/_rgcms_methods_reserved_getId.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>getId()</code> method applies only to domain services, and is used to provide a unique alias for the domain service’s class name.</p> </div> <div class="paragraph"> <p>This value is used internally to generate a string representation of an service identity (the <code>Oid</code>). This can appear in several contexts, including:</p> </div> <div class="ulist"> <ul> <li> <p>as the value of <code>Bookmark#getObjectType()</code> and in the <code>toString()</code> value of <code>Bookmark</code> (see <a href="../rgsvc/rgsvc.html#_rgsvc_integration-api_BookmarkService"><code>BookmarkService</code></a>)</p> </li> <li> <p>in the serialization of <code>OidDto</code> in the <a href="../rgcms/rgcms.html#_rgcms_schema-cmd">command</a> and <a href="../rgcms/rgcms.html#_rgcms_schema-ixn">interaction</a> schemas</p> </li> <li> <p>in the URLs of the <a href="../ugvro/ugvro.html">RestfulObjects viewer</a></p> </li> <li> <p>in the URLs of the <a href="../ugvw/ugvw.html">Wicket viewer</a> (specifically, for bookmarked actions)</p> </li> </ul> </div> <div class="sect4"> <h5 id="_example">Example</h5> <div class="paragraph"> <p>For example:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainService</span> <span class="directive">public</span> <span class="type">class</span> <span class="class">OrderMenu</span> { ... public <span class="predefined-type">String</span> getId() { <span class="keyword">return</span> <span class="string"><span class="delimiter">"</span><span class="content">orders.OrderMenu</span><span class="delimiter">"</span></span>; } }</code></pre> </div> </div> </div> <div class="sect4"> <h5 id="_precedence">Precedence</h5> <div class="paragraph"> <p>The rules of precedence are:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p><a href="../rgant/rgant.html#_rgant-DomainService_objectType"><code>@DomainService#objectType()</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_methods_reserved_getId"><code>getId()</code></a></p> </li> <li> <p>The fully qualified class name.</p> </li> </ol> </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>This might be obvious, but to make explicit: we recommend that you always specify an object type for your domain services.</p> </div> <div class="paragraph"> <p>Otherwise, if you refactor your code (change class name or move package), then any externally held references to the OID of the service will break. At best this will require a data migration in the database; at worst it could cause external clients accessing data through the <a href="../ugvro/ugvro.html">Restful Objects</a> viewer to break.</p> </div> </td> </tr> </tbody> </table> </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>If the object type is not unique across all domain classes then the framework will fail-fast and fail to boot. An error message will be printed in the log to help you determine which classes have duplicate object tyoes.</p> </div> </td> </tr> </tbody> </table> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_reserved_hide">2.2.4. <code>hide()</code></h4> <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/rgcms/_rgcms_methods_reserved_hide.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/rgcms/_rgcms_methods_reserved_hide.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/rgcms/_rgcms_methods_reserved_hide.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/rgcms/_rgcms_methods_reserved_hide.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/rgcms/_rgcms_methods_reserved_hide.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>One use case that Apache Isis supports is that of a domain object with a lifecycle whereby at some stage some number of the object’s members should be hidden. For example, for an object that at some stage is logically immutable, we might want to make all its properties/collections unmodifiable and hide all its actions.</p> </div> <div class="paragraph"> <p>While we could write a separate <a href="../rgcms/rgcms.html#_rgcms_methods_prefixes_hide"><code>hide…​()</code></a> method for each and every action, this could become painful. So instead Isis allows a single <code>hide…​(…​)</code> method to be implemented that is applied to all members.</p> </div> <div class="paragraph"> <p>The signature of the method 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">boolean</span> hide(Identifier.Type identifierType) { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where <code>Identifier.Type</code> is part of the Isis applib (nested static class of <code>o.a.i.applib.Identifier</code>) to distinguish between an interaction with an action, a property or an action.</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">boolean</span> hide(Identifier.Type identifierType) { <span class="keyword">return</span> identifierType == Identifier.Type.ACTION &amp;&amp; isFrozen(); }</code></pre> </div> </div> <div class="paragraph"> <p>See also the similar method to <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_disable"><code>disable()</code></a> object members en-masse.</p> </div> <div class="sect4"> <h5 id="_alternatives_3">Alternatives</h5> <div class="paragraph"> <p>An alternative design — and one that could be easily argued is actually more flexible — is to leverage domain events with vetoing subscribers.</p> </div> <div class="paragraph"> <p>There is further discussion on this approach in <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_disable">here</a>.</p> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_reserved_iconName">2.2.5. <code>iconName()</code></h4> <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/rgcms/_rgcms_methods_reserved_iconName.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/rgcms/_rgcms_methods_reserved_iconName.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/rgcms/_rgcms_methods_reserved_iconName.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/rgcms/_rgcms_methods_reserved_iconName.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/rgcms/_rgcms_methods_reserved_iconName.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>Every object is represented by an icon; this is based on the domain object’s simple name. The <a href="../ugvw/ugvw.html">Wicket viewer</a> searches for the image in the same package as the <code>.class</code> file for the domain object or in the <code>images</code> package. It will find any matching name and one of the followign suffexes <code>png</code>, <code>gif</code>, <code>jpeg</code>, <code>jpg</code>, <code>svg</code>. If none is found, then <code>Default.png</code> will be used as fallback.</p> </div> <div class="paragraph"> <p>The <code>iconName()</code> allows the icon that to be used to change for individual object instances. These are usually quite subtle, for example to reflect the particular status of an object. The value returned by the <code>iconName()</code> method is added as a suffix to the base icon name.</p> </div> <div class="paragraph"> <p>For example, the (non-ASF) <a href="http://github.com/isisaddons/isis-app-todoapp">Isis addons' todoapp</a> uses this technique to add an overlay for todo items that have been completed:</p> </div> <div class="imageblock"> <div class="content"> <a class="image" href="images/reference-methods/reserved/iconName/differing.png"><img src="images/reference-methods/reserved/iconName/differing.png" alt="differing" width="200px"></a> </div> </div> <div class="paragraph"> <p>The screenshot below shows the location of these png icon files:</p> </div> <div class="imageblock"> <div class="content"> <a class="image" href="images/reference-methods/reserved/iconName/png-files.png"><img src="images/reference-methods/reserved/iconName/png-files.png" alt="png files" width="200px"></a> </div> </div> <div class="paragraph"> <p>The code to accomplish this is straightforward:</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">ToDoItem</span> ... { <span class="directive">public</span> <span class="predefined-type">String</span> iconName() { <span class="keyword">return</span> !isComplete() ? <span class="string"><span class="delimiter">"</span><span class="content">todo</span><span class="delimiter">"</span></span> : <span class="string"><span class="delimiter">"</span><span class="content">done</span><span class="delimiter">"</span></span>; } ... }</code></pre> </div> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_title"><code>title()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_cssClass"><code>cssClass()</code></a></p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_reserved_title">2.2.6. <code>title()</code></h4> <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/rgcms/_rgcms_methods_reserved_title.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/rgcms/_rgcms_methods_reserved_title.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/rgcms/_rgcms_methods_reserved_title.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/rgcms/_rgcms_methods_reserved_title.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/rgcms/_rgcms_methods_reserved_title.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>Every object is represented by a title. This appears both as a main header for the object when viewed as well as being used as a hyperlink within properties and collections. It therefore must contain enough information for the end-user to distinguish the object from any others.</p> </div> <div class="paragraph"> <p>This is most commonly done by including some unique key within the title, for example a customer’s SSN, or an order number, and so forth. However note that Apache Isis itself does <em>not</em> require the title to be unique; it is merely recommended in most cases.</p> </div> <div class="paragraph"> <p>An object’s title can be constructed in various ways, but the most flexible is to use the <code>title()</code> method. The signature of this method is usually:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">String</span> title() { ... }</code></pre> </div> </div> <div class="paragraph"> <p>Note that Apache Isis' <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18n support</a> extends this so that titles can also be internationalized.</p> </div> <div class="paragraph"> <p>For example, the (non-ASF) <a href="http://github.com/isisaddons/isis-app-todoapp">Isis addons' todoapp</a> uses this technique to add an overlay for todo items that have been completed:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">String</span> title() { <span class="directive">final</span> TitleBuffer buf = <span class="keyword">new</span> TitleBuffer(); <i class="conum" data-value="1"></i><b>(1)</b> buf.append(getDescription()); <span class="keyword">if</span> (isComplete()) { <i class="conum" data-value="2"></i><b>(2)</b> buf.append(<span class="string"><span class="delimiter">"</span><span class="content">- Completed!</span><span class="delimiter">"</span></span>); } <span class="keyword">else</span> { <span class="keyword">try</span> { <span class="directive">final</span> LocalDate dueBy = wrapperFactory.wrap(<span class="local-variable">this</span>).getDueBy(); <i class="conum" data-value="3"></i><b>(3)</b> <span class="keyword">if</span> (dueBy != <span class="predefined-constant">null</span>) { buf.append(<span class="string"><span class="delimiter">"</span><span class="content"> due by</span><span class="delimiter">"</span></span>, dueBy); } } <span class="keyword">catch</span>(<span class="directive">final</span> HiddenException ignored) { <i class="conum" data-value="4"></i><b>(4)</b> } } <span class="keyword">return</span> buf.toString(); }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>simple <a href="../rgcms/rgcms.html#_rgcms_classes_utility_TitleBuffer">utility class</a> to help construct the title string</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>imperative conditional logic</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>using the <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a> to determine if the <code>dueBy</code> field is visible for this user …​</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>…​ but ignore if not</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>As the example above shows, the implementation can be as complex as you like.</p> </div> <div class="paragraph"> <p>In many cases, though, you may be able to use the <a href="../rgant/rgant.html#_rgant-Title"><code>@Title</code></a> annotation.</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_iconName"><code>iconName()</code></a> and <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_cssClass"><code>cssClass()</code></a></p> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_reserved_validate">2.2.7. <code>validate()</code></h4> <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/rgcms/_rgcms_methods_reserved_validate.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/rgcms/_rgcms_methods_reserved_validate.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/rgcms/_rgcms_methods_reserved_validate.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/rgcms/_rgcms_methods_reserved_validate.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/rgcms/_rgcms_methods_reserved_validate.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>validate()</code> method is used to specify that invariants pertaining to an object’s state are enforced.</p> </div> <div class="admonitionblock warning"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-warning" title="Warning"></i> </td> <td class="content"> <div class="paragraph"> <p>There are known limitations with this functionality. Invariants <em>are</em> enforced when an object is initially created and when it is edited, however invariants are currently <em>not</em> enforced if an action is invoked.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The signature of the method is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">String</span> validate() { ... }</code></pre> </div> </div> <div class="paragraph"> <p>where the returned string is the reason that the invocation is vetoed.</p> </div> <div class="paragraph"> <p>Note that Apache Isis' <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">i18n support</a> extends this so that the returned reason can also be internationalized.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_methods_lifecycle">2.3. Lifecycle Methods</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/rgcms/_rgcms_methods_lifecycle.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/rgcms/_rgcms_methods_lifecycle.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/rgcms/_rgcms_methods_lifecycle.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/rgcms/_rgcms_methods_lifecycle.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/rgcms/_rgcms_methods_lifecycle.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 lifecycle callback methods notify a domain entity about its interaction within the persistence lifecycle. For example, the entity is notified immediately prior to being persisted, or when it is about to be updated.</p> </div> <div class="admonitionblock warning"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-warning" title="Warning"></i> </td> <td class="content"> <div class="paragraph"> <p>Note that these callbacks are fired by Apache Isis rather than JDO. In the future we may deprecate them because there are better mechanisms available using a subscriber for the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent">lifecycle event</a>s.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The lifecycle callback methods supported by Apache Isis are:</p> </div> <table class="tableblock frame-all grid-all spread"> <caption class="title"> Table 3. Lifecycle methods (partial support) </caption> <colgroup> <col style="width: 20%;"> <col style="width: 80%;"> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Method</th> <th class="tableblock halign-left valign-top">Description</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_created"><code>created()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>called when an object has just been created using <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryService#instantiate(..)</code></a> or <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService#instantiate(…​)</code></a></p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_loaded"><code>loaded()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>called when a (persistent) object has just been loaded from the object store.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_persisted"><code>persisted()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>called when object has just been persisted from the object store.</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_persisting"><code>persisting()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>called when a (not-yet-persistent) object is just about to be persisted from the object store</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_removed"><code>removed()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>called when a (persistent) object has just been deleted from the object store</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_removing"><code>removing()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>called when a (persistent) object is just about to be deleted from the object store</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_updated"><code>updated()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>called when a (persistent) object has just been updated in the object store</p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_updating"><code>updating()</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>called when a (persistent) object is just about to be updated in the object store</p> </div> </div></td> </tr> </tbody> </table> <div class="paragraph"> <p>Some lifecycle methods have been deprecated:</p> </div> <table class="tableblock frame-all grid-all spread"> <caption class="title"> Table 4. Deprecated lifecycle methods </caption> <colgroup> <col style="width: 20%;"> <col style="width: 80%;"> </colgroup> <thead> <tr> <th class="tableblock halign-left valign-top">Method</th> <th class="tableblock halign-left valign-top">Notes</th> </tr> </thead> <tbody> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>deleted()</code></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Replaced by <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_removed"><code>removed()</code></a></p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>deleting()</code></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Replaced by <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_removing"><code>removing()</code></a></p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>loading()</code></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>callback for when the (persistent) object is just about to be loaded from the object store.<br></p> </div> <div class="admonitionblock warning"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-warning" title="Warning"></i> </td> <td class="content"> <div class="paragraph"> <p>This method is never called.</p> </div> </td> </tr> </tbody> </table> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>saved()</code></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Replaced by <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_persisted"><code>persisted()</code></a></p> </div> </div></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><code>saving()</code></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p>Replaced by <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_persisting"><code>persisting()</code></a></p> </div> </div></td> </tr> </tbody> </table> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_created">2.3.1. <code>created()</code></h4> <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/rgcms/_rgcms_methods_lifecycle_created.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/rgcms/_rgcms_methods_lifecycle_created.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/rgcms/_rgcms_methods_lifecycle_created.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/rgcms/_rgcms_methods_lifecycle_created.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/rgcms/_rgcms_methods_lifecycle_created.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>created()</code> lifecycle callback method is called when an object has just been created using <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService#instantiate(…​)</code></a> or <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryService#instantiate(…​)</code></a></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>Alternatively, consider using a <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService">event bus</a> <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscriber</a> on the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectCreatedEvent"><code>ObjectCreatedEvent</code></a>.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_loaded">2.3.2. <code>loaded()</code></h4> <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/rgcms/_rgcms_methods_lifecycle_loaded.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/rgcms/_rgcms_methods_lifecycle_loaded.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/rgcms/_rgcms_methods_lifecycle_loaded.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/rgcms/_rgcms_methods_lifecycle_loaded.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/rgcms/_rgcms_methods_lifecycle_loaded.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>loaded()</code> lifecycle callback method is called when a (persistent) object has just been loaded from the object store.</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>Alternatively, consider using a <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService">event bus</a> <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscriber</a> on the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectLoadedEvent"><code>ObjectLoadedEvent</code></a>.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_persisted">2.3.3. <code>persisted()</code></h4> <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/rgcms/_rgcms_methods_lifecycle_persisted.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/rgcms/_rgcms_methods_lifecycle_persisted.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/rgcms/_rgcms_methods_lifecycle_persisted.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/rgcms/_rgcms_methods_lifecycle_persisted.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/rgcms/_rgcms_methods_lifecycle_persisted.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>persisted()</code> lifecycle callback method is called when object has just been persisted from the object store.</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_persisting"><code>persisting()</code></a>.</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>Alternatively, consider using a <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService">event bus</a> <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscriber</a> on the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectPersistedEvent"><code>ObjectPersistedEvent</code></a>.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_persisting">2.3.4. <code>persisting()</code></h4> <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/rgcms/_rgcms_methods_lifecycle_persisting.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/rgcms/_rgcms_methods_lifecycle_persisting.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/rgcms/_rgcms_methods_lifecycle_persisting.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/rgcms/_rgcms_methods_lifecycle_persisting.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/rgcms/_rgcms_methods_lifecycle_persisting.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>persisting()</code> lifecycle callback method is called when a (not-yet-persistent) object is just about to be persisted from the object store</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_persisted"><code>persisted()</code></a>.</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>Alternatively, consider using a <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService">event bus</a> <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscriber</a> on the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectPersistingEvent"><code>ObjectPersistingEvent</code></a>.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_removed">2.3.5. <code>removed()</code></h4> <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/rgcms/_rgcms_methods_lifecycle_removed.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/rgcms/_rgcms_methods_lifecycle_removed.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/rgcms/_rgcms_methods_lifecycle_removed.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/rgcms/_rgcms_methods_lifecycle_removed.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/rgcms/_rgcms_methods_lifecycle_removed.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>removed()</code> lifecycle callback method is called when a (persistent) object has just been deleted from the object store</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_removing"><code>removing()</code></a>.</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>Alternatively, consider using a <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService">event bus</a> <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscriber</a> on the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectRemovedEvent"><code>ObjectRemovedEvent</code></a>.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_removing">2.3.6. <code>removing()</code></h4> <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/rgcms/_rgcms_methods_lifecycle_removing.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/rgcms/_rgcms_methods_lifecycle_removing.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/rgcms/_rgcms_methods_lifecycle_removing.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/rgcms/_rgcms_methods_lifecycle_removing.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/rgcms/_rgcms_methods_lifecycle_removing.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>removing()</code> lifecycle callback method is called when a (persistent) object is just about to be deleted from the object store</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_removed"><code>removed()</code></a>.</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>Alternatively, consider using a <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService">event bus</a> <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscriber</a> on the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectRemovingEvent"><code>ObjectRemovingEvent</code></a>.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_updated">2.3.7. <code>updated()</code></h4> <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/rgcms/_rgcms_methods_lifecycle_updated.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/rgcms/_rgcms_methods_lifecycle_updated.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/rgcms/_rgcms_methods_lifecycle_updated.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/rgcms/_rgcms_methods_lifecycle_updated.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/rgcms/_rgcms_methods_lifecycle_updated.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>updated()</code> lifecycle callback method is called when a (persistent) object has just been updated in the object store</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_updating"><code>updating()</code></a>.</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>Alternatively, consider using a <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService">event bus</a> <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscriber</a> on the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectUpdatedEvent"><code>ObjectUpdatedEvent</code></a>.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_updating">2.3.8. <code>updating()</code></h4> <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/rgcms/_rgcms_methods_lifecycle_updating.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/rgcms/_rgcms_methods_lifecycle_updating.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/rgcms/_rgcms_methods_lifecycle_updating.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/rgcms/_rgcms_methods_lifecycle_updating.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/rgcms/_rgcms_methods_lifecycle_updating.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>updating()</code> lifecycle callback method is called when a (persistent) object is just about to be updated in the object store</p> </div> <div class="paragraph"> <p>See also <a href="../rgcms/rgcms.html#_rgcms_methods_lifecycle_updated"><code>updated()</code></a>.</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>Alternatively, consider using a <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService">event bus</a> <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber">subscriber</a> on the <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectUpdatingEvent"><code>ObjectUpdatingEvent</code></a>.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_methods_lifecycle_jdo-api">2.3.9. Using the JDO API</h4> <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/rgcms/_rgcms_methods_lifecycle_jdo-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/rgcms/_rgcms_methods_lifecycle_jdo-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/rgcms/_rgcms_methods_lifecycle_jdo-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/rgcms/_rgcms_methods_lifecycle_jdo-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/rgcms/_rgcms_methods_lifecycle_jdo-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="paragraph"> <p>As an alternative to relying on Apache Isis to call lifecycle callback methods, you could instead use the JDO <a href="http://www.datanucleus.org/products/datanucleus/jdo/lifecycle_callbacks.html">lifecycle listener</a> API directly.</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>We may decide to deprecate the Apache Isis callbacks in the future because they merely duplicate this functionality already available in JDO.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>You can gain access to the relevant JDO API using the <a href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-api_IsisJdoSupport"><code>IsisJdoSupport</code></a> domain service.</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="annotation">@RequestScoped</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="annotation">@DomainService</span>(nature=NatureOfService.DOMAIN) <span class="directive">public</span> <span class="type">class</span> <span class="class">ObjectChangedListenerService</span> <span class="directive">implements</span> javax.jdo.listener.StoreLifecycleListener { <i class="conum" data-value="2"></i><b>(2)</b> <span class="annotation">@Programmatic</span> <span class="annotation">@PostConstruct</span> <span class="directive">public</span> <span class="type">void</span> init() { getPmFactory().addInstanceLifecycleListener(<span class="local-variable">this</span>); } <span class="annotation">@Programmatic</span> <span class="annotation">@PreDestroy</span> <span class="directive">public</span> <span class="type">void</span> tidyUp() { getPmFactory().removeInstanceLifecycleListener(<span class="local-variable">this</span>); } <span class="directive">private</span> PersistenceManager getPersistenceManager() { <span class="keyword">return</span> jdoSupport.getPersistenceManager(); <i class="conum" data-value="3"></i><b>(3)</b> } <span class="annotation">@Programmatic</span> <span class="directive">public</span> <span class="type">void</span> preStore (InstanceLifecycleEvent event) { ... } <span class="annotation">@Programmatic</span> <span class="directive">public</span> <span class="type">void</span> postStore (InstanceLifecycleEvent event) { ... } <span class="annotation">@Inject</span> IsisJdoSupport jdoSupport; }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>must be <code>@RequestScoped</code> because we register on the <code>PersistenceManager</code>, which is different for each request.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>implement whichever callback lifecycle listeners are of interest</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>use the injected <a href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-api_IsisJdoSupport"><code>IsisJdoSupport</code></a> service to obtain the <code>PersistenceManager</code>.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>Note that it isn’t possible to register on the <code>PersistenceManagerFactory</code> because listeners cannot be attached once a persistence session has been created (which it will have been when the service’s <code>@PostConstruct</code> method is called).</p> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_rgcms_classes">3. Classes and Interfaces</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/rgcms/_rgcms_classes.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/rgcms/_rgcms_classes.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/rgcms/_rgcms_classes.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/rgcms/_rgcms_classes.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/rgcms/_rgcms_classes.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>This chapter describes the usage of various classes and interfaces that are not otherwise associated with <a href="../rgsvc/rgsvc.html">domain services</a>, <a href="../ugvw/ugvw.html#_ugvw_layout">object layout</a> or <a href="../rgcfg/rgcfg.html#_rgcfg">configuration</a>.</p> </div> <div class="sect2"> <h3 id="_rgcms_classes_AppManifest-bootstrapping">3.1. <code>AppManifest</code> (bootstrapping)</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/rgcms/_rgcms_classes_AppManifest-bootstrapping.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/rgcms/_rgcms_classes_AppManifest-bootstrapping.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/rgcms/_rgcms_classes_AppManifest-bootstrapping.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/rgcms/_rgcms_classes_AppManifest-bootstrapping.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/rgcms/_rgcms_classes_AppManifest-bootstrapping.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>This section describes how to implement the <code>AppManifest</code> interface to bootstrap both an Apache Isis web application, and also its integration tests.</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 framework-provided <code>AppManifestAbstract2</code> and <code>AppManifestAbstract2.Builder</code> makes it easy to write an <code>AppManifest</code>, defined by a set of <a href="#_rgcms_classes_Module"><code>Module</code></a> implementations. The app manifest can then be used both to bootstrap the application "proper", or for integration tests.</p> </div> </td> </tr> </tbody> </table> </div> <div class="sect3"> <h4 id="__rgcms_classes_AppManifest-bootstrapping_api">3.1.1. API</h4> <div class="paragraph"> <p>The <code>AppManifest</code> interface allows the constituent parts of an application to be defined programmatically, most specifically the packages that contain domain services and/or persistent entities. Its API is defined as:</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">AppManifest</span> { <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Class</span>&lt;?&gt;&gt; getModules(); <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Class</span>&lt;?&gt;&gt; getAdditionalServices(); <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">public</span> <span class="predefined-type">String</span> getAuthenticationMechanism(); <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">public</span> <span class="predefined-type">String</span> getAuthorizationMechanism(); <i class="conum" data-value="4"></i><b>(4)</b> <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Class</span>&lt;? <span class="directive">extends</span> FixtureScript&gt;&gt; getFixtures(); <i class="conum" data-value="5"></i><b>(5)</b> <span class="directive">public</span> <span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>,<span class="predefined-type">String</span>&gt; getConfigurationProperties(); <i class="conum" data-value="6"></i><b>(6)</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>Must return a non-null list of classes, each of which representing the root of one of the modules containing services and possibly entities, which together makes up the running application.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>If non-<code>null</code>, overrides the value of <code>isis.services</code> configuration property to specify a list of additional classes to be instantiated as domain services (over and above the domain services defined via <code>getModules()</code> method.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>If non-<code>null</code>, overrides the value of <code>isis.authentication</code> configuration property to specify the authentication mechanism.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>If non-<code>null</code>, overrides the value of <code>isis.authorization</code> configuration property to specify the authorization mechanism.</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>If non-<code>null</code>, overrides the value of <code>isis.fixtures</code> configuration property to specify a fixture script to be installed.</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>Overrides for any other configuration properties.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The following sections describe each of these methods in a little more detail.</p> </div> <div class="sect4"> <h5 id="__rgcms_classes_AppManifest-bootstrapping_api_getModules"><code>getModules()</code></h5> <div class="paragraph"> <p>The most significant method (the only one which must return a non-<code>null</code> value) is the <code>getModules()</code> method. Each module is identified by a class; the framework simply uses that class' package as the root to search for domain services (annotated with <a href="../rgant/rgant.html#_rgant-DomainService"><code>@DomainService</code></a>) and entities (annotated with <a href="../rgant/rgant.html#_rgant-PersistenceCapable"><code>@PersistenceCapable</code></a>). Generally there is one such module class per Maven module.</p> </div> <div class="paragraph"> <p>A module class for a domain module might for example be defined as:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">com.mycompany.myapp.dom</span>; <span class="directive">public</span> <span class="directive">final</span> <span class="type">class</span> <span class="class">MyAppDomainModule</span> { <span class="directive">private</span> MyAppDomainModule() {} }</code></pre> </div> </div> <div class="paragraph"> <p>This tells the framework that the package and subpackages under <code>com.mycompany.myapp.dom</code> should be searched for domain services (annotated with <code>@DomainService</code>), mixins (<code>@Mixin</code>) and entities (<code>@PersistenceCapabable</code>).</p> </div> <div class="paragraph"> <p>As is perhaps apparent, the <code>getModules()</code> method replaces and overrides both the <code>isis.services.ServicesInstallerFromAnnotation.packagePrefix</code> key (usually found in the <code>isis.properties</code> file) and also the`isis.persistor.datanucleus.RegisterEntities.packagePrefix` key (usually found in the <code>persistor_datanucleus.properties</code> file). The value of the <code>isis.services-installer</code> configuration property is also ignored.</p> </div> <div class="paragraph"> <p>For example, the (non-ASF) <a href="http://github.com/isisaddons/isis-app-todoapp">Isis addons' todoapp</a> defines the following:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Override</span> <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Class</span>&lt;?&gt;&gt; getModules() { <span class="keyword">return</span> <span class="predefined-type">Arrays</span>.asList( ToDoAppDomainModule.class, ToDoAppFixtureModule.class, ToDoAppAppModule.class, org.isisaddons.module.audit.AuditModule.class, org.isisaddons.module.command.CommandModule.class, org.isisaddons.module.devutils.DevUtilsModule.class, org.isisaddons.module.docx.DocxModule.class, org.isisaddons.module.publishing.PublishingModule.class, org.isisaddons.module.sessionlogger.SessionLoggerModule.class, org.isisaddons.module.settings.SettingsModule.class, org.isisaddons.wicket.gmap3.cpt.service.Gmap3ServiceModule.class ); }</code></pre> </div> </div> <div class="paragraph"> <p>As can be seen, the various (non-ASF) <a href="http://platform.incode.org" target="_blank" rel="noopener">Incode Platform</a> modules also each provide a module class that can be easily referenced.</p> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_AppManifest-bootstrapping_api_getAdditionalServices"><code>getAdditionalServices()</code></h5> <div class="paragraph"> <p>We normally we recommend that services are defined exclusively through <code>getModules()</code>, and that this method should therefore return an empty list. However, there are certain use cases where the a service must be explicitly specified either because the service required does not (for whatever reason) have a <a href="../rgant/rgant.html#_rgant-DomainService"><code>@DomainService</code></a> annotation.</p> </div> <div class="paragraph"> <p>For example, the (non-ASF) <a href="http://platform.incode.org" target="_blank" rel="noopener">Incode Platform</a>'s security module allows the policy to evaluate conflicting permissions to be specified by explicitly registering either the <code>PermissionsEvaluationServiceAllowBeatsVeto</code> domain service or the <code>PermissionsEvaluationServiceVetoBeatsAllow</code> domain service:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Override</span> <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Class</span>&lt;?&gt;&gt; getAdditionalServices() { <span class="keyword">return</span> <span class="predefined-type">Arrays</span>.asList( org.isisaddons.module.security.dom.permission.PermissionsEvaluationServiceVetoBeatsAllow.class ); }</code></pre> </div> </div> <div class="paragraph"> <p>If this method returns a non-<code>null</code> value, then it overrides the value of <code>isis.services</code> configuration property.</p> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_AppManifest-bootstrapping_api_getAuthenticationMechanism"><code>getAuthenticationMechanism()</code></h5> <div class="paragraph"> <p>If non-<code>null</code>, this method specifies the authentication mechanism to use. The valid values are currently <code>"shiro"</code> or <code>"bypass"</code>. If null is returned then the value of the <code>isis.authentication</code> configuration property (in <code>isis.properties</code> file) is used instead.</p> </div> <div class="paragraph"> <p>See the <a href="../ugsec/ugsec.html">security guide</a> for further details on configuring shiro or bypass security.</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>This property is ignored for integration tests (which always uses the <code>"bypass"</code> mechanism).</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_AppManifest-bootstrapping_api_getAuthorizationMechanism"><code>getAuthorizationMechanism()</code></h5> <div class="paragraph"> <p>If non-<code>null</code>, this method specifies the authorization mechanism to use. The valid values are currently <code>"shiro"</code> or <code>"bypass"</code>. If null is returned then the value of the <code>isis.authorization</code> configuration property (in <code>isis.properties</code> file) is used instead.</p> </div> <div class="paragraph"> <p>See the <a href="../ugsec/ugsec.html">security guide</a> for further details on configuring shiro or bypass security.</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>This property is ignored for integration tests (which always uses the <code>"bypass"</code> mechanism).</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_AppManifest-bootstrapping_api_getFixtures"><code>getFixtures()</code></h5> <div class="paragraph"> <p>If non-<code>null</code>, this method specifies the fixture script(s) to be run on startup. This is particularly useful when developing or demoing while using an in-memory database.</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="annotation">@Override</span> <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Class</span>&lt;? <span class="directive">extends</span> FixtureScript&gt;&gt; getFixtures() { <span class="keyword">return</span> Lists.newArrayList(todoapp.fixture.demo.DemoFixture.class); }</code></pre> </div> </div> <div class="paragraph"> <p>Note that in order for fixtures to be installed it is also necessary to set the <code>isis.persistor.datanucleus.install-fixtures</code> key to <code>true</code>. This can most easily be done using the <code>getConfigurationProperties()</code> method, discussed below.</p> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_AppManifest-bootstrapping_api_getConfigurationProperties"><code>getConfigurationProperties()</code></h5> <div class="paragraph"> <p>This method allow arbitrary other configuration properties to be overridden. One common use case is in conjunction with the <code>getFixtures()</code> method, discussed above:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Override</span> <span class="directive">public</span> <span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>, <span class="predefined-type">String</span>&gt; getConfigurationProperties() { <span class="predefined-type">Map</span>&lt;<span class="predefined-type">String</span>, <span class="predefined-type">String</span>&gt; props = Maps.newHashMap(); props.put(<span class="string"><span class="delimiter">"</span><span class="content">isis.persistor.datanucleus.install-fixtures</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">true</span><span class="delimiter">"</span></span>); <span class="keyword">return</span> props; }</code></pre> </div> </div> </div> </div> <div class="sect3"> <h4 id="__rgcms_classes_AppManifest-bootstrapping_bootstrapping">3.1.2. Bootstrapping</h4> <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>The recommendations in this section no longer apply if using the <a href="../rgcms/rgcms.html#__rgcms_classes_AppManifest2-bootstrapping_bootstrapping"><code>AppManifest2</code></a> interface and <code>Module</code>s to bootstrap your application.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>One of the primary goals of the <code>AppManifest</code> is to unify the bootstrapping of both integration tests and the webapp. This requires that the integration tests and webapp can both reference the implementation.</p> </div> <div class="paragraph"> <p>We strongly recommend using a <code>myapp-app</code> Maven module to hold the implementation of the <code>AppManifest</code>. This Maven module can then also hold dependencies which are common to both integration tests and the webapp, specifically the <code>org.apache.isis.core:isis-core-runtime</code> and the <code>org.apache.isis.core:isis-core-wrapper</code> modules.</p> </div> <div class="paragraph"> <p>We also strongly recommend that any application-layer domain services and view models (code that references persistent domain entities but that is not referenced back) is moved to this <code>myapp-app</code> module. This will allow the architectural layering of the overall application to be enforced by Maven.</p> </div> <div class="paragraph"> <p>What then remains is to update the bootstrapping code itself.</p> </div> <div class="paragraph"> <p>There are several different contexts in which the framework needs to be bootstrapped:</p> </div> <div class="ulist"> <ul> <li> <p>the first is as a "regular" webapp (using the <a href="../ugvw/ugvw.html">Wicket viewer</a>). Here the <code>AppManifest</code> just needs to be specified as a configuration property, usually done using the <code>WEB-INF/isis.properties</code> configuration file:<br></p> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="ini">isis.appManifest=domainapp.app.MyAppAppManifest</code></pre> </div> </div> </li> <li> <p>the second is also as a webapp, but from within the context of the IDE.<br></p> <div class="paragraph"> <p>Here, it’s common to use the <code>org.apache.isis.WebServer</code> class to launch your application from the <a href="../ugbtb/ugbtb.html#_ugbtb_deployment_cmd-line">command line</a>. This allows the <code>AppManifest</code> to be specified using the <code>-m</code> (or <code>--manifest</code>) flag:<br></p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="ini">java org.apache.isis.WebServer -m com.mycompany.myapp.MyAppAppManifestWithFixtures</code></pre> </div> </div> </li> <li> <p>the third case is within an integration test.<br></p> <div class="paragraph"> <p>The code to boostrap an integration test is shown in the <a href="../ugtst/ugtst.html#_ugtst_integ-test-support_bootstrapping">testing guide</a>, but once again an <code>AppManifest</code> is required.</p> </div> </li> </ul> </div> <div class="paragraph"> <p>In some cases an integration test uses the exact same <code>AppManifest</code> as the regular webapp. Sometimes though it is necessary to "tweak" the <code>AppManifest</code>:</p> </div> <div class="ulist"> <ul> <li> <p>it might use additional services, such as services to mock out external dependencies, or to provide fake data</p> </li> <li> <p>it might override certain configuration properties, eg to run against an in-memory HSQLDB database.</p> </li> </ul> </div> <div class="paragraph"> <p>The next section describes some helper classes that the framework provides to help achieve this.</p> </div> <div class="sect4"> <h5 id="__rgcms_classes_AppManifest-bootstrapping_bootstrapping_AppManifestAbstract">AppManifestAbstract</h5> <div class="admonitionblock important"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-important" title="Important"></i> </td> <td class="content"> <div class="paragraph"> <p>The framework-provided <code>AppManifestAbstract2</code> and <code>AppManifestAbstract2.Builder</code> supercede <code>AppManifestAbstract</code>, making it easy to write an <code>AppManifest</code> defined by a set of <a href="#_rgcms_classes_Module"><code>Module</code></a> implementations.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The <code>AppManifestAbstract</code> and its associated builder (<code>AppManifestAbstract.Builder</code>) make it easy to bootstrap the application both as a webapp and also as an integration test.</p> </div> <div class="paragraph"> <p>Rather than implement <code>AppManifest</code> interface directly, instead your application subclasses from <code>AppManifestAbstract</code>. This takes an instance of a <code>AppManifestAbstract.Builder</code> in its constructor; the builder is what allows for variation between environments.</p> </div> <div class="paragraph"> <p>Moreover, these classes recognise that configuration properties fall into two broad classes:</p> </div> <div class="ulist"> <ul> <li> <p>those that are fixed and do not change between environments.<br></p> <div class="paragraph"> <p>In other words these describe how the application chooses to configure the framework itself, eg global disable of editing of properties, or enabling of auditing.</p> </div> </li> <li> <p>those that change between environments.<br></p> <div class="paragraph"> <p>The classic example here is the JDBC URL.</p> </div> </li> </ul> </div> <div class="paragraph"> <p>For example, the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>'s <code>AppManifest</code> is defined as:</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">DomainAppAppManifest</span> <span class="directive">extends</span> AppManifestAbstract { <span class="directive">public</span> <span class="directive">static</span> <span class="directive">final</span> Builder BUILDER = Builder.forModules( SimpleModuleDomSubmodule.class, <i class="conum" data-value="1"></i><b>(1)</b> DomainAppApplicationModuleFixtureSubmodule.class, DomainAppApplicationModuleServicesSubmodule.class ) .withConfigurationPropertiesFile(DomainAppAppManifest.class, <i class="conum" data-value="2"></i><b>(2)</b> <span class="string"><span class="delimiter">"</span><span class="content">isis.properties</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">authentication_shiro.properties</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">persistor_datanucleus.properties</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">viewer_restfulobjects.properties</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">viewer_wicket.properties</span><span class="delimiter">"</span></span> ).withAuthMechanism(<span class="string"><span class="delimiter">"</span><span class="content">shiro</span><span class="delimiter">"</span></span>); <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">public</span> DomainAppAppManifest() { <span class="local-variable">super</span>(BUILDER); <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>the modules that make up the application; corresponds to <code>AppManifest#getModules()</code></td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the (non-changing with environment) set of configuration properties, loaded relative to the manifest itself; corresponds to <code>AppManifest#getConfigurationProperties()</code></td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>override of components; correponds to both <code>AppManifest#getAuthenticationMechanism()</code> and <code>AppManifest#getAuthorizationMechanism()</code></td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>Pass the builder up to the superclass.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>If the integration tests requires no tweaking, then the <code>AppManifest</code> can be used directly, 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="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTestAbstract</span> <span class="directive">extends</span> IntegrationTestAbstract2 { <span class="annotation">@BeforeClass</span> <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initSystem() { bootstrapUsing(<span class="keyword">new</span> DomainAppAppManifest()); } }</code></pre> </div> </div> <div class="paragraph"> <p>On the other hand, if tweaking is required then exposing the builder as a <code>public static</code> field makes this easy to do:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTestAbstract</span> <span class="directive">extends</span> IntegrationTestAbstract2 { <span class="annotation">@BeforeClass</span> <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initSystem() { bootstrapUsing(DomainAppAppManifest.BUILDER .withAdditionalModules(...) .withAdditionalServices(...) .withConfigurationPropertiesFile(<span class="string"><span class="delimiter">"</span><span class="content">...</span><span class="delimiter">"</span></span>) .withConfigurationProperty(<span class="string"><span class="delimiter">"</span><span class="content">...</span><span class="delimiter">"</span></span>,<span class="string"><span class="delimiter">"</span><span class="content">...</span><span class="delimiter">"</span></span>) .build() ); } }</code></pre> </div> </div> </div> </div> <div class="sect3"> <h4 id="__rgcms_classes_AppManifest-bootstrapping_subsidiary-goals">3.1.3. Subsidiary Goals</h4> <div class="paragraph"> <p>There are a number of subsidiary goals of the <code>AppManifest</code> class (though not all of these are fully implemented):</p> </div> <div class="ulist"> <ul> <li> <p>Allow different integration tests to run with different manifests.</p> <div class="ulist"> <ul> <li> <p>Normally the running application is shared (on a thread-local) between integration tests. What the framework could perhaps do is to be intelligent enough to keep track of the manifest in use for each integration test and tear down the shared state if the "next" test uses a different manifest</p> </li> </ul> </div> </li> <li> <p>Provide a programmatic way to contribute elements of <code>web.xml</code>.</p> </li> <li> <p>Provide a programmatic way to configure Shiro security.</p> </li> <li> <p>Anticipate the module changes forthcoming in Java 9.</p> <div class="ulist"> <ul> <li> <p>Eventually we see that the <code>AppManifest</code> class acting as an "aggregator", with the list of modules will become Java 9 modules each advertising the types that they export.</p> </li> <li> <p>It might even be possible for <code>AppManifest</code>s to be switched on and off dynamically (eg if Java9 is compatible with OSGi, being one of the design goals).</p> </li> </ul> </div> </li> </ul> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_super">3.2. Superclasses</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/rgcms/_rgcms_classes_super.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/rgcms/_rgcms_classes_super.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/rgcms/_rgcms_classes_super.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/rgcms/_rgcms_classes_super.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/rgcms/_rgcms_classes_super.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>This section catalogues the various convenience (non event) superclasses defined by Apache Isis. These are listed in the table below.</p> </div> <table class="tableblock frame-all grid-all spread"> <caption class="title"> Table 5. Convenience Superclasses </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">Maven Module<br> Impl’n (g: a:)</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="../rgcms/rgcms.html#_rgcms_classes_super_AbstractContainedObject"><code>o.a.i.applib.</code><br> <code>AbstractContainedObject</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractDomainObject"><code>o.a.i.applib.</code><br> <code>AbstractDomainObject</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractFactoryAndRepository"><code>o.a.i.applib.</code><br> <code>AbstractFactoryAndRepository</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractService"><code>o.a.i.applib.</code><br> <code>AbstractService</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber"><code>o.a.i.applib.</code><br> <code>AbstractSubscriber</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractViewModel"><code>o.a.i.applib.</code><br> <code>AbstractViewModel</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_super_FixtureScript"><code>o.a.i.applib.</code><br> <code>fixturescript</code><br> <code>FixtureScript</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_super_FixtureScripts"><code>o.a.i.applib.</code><br> <code>fixturescripts</code><br> <code>FixtureScripts</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>FixtureScriptsDefault</code> is a default implementation that is used when the alternative <a href="../rgsvc/rgsvc.html#_rgsvc_testing_FixtureScriptsSpecificationProvider"><code>FixtureScriptsSpecificationProvider</code></a> is provided (and no other implementation of <code>FixtureScripts</code> was found).</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">depends on:<br> <code>ClassDiscoveryService</code></p></td> </tr> </tbody> </table> <div class="sect3"> <h4 id="_rgcms_classes_super_AbstractContainedObject">3.2.1. <code>AbstractContainedObject</code></h4> <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/rgcms/_rgcms_classes_super_AbstractContainedObject.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/rgcms/_rgcms_classes_super_AbstractContainedObject.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/rgcms/_rgcms_classes_super_AbstractContainedObject.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/rgcms/_rgcms_classes_super_AbstractContainedObject.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/rgcms/_rgcms_classes_super_AbstractContainedObject.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>This class is a convenience superclass for domain objects and services, providing general purpose methods for interacting with the framework. These include:</p> </div> <div class="ulist"> <ul> <li> <p><code>allMatches(Query)</code> - search for all objects matching the specified <code>Query</code>.<br></p> <div class="paragraph"> <p>+ Note that this, and other similar methods (eg <code>firstMatch(…​)</code>, <code>uniqueMatch(…​)</code>) will automatically flush the current transaction.</p> </div> </li> <li> <p><code>newTransientInstance(Class)</code> - to create a new instance of an object, with any services injected into it</p> </li> <li> <p><code>persistIfNotAlready(Object)</code> - to persist an object<br></p> <div class="paragraph"> <p>In fact, the object is queued up to be persisted, and is only actually persisted either when the transaction commits, or when the transaction is flushed (typically when a query is performed).</p> </div> </li> <li> <p><code>warnUser(String)</code> - generate a warning to the user</p> </li> <li> <p><code>getContainer()</code> - which returns the <code>DomainObjectContainer</code></p> </li> </ul> </div> <div class="paragraph"> <p>Each of these methods simply delegates to an equivalent method in <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer"><code>DomainObjectContainer</code></a>.</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>In practice we find that there’s little to gain from subclassing; it’s easier/less obscure to simply inject <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer"><code>DomainObjectContainer</code></a> into a simple pojo class.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_super_AbstractDomainObject">3.2.2. <code>AbstractDomainObject</code></h4> <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/rgcms/_rgcms_classes_super_AbstractDomainObject.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/rgcms/_rgcms_classes_super_AbstractDomainObject.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/rgcms/_rgcms_classes_super_AbstractDomainObject.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/rgcms/_rgcms_classes_super_AbstractDomainObject.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/rgcms/_rgcms_classes_super_AbstractDomainObject.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>This class extends <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractContainedObject"><code>AbstractContainedObject</code></a>, adding in convenience methods for managing the persistence lifecycle of the object instance.</p> </div> <div class="paragraph"> <p>Each of these methods, eg <code>isPersistent(…​)</code>, delegates to an equivalent method in <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer"><code>DomainObjectContainer</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_super_AbstractFactoryAndRepository">3.2.3. <code>AbstractFactoryAndRepository</code></h4> <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/rgcms/_rgcms_classes_super_AbstractFactoryAndRepository.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/rgcms/_rgcms_classes_super_AbstractFactoryAndRepository.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/rgcms/_rgcms_classes_super_AbstractFactoryAndRepository.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/rgcms/_rgcms_classes_super_AbstractFactoryAndRepository.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/rgcms/_rgcms_classes_super_AbstractFactoryAndRepository.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>This class extends <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractContainedObject"><code>AbstractContainedObject</code></a>. Its intent was to be a convenience subclass for services acting as either a repository or a factory, however note that all of the methods that it defines are now deprecated.</p> </div> <div class="paragraph"> <p>Instead, indicate that a service is repository using the <a href="../rgant/rgant.html#_rgant-DomainService_repositoryFor"><code>@DomainService#repositoryFor()</code></a> attribute.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_super_AbstractService">3.2.4. <code>AbstractService</code></h4> <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/rgcms/_rgcms_classes_super_AbstractService.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/rgcms/_rgcms_classes_super_AbstractService.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/rgcms/_rgcms_classes_super_AbstractService.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/rgcms/_rgcms_classes_super_AbstractService.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/rgcms/_rgcms_classes_super_AbstractService.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>This class provides an implementation of the optional <code>getId()</code> method for domain services, based upon the classes name.</p> </div> <div class="paragraph"> <p>In practice there is little to gain from subclassing. Instead annotate with <a href="../rgant/rgant.html#_rgant_DomainService"><code>@DomainService</code></a> and specify its <a href="../rgant/rgant.html#_rgant_DomainService_objectType"><code>#objectType()</code></a></p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_super_AbstractSubscriber">3.2.5. <code>AbstractSubscriber</code></h4> <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/rgcms/_rgcms_classes_super_AbstractSubscriber.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/rgcms/_rgcms_classes_super_AbstractSubscriber.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/rgcms/_rgcms_classes_super_AbstractSubscriber.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/rgcms/_rgcms_classes_super_AbstractSubscriber.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/rgcms/_rgcms_classes_super_AbstractSubscriber.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>This is a convenience superclass for creating subscriber domain services on the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService"><code>EventBusService</code></a>. It uses <a href="../rgant/rgant.html#_rgant-PostConstruct"><code>@PostConstruct</code></a> and <a href="../rgant/rgant.html#_rgant-PreDestroy"><code>@PreDestroy</code></a> callbacks to automatically register/unregister itself with the <code>EventBusService</code>.</p> </div> <div class="paragraph"> <p>It’s important that subscribers register before any domain services that might emit events on the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService"><code>EventBusService</code></a>. For example, the (non-ASF) <a href="http://platform.incode.org" target="_blank" rel="noopener">Incode Platform</a> security module provides a domain service that automatically seeds certain domain entities; these will generate <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent">lifecycle events</a> and so any subscribers must be registered before such seed services. The easiest way to do this is to use the <a href="../rgant/rgant.html#_rgant-DomainServiceLayout_menuOrder"><code>@DomainServiceLayout#menuOrder()</code></a> attribute.</p> </div> <div class="paragraph"> <p>As a convenience, the <code>AbstractSubscriber</code> specifies this attribute.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_super_AbstractViewModel">3.2.6. <code>AbstractViewModel</code></h4> <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/rgcms/_rgcms_classes_super_AbstractViewModel.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/rgcms/_rgcms_classes_super_AbstractViewModel.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/rgcms/_rgcms_classes_super_AbstractViewModel.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/rgcms/_rgcms_classes_super_AbstractViewModel.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/rgcms/_rgcms_classes_super_AbstractViewModel.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>This class extends <a href="../rgcms/rgcms.html#_rgcms_classes_super_AbstractContainedObject"><code>AbstractContainedObject</code></a>, also implementing the <a href="../rgcms/rgcms.html#_rgcms_classes_super_ViewModel"><code>ViewModel</code></a> interface. In and of itself it provides no new behaviour.</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>As an alternative, consider simply annotating the view model class with the {@link org.apache.isis.applib.annotation.ViewModel} annotation.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_super_FixtureScript">3.2.7. <code>FixtureScript</code></h4> <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/rgcms/_rgcms_classes_super_FixtureScript.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/rgcms/_rgcms_classes_super_FixtureScript.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/rgcms/_rgcms_classes_super_FixtureScript.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/rgcms/_rgcms_classes_super_FixtureScript.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/rgcms/_rgcms_classes_super_FixtureScript.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>FixtureScript</code> class is an abstract class defining an API to set up data within the object store, either for integration tests or while demoing/prototyping.</p> </div> <div class="paragraph"> <p>The primary method that subclasses must implement is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">protected</span> <span class="directive">abstract</span> <span class="type">void</span> execute(<span class="directive">final</span> ExecutionContext executionContext);</code></pre> </div> </div> <div class="paragraph"> <p>In this method the fixture script can in theory do anything, but in practice it is recommended that it uses injected domain services to set up data. The provided <code>ExecutionContext</code> is used to invoke child fixture scripts, and alsocan be used to store references to any created objects (so that the calling test can access these objects/so that they are rendered in the view model).</p> </div> <div class="paragraph"> <p>See the see the <a href="../ugtst/ugtst.html#_ugtst_fixture-scripts">user guide’s testing chapter</a> for further discussion on the use of fixture scripts, in particular <a href="../ugtst/ugtst.html#_ugtst_fixture-scripts_api-and-usage">fixture scripts' API and usage</a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_super_FixtureScripts">3.2.8. <code>FixtureScripts</code></h4> <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/rgcms/_rgcms_classes_super_FixtureScripts.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/rgcms/_rgcms_classes_super_FixtureScripts.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/rgcms/_rgcms_classes_super_FixtureScripts.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/rgcms/_rgcms_classes_super_FixtureScripts.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/rgcms/_rgcms_classes_super_FixtureScripts.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>This abstract class constitutes the API of a domain service to execute <a href="../rgcms/rgcms.html#_rgcms_classes_super_FixtureScript"><code>FixtureScript</code></a>s.</p> </div> <div class="paragraph"> <p>For more information, see <a href="../rgsvc/rgsvc.html#_rgsvc_testing_FixtureScripts"><code>FixtureScripts</code></a> in the domain services guide.</p> </div> <div class="paragraph"> <p>See the see the <a href="../ugtst/ugtst.html#_ugtst_fixture-scripts">user guide’s testing chapter</a> for further discussion on the use of fixture scripts, in particular <a href="../ugtst/ugtst.html#_ugtst_fixture-scripts_api-and-usage">fixture scripts' API and usage</a>.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_domainevent">3.3. Domain Event Classes</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/rgcms/_rgcms_classes_domainevent.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/rgcms/_rgcms_classes_domainevent.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/rgcms/_rgcms_classes_domainevent.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/rgcms/_rgcms_classes_domainevent.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/rgcms/_rgcms_classes_domainevent.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>This section catalogues the various domain event classes defined by Apache Isis.</p> </div> <div class="paragraph"> <p>These events are broadcast on the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService"><code>EventBusService</code></a>. The domain events are broadcast as a result of being specified in the <a href="../rgant/rgant.html#_rgant-Action_domainEvent"><code>@Action#domainEvent()</code></a>, <a href="../rgant/rgant.html#_rgant-Property_domainEvent"><code>@Property#domainEvent()</code></a> or <a href="../rgant/rgant.html#_rgant-Collection_domainEvent"><code>@Collection#domainEvent()</code></a> attributes.</p> </div> <div class="paragraph"> <p>They are listed in the table below.</p> </div> <table class="tableblock frame-all grid-all spread"> <caption class="title"> Table 6. Domain Event Classes </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">Maven Module<br> Impl’n (g: a:)</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="../rgcms/rgcms.html#_rgcms_classes_domainevent_AbstractDomainEvent"><code>o.a.i.applib.</code><br> <code>AbstractDomainEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Superclass of the other domain events, listed below in this table.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_ActionDomainEvent"><code>o.a.i.applib.</code><br> <code>ActionDomainEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>ActionDomainEvent.Default</code> is the concrete implementation used if no <code>@Action#domainEvent</code> attribute is specified</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast whenever there is an interaction (hide/disable/validate/pre-execute/post-execute) with an object’s action.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_CollectionDomainEvent"><code>o.a.i.applib.</code><br> <code>CollectionDomainEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>CollectionDomainEvent.Default</code> is the concrete implementation used if no <code>@Collection#domainEvent</code> attribute is specified.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast whenever there is an interaction (hide/disable/validate/access) with an object’s collection.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_PropertyDomainEvent"><code>o.a.i.applib.</code><br> <code>PropertyDomainEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>PropertyDomainEvent.Default</code> is the concrete implementation used if no <code>@Propert#domainEvent</code> attribute is specified</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast whenever there is an interaction (hide/disable/validate/access) with an object’s property.</p></td> </tr> </tbody> </table> <div class="sect3"> <h4 id="_rgcms_classes_domainevent_AbstractDomainEvent">3.3.1. <code>AbstractDomainEvent</code></h4> <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/rgcms/_rgcms_classes_domainevent_AbstractDomainEvent.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/rgcms/_rgcms_classes_domainevent_AbstractDomainEvent.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/rgcms/_rgcms_classes_domainevent_AbstractDomainEvent.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/rgcms/_rgcms_classes_domainevent_AbstractDomainEvent.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/rgcms/_rgcms_classes_domainevent_AbstractDomainEvent.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>This class is the superclass for all domain events that are raised by the framework when interacting with actions, properties or collections.</p> </div> <div class="paragraph"> <p>Its immediate subclasses are:</p> </div> <div class="ulist"> <ul> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_ActionDomainEvent"><code>ActionDomainEvent</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_PropertyDomainEvent"><code>PropertyDomainEvent</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_CollectionDomainEvent"><code>CollectionDomainEvent</code></a></p> </li> </ul> </div> <div class="paragraph"> <p>The main purpose of the class is to define the protocol by which subscribers can influence an interaction (eg hide a collection, disable a property, validate action arguments). It class also provides a simple mechanism to allow adhoc sharing of user data between different phases.</p> </div> <div class="sect4"> <h5 id="_api">API</h5> <div class="paragraph"> <p>The API of the class is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">AbstractDomainEvent</span>&lt;S&gt; <span class="directive">extends</span> java.util.EventObject { <span class="directive">public</span> S getSource(); <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">public</span> <span class="predefined-type">Object</span> getMixedIn(); <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">public</span> <span class="predefined-type">Object</span> getSubject(); <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">public</span> Identifier getIdentifier(); <i class="conum" data-value="4"></i><b>(4)</b> <span class="directive">public</span> Phase getEventPhase(); <i class="conum" data-value="5"></i><b>(5)</b> <span class="directive">public</span> <span class="type">void</span> hide(); <i class="conum" data-value="6"></i><b>(6)</b> <span class="directive">public</span> <span class="type">boolean</span> isHidden(); <i class="conum" data-value="7"></i><b>(7)</b> <span class="directive">public</span> <span class="type">void</span> disable(<span class="directive">final</span> <span class="predefined-type">String</span> reason); <i class="conum" data-value="8"></i><b>(8)</b> <span class="directive">public</span> <span class="type">void</span> disable(<span class="directive">final</span> TranslatableString reason); <span class="directive">public</span> <span class="predefined-type">String</span> getDisabledReason(); <i class="conum" data-value="9"></i><b>(9)</b> <span class="directive">public</span> TranslatableString getDisabledReasonTranslatable(); <span class="directive">public</span> <span class="type">boolean</span> isDisabled(); <span class="directive">public</span> <span class="type">void</span> invalidate(<span class="directive">final</span> <span class="predefined-type">String</span> reason); <i class="conum" data-value="10"></i><b>(10)</b> <span class="directive">public</span> <span class="type">void</span> invalidate(<span class="directive">final</span> TranslatableString reason); <span class="directive">public</span> <span class="predefined-type">String</span> getInvalidityReason(); <i class="conum" data-value="11"></i><b>(11)</b> <span class="directive">public</span> TranslatableString getInvalidityReasonTranslatable(); <span class="directive">public</span> <span class="type">boolean</span> isInvalid(); <span class="directive">public</span> <span class="type">void</span> veto(<span class="directive">final</span> <span class="predefined-type">String</span> reason, <span class="directive">final</span> <span class="predefined-type">Object</span>... args); <i class="conum" data-value="12"></i><b>(12)</b> <span class="directive">public</span> <span class="type">void</span> veto(<span class="directive">final</span> TranslatableString translatableReason); <span class="directive">public</span> <span class="predefined-type">Object</span> get(<span class="predefined-type">Object</span> key); <i class="conum" data-value="13"></i><b>(13)</b> <span class="directive">public</span> <span class="type">void</span> put(<span class="predefined-type">Object</span> key, <span class="predefined-type">Object</span> value); }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>The domain object raising this event. <div class="paragraph"> <p>For a "regular" action, property or collection then this will be the target domain object. But for a "mixin" action, this will be an instance of the mixin itself.</p> </div></td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>For a "mixin", this will be the target object that is being contributed to. <div class="paragraph"> <p>For a "regular" action, this will return <code>null</code>.</p> </div></td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>Returns the domain object being interacted with, irrespective of whether this is a "regular" action/property/collection or a "mixin". <div class="ulist"> <ul> <li> <p>For a regular member, this will return the same as <code>getSource()</code>.</p> </li> <li> <p>For a mixin, this will return the same as <code>getMixedIn()</code>.</p> </li> </ul> </div></td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>Identifier of the action, property or collection being interacted with.</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>Whether the framework is checking visibility, enablement, validity or actually executing (invoking action, editing property), as per the <code>Phase</code> enum (defined below).</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>API for subscribers to hide the member</td> </tr> <tr> <td><i class="conum" data-value="7"></i><b>7</b></td> <td>Used by the framework to determine if the member should be hidden (not rendered)</td> </tr> <tr> <td><i class="conum" data-value="8"></i><b>8</b></td> <td>API for subscribers to disable the member, specifying the reason why (possibly translated)</td> </tr> <tr> <td><i class="conum" data-value="9"></i><b>9</b></td> <td>Used by the framework to determine whether the member should be disabled (greyed out) when rendered.</td> </tr> <tr> <td><i class="conum" data-value="10"></i><b>10</b></td> <td>API for subscribers to invalidate an interaction, eg invalid arguments to an action</td> </tr> <tr> <td><i class="conum" data-value="11"></i><b>11</b></td> <td>Used by the framework to determine whether the interaction is invalid and should be blocked (eg pressing OK shows message)</td> </tr> <tr> <td><i class="conum" data-value="12"></i><b>12</b></td> <td>Convenience API for subscribers to veto; will automatically call either <code>hide()</code>, <code>disable(…​)</code> or <code>invalidate(…​)</code> based on the phase</td> </tr> <tr> <td><i class="conum" data-value="13"></i><b>13</b></td> <td>Mechanism to allow subscribers to share arbitrary information between phases. One event instance is used for both the hide and disable phases, and a different event instance is shared between validate/pre-execute/post-execute.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The referenced <code>Phase</code> enum is in turn:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">enum</span> Phase { HIDE, DISABLE, VALIDATE, EXECUTING, EXECUTED; <span class="directive">public</span> <span class="type">boolean</span> isValidatingOrLater(); <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>The significance being that at this point the proposed values/arguments are known, and so the event can be fully populated.</td> </tr> </tbody> </table> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_domainevent_ActionDomainEvent">3.3.2. <code>ActionDomainEvent</code></h4> <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/rgcms/_rgcms_classes_domainevent_ActionDomainEvent.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/rgcms/_rgcms_classes_domainevent_ActionDomainEvent.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/rgcms/_rgcms_classes_domainevent_ActionDomainEvent.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/rgcms/_rgcms_classes_domainevent_ActionDomainEvent.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/rgcms/_rgcms_classes_domainevent_ActionDomainEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_AbstractDomainEvent"><code>AbstractDomainEvent</code></a> for actions.</p> </div> <div class="paragraph"> <p>The class has a number of responsibilities (in addition to those it inherits):</p> </div> <div class="ulist"> <ul> <li> <p>capture the target object being interacted with</p> </li> <li> <p>capture the arguments for each of the action’s parameters</p> </li> <li> <p>provide selected metadata about the action parameters from the metamodel (names, types)</p> </li> <li> <p>link back to the <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_CommandContext"><code>CommandContext</code></a> service’s <code>Command</code> object</p> </li> </ul> </div> <div class="paragraph"> <p>The class itself is instantiated automatically by the framework whenever interacting with a rendered object’s action.</p> </div> <div class="sect4"> <h5 id="_api_2">API</h5> <div class="paragraph"> <p>The API of the class is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">ActionDomainEvent</span>&lt;S&gt; <span class="directive">extends</span> AbstractDomainEvent&lt;S&gt; { <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Default</span> <span class="directive">extends</span> ActionDomainEvent&lt;<span class="predefined-type">Object</span>&gt; { ... } <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Noop</span> <span class="directive">extends</span> ActionDomainEvent&lt;<span class="predefined-type">Object</span>&gt; { ... } <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Doop</span> <span class="directive">extends</span> ActionDomainEvent&lt;<span class="predefined-type">Object</span>&gt; { ... } <i class="conum" data-value="3"></i><b>(3)</b> <span class="annotation">@Deprecated</span> <span class="directive">public</span> Command getCommand(); <i class="conum" data-value="4"></i><b>(4)</b> <span class="directive">public</span> SemanticsOf getSemantics(); <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">String</span>&gt; getParameterNames(); <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Class</span>&lt;?&gt;&gt; getParameterTypes(); <span class="directive">public</span> <span class="predefined-type">List</span>&lt;<span class="predefined-type">Object</span>&gt; getArguments(); <i class="conum" data-value="5"></i><b>(5)</b> <span class="directive">public</span> <span class="predefined-type">Object</span> getReturnValue(); <i class="conum" data-value="6"></i><b>(6)</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>The <code>Default</code> nested static class is the default for the <a href="../rgant/rgant.html#_rgant-Action_domainEvent"><code>@Action#domainEvent()</code></a> annotation attribute. Whether this raises an event or not depends upon the <code>isis.reflector.facet.actionAnnotation.domainEvent.postForDefault</code> configuration property.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>The <code>Noop</code> class is provided as a convenience to indicate that an event should <em>not</em> be posted (irrespective of the configuration property setting).</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>Similarly, the <code>Doop</code> class is provided as a convenience to indicate that an event <em>should</em> be raised (irrespective of the configuration property setting).</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>Deprecated, use <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_CommandContext"><code>CommandContext</code></a> or (better) <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_InteractionContext"><code>InteractionContext</code></a>instead.</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>The arguments being used to invoke the action; populated during validate phase and subsequent phases.</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>The value returned by the action; populated only in the executed phase.</td> </tr> </tbody> </table> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_domainevent_CollectionDomainEvent">3.3.3. <code>CollectionDomainEvent</code></h4> <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/rgcms/_rgcms_classes_domainevent_CollectionDomainEvent.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/rgcms/_rgcms_classes_domainevent_CollectionDomainEvent.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/rgcms/_rgcms_classes_domainevent_CollectionDomainEvent.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/rgcms/_rgcms_classes_domainevent_CollectionDomainEvent.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/rgcms/_rgcms_classes_domainevent_CollectionDomainEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_AbstractDomainEvent"><code>AbstractDomainEvent</code></a> for collections.</p> </div> <div class="paragraph"> <p>The class has a couple of responsibilities (in addition to those it inherits):</p> </div> <div class="ulist"> <ul> <li> <p>capture the target object being interacted with</p> </li> <li> <p>indicate whether the interaction is to add or remove an object from the collection (or simply to indicate that the collection is being accessed/read)</p> </li> <li> <p>capture the object reference being added or removed</p> </li> </ul> </div> <div class="paragraph"> <p>The class itself is instantiated automatically by the framework whenever interacting with a rendered object’s collection.</p> </div> <div class="sect4"> <h5 id="_api_3">API</h5> <div class="paragraph"> <p>The API of the class is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">CollectionDomainEvent</span>&lt;S,T&gt; <span class="directive">extends</span> AbstractDomainEvent&lt;S&gt; { <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Default</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">extends</span> CollectionDomainEvent&lt;<span class="predefined-type">Object</span>, <span class="predefined-type">Object</span>&gt; { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Noop</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">extends</span> CollectionDomainEvent&lt;<span class="predefined-type">Object</span>, <span class="predefined-type">Object</span>&gt; { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Doop</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">extends</span> CollectionDomainEvent&lt;<span class="predefined-type">Object</span>, <span class="predefined-type">Object</span>&gt; { ... } <span class="directive">public</span> T getValue(); <i class="conum" data-value="4"></i><b>(4)</b> <span class="directive">public</span> Of getOf(); <i class="conum" data-value="5"></i><b>(5)</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>The <code>Default</code> nested static class is the default for the <a href="../rgant/rgant.html#_rgant-Collection_domainEvent"><code>@Collection#domainEvent()</code></a> annotation attribute. Whether this raises an event or not depends upon the <code>isis.reflector.facet.collectionAnnotation.domainEvent.postForDefault</code> configuration property.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>The <code>Noop</code> class is provided as a convenience to indicate that an event should <em>not</em> be posted (irrespective of the configuration property setting).</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>Similarly, the <code>Doop</code> class is provided as a convenience to indicate that an event <em>should</em> be raised (irrespective of the configuration property setting).</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>the object being added or removed</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>whether this is to add or to remove</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>where the <code>Of</code> enum indicates in turn how the collection is being interacted with:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">static</span> <span class="type">enum</span> Of { ACCESS, <i class="conum" data-value="1"></i><b>(1)</b> ADD_TO, <i class="conum" data-value="2"></i><b>(2)</b> REMOVE_FROM <i class="conum" data-value="3"></i><b>(3)</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>collection is being rendered; set during for hide and disable phases</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>collection is being added to; set for validate, executing and executed phases</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>or, collection is being removed from; set for validate, executing and executed phases</td> </tr> </tbody> </table> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_domainevent_PropertyDomainEvent">3.3.4. <code>PropertyDomainEvent</code></h4> <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/rgcms/_rgcms_classes_domainevent_PropertyDomainEvent.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/rgcms/_rgcms_classes_domainevent_PropertyDomainEvent.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/rgcms/_rgcms_classes_domainevent_PropertyDomainEvent.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/rgcms/_rgcms_classes_domainevent_PropertyDomainEvent.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/rgcms/_rgcms_classes_domainevent_PropertyDomainEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_domainevent_AbstractDomainEvent"><code>AbstractDomainEvent</code></a> for properties.</p> </div> <div class="paragraph"> <p>The class has a couple of responsibilities (in addition to those it inherits):</p> </div> <div class="ulist"> <ul> <li> <p>capture the target object being interacted with</p> </li> <li> <p>capture the old and new values of the property</p> </li> </ul> </div> <div class="paragraph"> <p>The class itself is instantiated automatically by the framework whenever interacting with a rendered object’s property.</p> </div> <div class="sect4"> <h5 id="_api_4">API</h5> <div class="paragraph"> <p>The API of the class is:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">PropertyDomainEvent</span>&lt;S,T&gt; <span class="directive">extends</span> AbstractDomainEvent&lt;S&gt; { <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Default</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">extends</span> PropertyDomainEvent&lt;<span class="predefined-type">Object</span>, <span class="predefined-type">Object</span>&gt; { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Noop</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">extends</span> PropertyDomainEvent&lt;<span class="predefined-type">Object</span>, <span class="predefined-type">Object</span>&gt; { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="type">class</span> <span class="class">Doop</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">extends</span> PropertyDomainEvent&lt;<span class="predefined-type">Object</span>, <span class="predefined-type">Object</span>&gt; { ... } <span class="directive">public</span> T getOldValue(); <i class="conum" data-value="4"></i><b>(4)</b> <span class="directive">public</span> T getNewValue(); <i class="conum" data-value="5"></i><b>(5)</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>The <code>Default</code> nested static class is the default for the <a href="../rgant/rgant.html#_rgant-Property_domainEvent"><code>@Property#domainEvent()</code></a> annotation attribute. Whether this raises an event or not depends upon the <code>isis.reflector.facet.propertyAnnotation.domainEvent.postForDefault</code> configuration property.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>The <code>Noop</code> class is provided as a convenience to indicate that an event should <em>not</em> be posted (irrespective of the configuration property setting).</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>Similarly, the <code>Doop</code> class is provided as a convenience to indicate that an event <em>should</em> be raised (irrespective of the configuration property setting).</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>The pre-modification value of the property; populated at validate and subsequent phases.</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>The proposed (post-modification) value of the property; populated at validate and subsequent phases</td> </tr> </tbody> </table> </div> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_uievent">3.4. UI Event Classes</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/rgcms/_rgcms_classes_uievent.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/rgcms/_rgcms_classes_uievent.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/rgcms/_rgcms_classes_uievent.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/rgcms/_rgcms_classes_uievent.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/rgcms/_rgcms_classes_uievent.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>This section catalogues the various UI event classes defined by Apache Isis.</p> </div> <div class="paragraph"> <p>These events are broadcast on the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_EventBusService"><code>EventBusService</code></a>. The domain events are broadcast as a result of being specified in the <a href="../rgant/rgant.html#_rgant-DomainObjectLayout_titleUiEvent"><code>@DomainObjectLayout#titleUiEvent()</code></a>, <a href="../rgant/rgant.html#_rgant-DomainObjectLayout_iconUiEvent"><code>@DomainObjectLayout#iconUiEvent()</code></a> or <a href="../rgant/rgant.html#_rgant-DomainObjectLayout_cssClassUiEvent"><code>@DomainObjectLayout#cssClassUiEvent()</code></a> attributes.</p> </div> <div class="paragraph"> <p>They are listed in the table below.</p> </div> <table class="tableblock frame-all grid-all spread"> <caption class="title"> Table 7. UI Event Classes </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">Maven Module<br> Impl’n (g: a:)</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="../rgcms/rgcms.html#_rgcms_classes_uievent_TitleUiEvent"><code>o.a.i.applib.</code><br> <code>TitleUiEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>TitleUiEvent.Default</code> is the concrete implementation used if no <code>@DomainObjectLayout#titleUiEvent</code> attribute is specified</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast whenever there is a requirement to obtain a title for a domain object. Note that if the domain object defines its own <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_title"><code>title()</code></a> supporting method, or has <a href="../rgant/rgant.html#_rgant-Title"><code>@Title</code></a> annotation(s) on its properties, then these will take precedence.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_uievent_IconUiEvent"><code>o.a.i.applib.</code><br> <code>IconUiEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>IconUiEvent.Default</code> is the concrete implementation used if no <code>@DomainObjectLayout#iconUiEvent</code> attribute is specified</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast whenever there is a requirement to obtain an icon (or rather, the name of an icon) for a domain object. Note that if the domain object defines its own <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_iconName"><code>iconName()</code></a> supporting method, or if it has the <a href="../rgant/rgant.html#_rgant-DomainObjectLayout#cssClassFa"><code>@DomainObjectLayout#cssClassFa()</code></a> attribute, then these will take precedence.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_uievent_CssClassUiEvent"><code>o.a.i.applib.</code><br> <code>CssClassUiEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>CssClassUiEvent.Default</code> is the concrete implementation used if no <code>@DomainObjectLayout#cssClassUiEvent</code> attribute is specified</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast whenever there is a requirement to obtain a CSS class hint for a domain object. Note that if the domain object defines its own <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_cssClass"><code>cssClass()</code></a> supporting method then this will take precedence.</p></td> </tr> </tbody> </table> <div class="sect3"> <h4 id="_rgcms_classes_uievent_TitleUiEvent">3.4.1. <code>TitleUiEvent</code></h4> <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/rgcms/_rgcms_classes_uievent_TitleUiEvent.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/rgcms/_rgcms_classes_uievent_TitleUiEvent.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/rgcms/_rgcms_classes_uievent_TitleUiEvent.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/rgcms/_rgcms_classes_uievent_TitleUiEvent.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/rgcms/_rgcms_classes_uievent_TitleUiEvent.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>This event class represents a request to obtain the title of a domain object. The class has a number of responsibilities:</p> </div> <div class="ulist"> <ul> <li> <p>capture the target object being interacted with</p> </li> <li> <p>capture the title, if any, as specified to one of the subscribers</p> </li> </ul> </div> <div class="paragraph"> <p>The class itself is instantiated automatically by the framework whenever interacting with a rendered object’s action.</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>If the domain object defines its own <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_title"><code>title()</code></a> supporting method, or has <a href="../rgant/rgant.html#_rgant-Title"><code>@Title</code></a> annotation(s) on its properties, then these will take precedence.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_uievent_IconUiEvent">3.4.2. <code>IconUiEvent</code></h4> <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/rgcms/_rgcms_classes_uievent_IconUiEvent.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/rgcms/_rgcms_classes_uievent_IconUiEvent.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/rgcms/_rgcms_classes_uievent_IconUiEvent.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/rgcms/_rgcms_classes_uievent_IconUiEvent.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/rgcms/_rgcms_classes_uievent_IconUiEvent.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>This event class represents a request to obtain the icon (or rather, name of icon) of a domain object. The class has a number of responsibilities:</p> </div> <div class="ulist"> <ul> <li> <p>capture the target object being interacted with</p> </li> <li> <p>capture the icon (name), if any, as specified to one of the subscribers</p> </li> </ul> </div> <div class="paragraph"> <p>The class itself is instantiated automatically by the framework whenever interacting with a rendered object’s action.</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>If the domain object defines its own <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_iconName"><code>iconName()</code></a> supporting method, or if it has the <a href="../rgant/rgant.html#_rgant-DomainObjectLayout#cssClassFa"><code>@DomainObjectLayout#cssClassFa()</code></a> attribute, then these will take precedence.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_uievent_CssClassUiEvent">3.4.3. <code>CssClassUiEvent</code></h4> <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/rgcms/_rgcms_classes_uievent_CssClassUiEvent.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/rgcms/_rgcms_classes_uievent_CssClassUiEvent.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/rgcms/_rgcms_classes_uievent_CssClassUiEvent.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/rgcms/_rgcms_classes_uievent_CssClassUiEvent.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/rgcms/_rgcms_classes_uievent_CssClassUiEvent.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>This event class represents a request to obtain the a CSS class hint of a domain object. The class has a number of responsibilities:</p> </div> <div class="ulist"> <ul> <li> <p>capture the target object being interacted with</p> </li> <li> <p>capture the CSS class, if any, as specified to one of the subscribers</p> </li> </ul> </div> <div class="paragraph"> <p>The class itself is instantiated automatically by the framework whenever interacting with a rendered object’s action.</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>if the domain object defines its own <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_cssClass"><code>cssClass()</code></a> supporting method then this will take precedence.</p> </div> </td> </tr> </tbody> </table> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_lifecycleevent">3.5. Lifecycle Events</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/rgcms/_rgcms_classes_lifecycleevent.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/rgcms/_rgcms_classes_lifecycleevent.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/rgcms/_rgcms_classes_lifecycleevent.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/rgcms/_rgcms_classes_lifecycleevent.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/rgcms/_rgcms_classes_lifecycleevent.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>This section catalogues the various lifecycle event classes defined by Apache Isis. These events are fired automatically when a domain object is loaded, created, updated and so forth.</p> </div> <div class="paragraph"> <p>The lifecycle event classes are listed in the table below:</p> </div> <table class="tableblock frame-all grid-all spread"> <caption class="title"> Table 8. Lifecycle Event Classes </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">Maven Module<br> Impl’n (g: a:)</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="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_AbstractLifecycleEvent"><code>o.a.i.applib.</code><br> <code>AbstractLifecycleEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class)</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Superclass of the other lifecycle events, listed below in this table.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectCreatedDomainEvent"><code>o.a.i.applib.</code><br> <code>ObjectCreatedEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>ObjectCreatedEvent.Default</code> is the concrete implementation that is used.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast when an object is first instantiated using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer_object-creation-api"><code>DomainObjectContainer</code></a>'s <code>#newTransientInstance(…​)</code> method.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectLoadedDomainEvent"><code>o.a.i.applib.</code><br> <code>ObjectLoadedEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>ObjectLoadedEvent.Default</code> is the concrete implementation that is used.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast when an object is retrieved from the database.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectPersistedDomainEvent"><code>o.a.i.applib.</code><br> <code>ObjectPersistedEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>ObjectPersistedEvent.Default</code> is the concrete implementation that is used.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast when an object is first saved (inserted) into the database using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer_object-persistence-api"><code>DomainObjectContainer</code></a>'s <code>#persist(…​)</code> method.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectPersistingDomainEvent"><code>o.a.i.applib.</code><br> <code>ObjectPersistingEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>ObjectPersistingEvent.Default</code> is the concrete implementation that is used.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast when an object is about to be saved (inserted) into the database using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer_object-persistence-api"><code>DomainObjectContainer</code></a>'s <code>#persist(…​)</code> method.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectRemovingDomainEvent"><code>o.a.i.applib.</code><br> <code>ObjectRemovingEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>ObjectRemovingEvent.Default</code> is the concrete implementation that is used.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast when an object is about to be deleted from the database using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer_object-persistence-api"><code>DomainObjectContainer</code></a>'s <code>#remove(…​)</code> method.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectUpdatedDomainEvent"><code>o.a.i.applib.</code><br> <code>ObjectUpdatedEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>ObjectUpdatedEvent.Default</code> is the concrete implementation that is used.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast when an object has just been updated in the database. This is done either explicitly when the current transaction is flushed using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer_object-persistence-api"><code>DomainObjectContainer</code></a>'s <code>#flush(…​)</code> method, else is done implicitly when the transaction commits at the end of the user request.</p></td> </tr> <tr> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectUpdatingDomainEvent"><code>o.a.i.applib.</code><br> <code>ObjectUpdatingEvent</code></a></p></td> <td class="tableblock halign-left valign-top"> <div> <div class="paragraph"> <p><code>o.a.i.core</code><br> <code>services.eventbus</code><br> <code>isis-core-applib</code></p> </div> </div></td> <td class="tableblock halign-left valign-top"><p class="tableblock">(abstract class).<br> <code>ObjectUpdatingEvent.Default</code> is the concrete implementation that is used.</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">Broadcast when an object is about to be updated in the database. This is done either explicitly when the current transaction is flushed using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_DomainObjectContainer_object-persistence-api"><code>DomainObjectContainer</code></a>'s <code>#flush(…​)</code> method, else is done implicitly when the transaction commits at the end of the user request.</p></td> </tr> </tbody> </table> <div class="sect3"> <h4 id="_rgcms_classes_lifecycleevent_AbstractLifecycleEvent">3.5.1. <code>AbstractLifecycleEvent</code></h4> <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/rgcms/_rgcms_classes_lifecycleevent_AbstractLifecycleEvent.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/rgcms/_rgcms_classes_lifecycleevent_AbstractLifecycleEvent.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/rgcms/_rgcms_classes_lifecycleevent_AbstractLifecycleEvent.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/rgcms/_rgcms_classes_lifecycleevent_AbstractLifecycleEvent.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/rgcms/_rgcms_classes_lifecycleevent_AbstractLifecycleEvent.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>This class is the superclass for all lifecycle events that are raised by the framework when loading, saving, updating or deleting objects from the database.</p> </div> <div class="paragraph"> <p>Its immediate subclasses are:</p> </div> <div class="ulist"> <ul> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectCreatedEvent"><code>ObjectCreatedEvent</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectLoadedEvent"><code>ObjectLoadedEvent</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectPersistedEvent"><code>ObjectPersistedEvent</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectPersistingEvent"><code>ObjectPersistingEvent</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectRemovingEvent"><code>ObjectRemovingEvent</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectUpdatedEvent"><code>ObjectUpdatedEvent</code></a></p> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectUpdatingEvent"><code>ObjectUpdatingEvent</code></a></p> </li> </ul> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_lifecycleevent_ObjectCreatedEvent">3.5.2. <code>ObjectCreatedEvent</code></h4> <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/rgcms/_rgcms_classes_lifecycleevent_ObjectCreatedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectCreatedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectCreatedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectCreatedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectCreatedEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_AbstractLifecycleEvent"><code>AbstractLifecycleEvent</code></a>, broadcast when an object is first instantiated using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryServuce</code></a>'s <code>#instantiate(…​)</code> method.</p> </div> <div class="paragraph"> <p><code>ObjectCreatedEvent.Default</code> is the implementation that is used by default, but this can be overridden using <a href="../rgant/rgant.html#_rgant_DomainObject_createdLifecycleEvent"><code>@DomainObject#createdLifecycleEvent()</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_lifecycleevent_ObjectLoadedEvent">3.5.3. <code>ObjectLoadedEvent</code></h4> <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/rgcms/_rgcms_classes_lifecycleevent_ObjectLoadedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectLoadedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectLoadedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectLoadedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectLoadedEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_AbstractLifecycleEvent"><code>AbstractLifecycleEvent</code></a>, broadcast when an object is retrieved from the database.</p> </div> <div class="paragraph"> <p><code>ObjectLoadedEvent.Default</code> is the concrete implementation that is used.</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>In the future this may be generalized to allow arbitrary subclasses to be broadcast, see ISIS-803.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_lifecycleevent_ObjectPersistedEvent">3.5.4. <code>ObjectPersistedEvent</code></h4> <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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistedEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_AbstractLifecycleEvent"><code>AbstractLifecycleEvent</code></a>, broadcast when an object is first saved (inserted) into the database using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService</code></a>'s <code>#persist(…​)</code> method.</p> </div> <div class="paragraph"> <p><code>ObjectPersistedEvent.Default</code> is the implementation that is used by default, but this can be overridden using <a href="../rgant/rgant.html#_rgant_DomainObject_persistedLifecycleEvent"><code>@DomainObject#persistedLifecycleEvent()</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_lifecycleevent_ObjectPersistingEvent">3.5.5. <code>ObjectPersistingEvent</code></h4> <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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectPersistingEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_AbstractLifecycleEvent"><code>AbstractLifecycleEvent</code></a>, broadcast when an object is about to be saved (inserted) into the database using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService</code></a>'s <code>#persist(…​)</code> method.</p> </div> <div class="paragraph"> <p><code>ObjectPersistingEvent.Default</code> is the implementation that is used by default, but this can be overridden using <a href="../rgant/rgant.html#_rgant_DomainObject_persistingLifecycleEvent"><code>@DomainObject#persistingLifecycleEvent()</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_lifecycleevent_ObjectRemovingEvent">3.5.6. <code>ObjectRemovingEvent</code></h4> <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/rgcms/_rgcms_classes_lifecycleevent_ObjectRemovingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectRemovingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectRemovingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectRemovingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectRemovingEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_AbstractLifecycleEvent"><code>AbstractLifecycleEvent</code></a>, broadcast when an object is about to be deleted from the database using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService</code></a>'s <code>#remove(…​)</code> method.</p> </div> <div class="paragraph"> <p><code>ObjectRemovingEvent.Default</code> is the implementation that is used by default, but this can be overridden using <a href="../rgant/rgant.html#_rgant_DomainObject_removingLifecycleEvent"><code>@DomainObject#removingLifecycleEvent()</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_lifecycleevent_ObjectUpdatedEvent">3.5.7. <code>ObjectUpdatedEvent</code></h4> <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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatedEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatedEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_AbstractLifecycleEvent"><code>AbstractLifecycleEvent</code></a>, broadcast when an object has just been updated in the database. This is done either explicitly when the current transaction is flushed using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService</code></a>'s <code>#flush(…​)</code> method, else is done implicitly when the transaction commits at the end of the user request.</p> </div> <div class="paragraph"> <p><code>ObjectUpdatedEvent.Default</code> is the implementation that is used by default, but this can be overridden using <a href="../rgant/rgant.html#_rgant_DomainObject_updatedLifecycleEvent"><code>@DomainObject#updatedLifecycleEvent()</code></a>.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_lifecycleevent_ObjectUpdatingEvent">3.5.8. <code>ObjectUpdatingEvent</code></h4> <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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatingEvent.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/rgcms/_rgcms_classes_lifecycleevent_ObjectUpdatingEvent.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>Subclass of <a href="../rgcms/rgcms.html#_rgcms_classes_lifecycleevent_AbstractLifecycleEvent"><code>AbstractLifecycleEvent</code></a>, broadcast when an object is about to be updated in the database. This is done either explicitly when the current transaction is flushed using the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_RepositoryService"><code>RepositoryService</code></a>'s <code>#flush(…​)</code> method, else is done implicitly when the transaction commits at the end of the user request.</p> </div> <div class="paragraph"> <p><code>ObjectUpdatingEvent.Default</code> is the implementation that is used by default, but this can be overridden using <a href="../rgant/rgant.html#_rgant_DomainObject_updatingLifecycleEvent"><code>@DomainObject#updatingLifecycleEvent()</code></a>.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_value-types">3.6. Value Types</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/rgcms/_rgcms_classes_value-types.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/rgcms/_rgcms_classes_value-types.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/rgcms/_rgcms_classes_value-types.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/rgcms/_rgcms_classes_value-types.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/rgcms/_rgcms_classes_value-types.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>Apache Isis can render and persist all of the JDK primitives and wrapper classes, and a number of other JDK (7.x) classes that represent value types.</p> </div> <div class="paragraph"> <p>It also supports some of the <a href="http://www.joda.org/joda-time/">Joda-Time</a> datatypes, and a number of value types that are shipped by the framework itself.</p> </div> <div class="paragraph"> <p>In addition to primitives, the JDK Classes supported are:</p> </div> <div class="ulist"> <ul> <li> <p>the wrapper classes:</p> <div class="ulist"> <ul> <li> <p><code>java.lang.Boolean</code>, <code>java.lang.Character</code>, <code>java.lang.Double</code>, <code>java.lang.Float</code>, <code>java.lang.Long</code>, <code>java.lang.Integer</code>, <code>java.lang.Short</code>, <code>java.lang.Byte</code></p> </li> </ul> </div> </li> <li> <p><code>java.lang.String</code></p> </li> <li> <p>numeric data types:</p> <div class="ulist"> <ul> <li> <p><code>java.math.BigDecimal</code></p> </li> <li> <p><code>java.math.BigInteger</code></p> </li> </ul> </div> </li> <li> <p>date types:</p> <div class="ulist"> <ul> <li> <p><code>java.sql.Date</code></p> </li> <li> <p><code>java.sql.Time</code></p> </li> <li> <p><code>java.sql.Timestamp</code></p> </li> <li> <p><code>java.util.Date</code></p> </li> </ul> </div> </li> </ul> </div> <div class="paragraph"> <p>It supports these Joda-Time classes:</p> </div> <div class="ulist"> <ul> <li> <p><code>org.joda.time.DateTime</code></p> </li> <li> <p><code>org.joda.time.LocalDateTime</code></p> </li> <li> <p><code>org.joda.time.LocalDate</code></p> </li> </ul> </div> <div class="paragraph"> <p>The value types defined by the framework itself (in the applib) are:</p> </div> <div class="ulist"> <ul> <li> <p><code>o.a.i.applib.value.Blob</code></p> <div class="paragraph"> <p>binary large object, eg PDFs or images</p> </div> </li> <li> <p><code>o.a.i.applib.value.Markup</code></p> <div class="paragraph"> <p>Intended for use as a read-only property to display arbitrary HTML.</p> </div> </li> <li> <p><code>o.a.i.applib.value.Clob</code></p> <div class="paragraph"> <p>character large objects, eg XML</p> </div> </li> <li> <p><code>o.a.i.applib.value.Money</code></p> <div class="paragraph"> <p>A currency and amount</p> </div> </li> <li> <p><code>o.a.i.applib.value.Password</code></p> <div class="paragraph"> <p>A simple wrapper around a string, but never shown in plain-text.</p> </div> </li> </ul> </div> <div class="sect3"> <h4 id="_rgcms_classes_value-types_Blob">3.6.1. <code>Blob</code></h4> <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/rgcms/_rgcms_classes_value-types_Blob.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/rgcms/_rgcms_classes_value-types_Blob.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/rgcms/_rgcms_classes_value-types_Blob.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/rgcms/_rgcms_classes_value-types_Blob.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/rgcms/_rgcms_classes_value-types_Blob.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><code>Blob</code> (in the <code>org.apache.isis.applib.value</code> package) is a value type defined by the Apache Isis framework to represent a binary large object. Conceptually you can consider it as a set of bytes (a picture, a video etc), though in fact it wraps three pieces of information:</p> </div> <div class="ulist"> <ul> <li> <p>the set of bytes</p> </li> <li> <p>a name</p> </li> <li> <p>a mime type.</p> </li> </ul> </div> <div class="paragraph"> <p>This is reflected in the class' constructors and properties:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">final</span> <span class="type">class</span> <span class="class">Blob</span> ... { ... public <span class="predefined-type">Blob</span>(<span class="predefined-type">String</span> name, <span class="predefined-type">String</span> primaryType, <span class="predefined-type">String</span> subtype, <span class="type">byte</span><span class="type">[]</span> bytes) { ... } <span class="directive">public</span> <span class="predefined-type">Blob</span>(<span class="predefined-type">String</span> name, <span class="predefined-type">String</span> mimeTypeBase, <span class="type">byte</span><span class="type">[]</span> bytes) { ... } <span class="directive">public</span> <span class="predefined-type">Blob</span>(<span class="predefined-type">String</span> name, MimeType mimeType, <span class="type">byte</span><span class="type">[]</span> bytes) { ... } ... public <span class="predefined-type">String</span> getName() { ... } <span class="directive">public</span> MimeType getMimeType() { ... } <span class="directive">public</span> <span class="type">byte</span><span class="type">[]</span> getBytes() { ... } ... }</code></pre> </div> </div> <div class="paragraph"> <p>Properties of this type can be mapped to JDO/DataNucleus using:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@javax</span>.jdo.annotations.Persistent(defaultFetchGroup=<span class="string"><span class="delimiter">"</span><span class="content">false</span><span class="delimiter">"</span></span>, columns = { <span class="annotation">@javax</span>.jdo.annotations.Column(name = <span class="string"><span class="delimiter">"</span><span class="content">someImage_name</span><span class="delimiter">"</span></span>), <span class="annotation">@javax</span>.jdo.annotations.Column(name = <span class="string"><span class="delimiter">"</span><span class="content">someImage_mimetype</span><span class="delimiter">"</span></span>), <span class="annotation">@javax</span>.jdo.annotations.Column(name = <span class="string"><span class="delimiter">"</span><span class="content">someImage_bytes</span><span class="delimiter">"</span></span>, jdbcType = <span class="string"><span class="delimiter">"</span><span class="content">BLOB</span><span class="delimiter">"</span></span>, sqlType = <span class="string"><span class="delimiter">"</span><span class="content">LONGVARBINARY</span><span class="delimiter">"</span></span>) }) <span class="directive">private</span> <span class="predefined-type">Blob</span> someImage;</code></pre> </div> </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>For character large objects, use <a href="../rgcms/rgcms.html#_rgcms_classes_value-types_Clob]"><code>Clob</code></a> value type.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_value-types_Clob">3.6.2. <code>Clob</code></h4> <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/rgcms/_rgcms_classes_value-types_Clob.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/rgcms/_rgcms_classes_value-types_Clob.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/rgcms/_rgcms_classes_value-types_Clob.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/rgcms/_rgcms_classes_value-types_Clob.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/rgcms/_rgcms_classes_value-types_Clob.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><code>Clob</code> (in the <code>org.apache.isis.applib.value</code> package) is a value type defined by the Apache Isis framework to represent a character large object. Conceptually you can consider it as a set of characters (an RTF or XML document, for example), though in fact it wraps three pieces of information:</p> </div> <div class="ulist"> <ul> <li> <p>the set of characters</p> </li> <li> <p>a name</p> </li> <li> <p>a mime type.</p> </li> </ul> </div> <div class="paragraph"> <p>This is reflected in the class' constructors and properties:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">final</span> <span class="type">class</span> <span class="class">Clob</span> ... { ... public <span class="predefined-type">Clob</span>(<span class="predefined-type">String</span> name, <span class="predefined-type">String</span> primaryType, <span class="predefined-type">String</span> subType, <span class="type">char</span><span class="type">[]</span> chars) { ... } <span class="directive">public</span> <span class="predefined-type">Clob</span>(<span class="predefined-type">String</span> name, <span class="predefined-type">String</span> mimeTypeBase, <span class="type">char</span><span class="type">[]</span> chars) { ... } <span class="directive">public</span> <span class="predefined-type">Clob</span>(<span class="predefined-type">String</span> name, MimeType mimeType, <span class="type">char</span><span class="type">[]</span> chars) { ... } <span class="directive">public</span> <span class="predefined-type">Clob</span>(<span class="predefined-type">String</span> name, <span class="predefined-type">String</span> primaryType, <span class="predefined-type">String</span> subType, <span class="predefined-type">CharSequence</span> chars) { ... } <span class="directive">public</span> <span class="predefined-type">Clob</span>(<span class="predefined-type">String</span> name, <span class="predefined-type">String</span> mimeTypeBase, <span class="predefined-type">CharSequence</span> chars) { ... } <span class="directive">public</span> <span class="predefined-type">Clob</span>(<span class="predefined-type">String</span> name, MimeType mimeType, <span class="predefined-type">CharSequence</span> chars) { ... } ... public <span class="predefined-type">String</span> getName() { ... } <span class="directive">public</span> MimeType getMimeType() { ... } <span class="directive">public</span> <span class="predefined-type">CharSequence</span> getChars() { ... } ... }</code></pre> </div> </div> <div class="paragraph"> <p>Properties of this type can be mapped to JDO/DataNucleus using:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@javax</span>.jdo.annotations.Persistent(defaultFetchGroup=<span class="string"><span class="delimiter">"</span><span class="content">false</span><span class="delimiter">"</span></span>, columns = { <span class="annotation">@javax</span>.jdo.annotations.Column(name = <span class="string"><span class="delimiter">"</span><span class="content">someClob_name</span><span class="delimiter">"</span></span>), <span class="annotation">@javax</span>.jdo.annotations.Column(name = <span class="string"><span class="delimiter">"</span><span class="content">someClob_mimetype</span><span class="delimiter">"</span></span>), <span class="annotation">@javax</span>.jdo.annotations.Column(name = <span class="string"><span class="delimiter">"</span><span class="content">someClob_chars</span><span class="delimiter">"</span></span>, jdbcType = <span class="string"><span class="delimiter">"</span><span class="content">CLOB</span><span class="delimiter">"</span></span>, sqlType = <span class="string"><span class="delimiter">"</span><span class="content">LONGVARCHAR</span><span class="delimiter">"</span></span>) }) <span class="directive">private</span> <span class="predefined-type">Clob</span> someClob;</code></pre> </div> </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>For binary large objects, use <a href="../rgcms/rgcms.html#_rgcms_classes_value-types_Blob]"><code>Blob</code></a> value type.</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_value-types_Markup">3.6.3. <code>Markup</code></h4> <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/rgcms/_rgcms_classes_value-types_Markup.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/rgcms/_rgcms_classes_value-types_Markup.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/rgcms/_rgcms_classes_value-types_Markup.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/rgcms/_rgcms_classes_value-types_Markup.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/rgcms/_rgcms_classes_value-types_Markup.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>Markup</code> value type (introduced in <code>1.15.1</code>) is intended to be used as a read-only property, to render arbitrary markup into the user interface.</p> </div> <div class="paragraph"> <p>For example:</p> </div> <div class="imageblock"> <div class="content"> <a class="image" href="images/value-types/markup.png"><img src="images/value-types/markup.png" alt="markup" width="px"></a> </div> </div> <div class="paragraph"> <p>Corresponds to:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@javax</span>.jdo.annotations.Persistent <span class="annotation">@javax</span>.jdo.annotations.Column(allowsNull = <span class="string"><span class="delimiter">"</span><span class="content">true</span><span class="delimiter">"</span></span>, length = <span class="integer">4000</span>) <span class="annotation">@lombok</span>.Getter <span class="annotation">@lombok</span>.Setter <span class="annotation">@Property</span>(optionality=Optionality.OPTIONAL, editing = Editing.DISABLED) <span class="directive">private</span> Markup someMarkup; <span class="directive">public</span> BlobClobObject updateSomeMarkup(Markup markup) { setSomeMarkup(markup); <span class="keyword">return</span> <span class="local-variable">this</span>; } <span class="directive">public</span> Markup defaultUpdate0SomeMarkup(<span class="predefined-type">String</span> markup) { <span class="keyword">return</span> getSomeMarkup(); }</code></pre> </div> </div> <div class="paragraph"> <p>with this corresponding <code>layout.xml</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;cpt:fieldSet</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">Markup</span><span class="delimiter">"</span></span> <span class="attribute-name">id</span>=<span class="string"><span class="delimiter">"</span><span class="content">markup</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;cpt:action</span> <span class="attribute-name">id</span>=<span class="string"><span class="delimiter">"</span><span class="content">updateSomeMarkup</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;cpt:property</span> <span class="attribute-name">id</span>=<span class="string"><span class="delimiter">"</span><span class="content">someMarkup</span><span class="delimiter">"</span></span> <span class="attribute-name">labelPosition</span>=<span class="string"><span class="delimiter">"</span><span class="content">NONE</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;/cpt:property&gt;</span> <span class="tag">&lt;/cpt:fieldSet&gt;</span></code></pre> </div> </div> <div class="paragraph"> <p>If the property is also editable then an text edit box is also displayed - unlikely to be the desired effect.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_utility">3.7. Applib Utility Classes</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/rgcms/_rgcms_classes_utility.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/rgcms/_rgcms_classes_utility.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/rgcms/_rgcms_classes_utility.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/rgcms/_rgcms_classes_utility.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/rgcms/_rgcms_classes_utility.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>org.apache.isis.applib.util</code> package has a number of simple utility classes designed to simplify the coding of some common tasks.</p> </div> <div class="sect3"> <h4 id="_rgcms_classes_utility_Enums">3.7.1. <code>Enums</code></h4> <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/rgcms/_rgcms_classes_utility_Enums.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/rgcms/_rgcms_classes_utility_Enums.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/rgcms/_rgcms_classes_utility_Enums.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/rgcms/_rgcms_classes_utility_Enums.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/rgcms/_rgcms_classes_utility_Enums.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li> </ul> </div> <div class="admonitionblock note"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> <td class="content"> FIXME </td> </tr> </tbody> </table> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">final</span> <span class="type">class</span> <span class="class">Enums</span> { <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">String</span> getFriendlyNameOf(<span class="predefined-type">Enum</span>&lt;?&gt; anEnum) { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">String</span> getFriendlyNameOf(<span class="predefined-type">String</span> anEnumName) { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">String</span> getEnumNameFromFriendly(<span class="predefined-type">String</span> anEnumFriendlyName) { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">String</span> enumToHttpHeader(<span class="directive">final</span> <span class="predefined-type">Enum</span>&lt;?&gt; anEnum) { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">String</span> enumNameToHttpHeader(<span class="directive">final</span> <span class="predefined-type">String</span> name) { ... } <span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">String</span> enumToCamelCase(<span class="directive">final</span> <span class="predefined-type">Enum</span>&lt;?&gt; anEnum) { ... } }</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_utility_ObjectContracts">3.7.2. <code>ObjectContracts2</code></h4> <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/rgcms/_rgcms_classes_utility_ObjectContracts.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/rgcms/_rgcms_classes_utility_ObjectContracts.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/rgcms/_rgcms_classes_utility_ObjectContracts.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/rgcms/_rgcms_classes_utility_ObjectContracts.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/rgcms/_rgcms_classes_utility_ObjectContracts.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>ObjectContracts2</code> utility class provides a series of methods to make it easy for your domain objects to:</p> </div> <div class="ulist"> <ul> <li> <p>implement <code>Comparable</code> (eg so can be stored in <code>java.util.SortedSet</code>s)</p> </li> <li> <p>implement <code>toString()</code></p> </li> <li> <p>implement <code>equals()</code></p> </li> <li> <p>implement <code>hashCode()</code></p> </li> </ul> </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">ToDoItem</span> <span class="directive">implements</span> <span class="predefined-type">Comparable</span>&lt;ToDoItem&gt; { <span class="directive">public</span> <span class="type">boolean</span> isComplete() { ... } <span class="directive">public</span> LocalDate getDueBy() { ... } <span class="directive">public</span> <span class="predefined-type">String</span> getDescription() { ... } <span class="directive">public</span> <span class="predefined-type">String</span> getOwnedBy() { ... } <span class="directive">public</span> <span class="type">int</span> compareTo(<span class="directive">final</span> ToDoItem other) { <span class="keyword">return</span> ObjectContracts2.compare(<span class="local-variable">this</span>, other, <span class="string"><span class="delimiter">"</span><span class="content">complete</span><span class="delimiter">"</span></span>,<span class="string"><span class="delimiter">"</span><span class="content">dueBy</span><span class="delimiter">"</span></span>,<span class="string"><span class="delimiter">"</span><span class="content">description</span><span class="delimiter">"</span></span>); } <span class="directive">public</span> <span class="predefined-type">String</span> toString() { <span class="keyword">return</span> ObjectContracts2.toString(<span class="local-variable">this</span>, <span class="string"><span class="delimiter">"</span><span class="content">description</span><span class="delimiter">"</span></span>,<span class="string"><span class="delimiter">"</span><span class="content">complete</span><span class="delimiter">"</span></span>,<span class="string"><span class="delimiter">"</span><span class="content">dueBy</span><span class="delimiter">"</span></span>,<span class="string"><span class="delimiter">"</span><span class="content">ownedBy</span><span class="delimiter">"</span></span>); } }</code></pre> </div> </div> <div class="admonitionblock warning"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-warning" title="Warning"></i> </td> <td class="content"> <div class="paragraph"> <p>Note that <code>ObjectContracts2</code> makes heavy use of Java Reflection. While it’s great to get going quickly in prototyping, we recommend you use your IDE to code generate implementations of these methods for production code.</p> </div> <div class="paragraph"> <p>Moreover (and perhaps even more importantly) <code>ObjectContracts</code> implementation can cause DataNucleus to recursively rehydrate a larger number of associated entities (More detail below).</p> </div> <div class="paragraph"> <p>We therefore recommend that you disable persistence-by-reachability by adding:</p> </div> <div class="listingblock"> <div class="title"> persistor_datanucleus.properties </div> <div class="content"> <pre class="CodeRay highlight"><code data-lang="ini">isis.persistor.datanucleus.impl.datanucleus.persistenceByReachabilityAtCommit=false</code></pre> </div> </div> </td> </tr> </tbody> </table> </div> <div class="sect4"> <h5 id="_the_issue_in_more_detail">The issue in more detail</h5> <div class="paragraph"> <p>Consider the <a href="http://yuml.me/edit/742ad446">entities</a>:</p> </div> <div class="imageblock"> <div class="content"> <a class="image" href="images/reference-classes/issue-in-more-detail.png"><img src="images/reference-classes/issue-in-more-detail.png" alt="issue in more detail"></a> </div> </div> <div class="paragraph"> <p>In the course of a transaction, the <code>Agreement</code> entity is loaded into memory (not necessarily modified), and then new <code>AgreementRole</code>s are associated to it.</p> </div> <div class="paragraph"> <p>All these entities implement <code>Comparable</code> using <code>ObjectContracts</code>, so that the implementation of <code>AgreementRole</code>'s (simplified) 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">class</span> <span class="class">AgreementRole</span> { ... public <span class="type">int</span> compareTo(AgreementRole other) { <span class="keyword">return</span> ObjectContracts.compareTo(<span class="local-variable">this</span>, other, <span class="string"><span class="delimiter">"</span><span class="content">agreement</span><span class="delimiter">"</span></span>,<span class="string"><span class="delimiter">"</span><span class="content">startDate</span><span class="delimiter">"</span></span>,<span class="string"><span class="delimiter">"</span><span class="content">party</span><span class="delimiter">"</span></span>); } ... }</code></pre> </div> </div> <div class="paragraph"> <p>while <code>Agreement</code>'s is implemented as:</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">Agreement</span> { ... public <span class="type">int</span> compareTo(Agreement other) { <span class="keyword">return</span> ObjectContracts.compareTo(<span class="local-variable">this</span>, other, <span class="string"><span class="delimiter">"</span><span class="content">reference</span><span class="delimiter">"</span></span>); } ... }</code></pre> </div> </div> <div class="paragraph"> <p>and <code>Party</code>'s is similarly implemented as:</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">Party</span> { ... public <span class="type">int</span> compareTo(Party other) { <span class="keyword">return</span> ObjectContracts.compareTo(<span class="local-variable">this</span>, other, <span class="string"><span class="delimiter">"</span><span class="content">reference</span><span class="delimiter">"</span></span>); } ... }</code></pre> </div> </div> <div class="paragraph"> <p>DataNucleus’s persistence-by-reachability algorithm adds the <code>AgreementRole</code>s into a <code>SortedSet</code>, which causes <code>AgreementRole#compareTo()</code> to fire:</p> </div> <div class="ulist"> <ul> <li> <p>the evaluation of the "agreement" property delegates back to the <code>Agreement</code>, whose own <code>Agreement#compareTo()</code> uses the scalar <code>reference</code> property. As the <code>Agreement</code> is already in-memory, this does not trigger any further database queries</p> </li> <li> <p>the evaluation of the "startDate" property is just a scalar property of the <code>AgreementRole</code>, so will already in-memory</p> </li> <li> <p>the evaluation of the "party" property delegates back to the <code>Party</code>, whose own <code>Party#compareTo()</code> requires the uses the scalar <code>reference</code> property. However, since the <code>Party</code> is not yet in-memory, using the <code>reference</code> property triggers a database query to "rehydrate" the <code>Party</code> instance.</p> </li> </ul> </div> <div class="paragraph"> <p>In other words, figuring out whether <code>AgreementRole</code> is comparable requires the persistence-by-reachability algorithm to run, causing the adjacent associated entity <code>Party</code> to also be retrieved.</p> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_utility_Reasons">3.7.3. <code>Reasons</code></h4> <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/rgcms/_rgcms_classes_utility_Reasons.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/rgcms/_rgcms_classes_utility_Reasons.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/rgcms/_rgcms_classes_utility_Reasons.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/rgcms/_rgcms_classes_utility_Reasons.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/rgcms/_rgcms_classes_utility_Reasons.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>There are two different classes provided to help build reasons returned by <code>disableXxX()</code> and <code>validateXxx()</code> methods:</p> </div> <div class="ulist"> <ul> <li> <p>the <code>org.apache.isis.applib.util.ReasonBuffer</code> helper class</p> </li> <li> <p>the <code>org.apache.isis.applib.util.Reasons</code> helper class</p> </li> </ul> </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> { ... public <span class="predefined-type">String</span> validatePlaceOrder(Product p, <span class="type">int</span> quantity) { <span class="keyword">return</span> Reasons.coalesce( whetherCustomerBlacklisted(<span class="local-variable">this</span>), whetherProductOutOfStock(p) ); } }</code></pre> </div> </div> <div class="paragraph"> <p>Which you use (if any) is up to you.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_utility_TitleBuffer">3.7.4. <code>TitleBuffer</code></h4> <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/rgcms/_rgcms_classes_utility_TitleBuffer.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/rgcms/_rgcms_classes_utility_TitleBuffer.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/rgcms/_rgcms_classes_utility_TitleBuffer.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/rgcms/_rgcms_classes_utility_TitleBuffer.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/rgcms/_rgcms_classes_utility_TitleBuffer.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>TitleBuffer</code> utility class is intended to make it easy to construct title strings (returned from the <a href="../rgcms/rgcms.html#_rgcms_methods_reserved_title"><code>title()</code></a> method).</p> </div> <div class="paragraph"> <p>For example, it has overloaded versions of methods called <code>append()</code> and <code>concat()</code>.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_spec">3.8. Specification pattern</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/rgcms/_rgcms_classes_spec.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/rgcms/_rgcms_classes_spec.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/rgcms/_rgcms_classes_spec.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/rgcms/_rgcms_classes_spec.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/rgcms/_rgcms_classes_spec.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 interfaces and classes listed in this chapter provide support for the <code>Specification</code> pattern, as described in Eric Evans' book <em>Domain Driven Design</em>, p224.</p> </div> <div class="paragraph"> <p>Apache Isis will automatically apply such specifications as validation rules on properties (as per <a href="../rgant/rgant.html#_rgant-Property_mustSatisfy"><code>@Property#mustSatisfy()</code></a>) and on action parameters (as per <a href="../rgant/rgant.html#_rgant-Parameter_mustSatisfy"><code>@Parameter#mustSatisfy()</code></a>).</p> </div> <div class="sect3"> <h4 id="_code_specification_code"><code>Specification</code></h4> <div class="paragraph"> <p>The heart of the support for this pattern is the <code>Specification</code> interface:</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">Specification</span> { <span class="directive">public</span> <span class="predefined-type">String</span> satisfies(<span class="predefined-type">Object</span> obj); <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>if returns <code>null</code>, then the constraint is satisfies; otherwise returns the reason why the constraint has not been satisfied.</td> </tr> </tbody> </table> </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">StartWithCapitalLetterSpecification</span> <span class="directive">implements</span> Specification { <span class="directive">public</span> <span class="predefined-type">String</span> satisfies(<span class="predefined-type">Object</span> proposedObj) { <span class="predefined-type">String</span> proposed = (<span class="predefined-type">String</span>)proposedObj; <i class="conum" data-value="1"></i><b>(1)</b> <span class="keyword">return</span> <span class="string"><span class="delimiter">"</span><span class="delimiter">"</span></span>.equals(proposed) ? <span class="string"><span class="delimiter">"</span><span class="content">Empty string</span><span class="delimiter">"</span></span> : !<span class="predefined-type">Character</span>.isUpperCase(proposed.charAt(<span class="integer">0</span>)) ? <span class="string"><span class="delimiter">"</span><span class="content">Does not start with a capital letter</span><span class="delimiter">"</span></span> : <span class="predefined-constant">null</span>; } } <span class="directive">public</span> <span class="type">class</span> <span class="class">Customer</span> { <span class="annotation">@Property</span>(mustSatisfy=StartWithCapitalLetterSpecification.class) <span class="directive">public</span> <span class="predefined-type">String</span> getFirstName() { ... } ... }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>this ugly cast can be avoided using some of the other classes available; see below.</td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="_code_specification2_code"><code>Specification2</code></h4> <div class="paragraph"> <p>The <code>Specification2</code> interface extends the <code>Specification</code> API to add support for i18n. This is done by defining an additional method that returns a <a href="../rgcms/rgcms.html#_rgcms_classes_i18n_TranslatableString">translatable string</a>:</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">Specification2</span> <span class="directive">extends</span> Specification { <span class="directive">public</span> TranslatableString satisfiesTranslatable(<span class="predefined-type">Object</span> obj); <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>if returns <code>null</code>, then the constraint is satisfies; otherwise returns the reason why the constraint has not been satisfied.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>Note that if implementing <code>Specification2</code> then there is no need to also provide an implementation of the inherited <code>satisfies(Object)</code> method; this will never be called by the framework for <code>Specification2</code> instances.</p> </div> </div> <div class="sect3"> <h4 id="_adapter_classes">Adapter classes</h4> <div class="paragraph"> <p>The <code>AbstractSpecification</code> and <code>AbstractSpecification2</code> adapter classes provide a partial implementation of the respective interfaces, providing type-safety. (Their design is modelled on the <code>TypesafeMatcher</code> class within <a href="http://hamcrest.org/JavaHamcrest/">Hamcrest</a>).</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">StartWithCapitalLetterSpecification</span> <span class="directive">extends</span> AbstractSpecification&lt;<span class="predefined-type">String</span>&gt; { <span class="directive">public</span> <span class="predefined-type">String</span> satisfiesSafely(<span class="predefined-type">String</span> proposed) { <span class="keyword">return</span> <span class="string"><span class="delimiter">"</span><span class="delimiter">"</span></span>.equals(proposed) ? <span class="string"><span class="delimiter">"</span><span class="content">Empty string</span><span class="delimiter">"</span></span> : !<span class="predefined-type">Character</span>.isUpperCase(proposed.charAt(<span class="integer">0</span>)) ? <span class="string"><span class="delimiter">"</span><span class="content">Does not start with a capital letter</span><span class="delimiter">"</span></span> : <span class="predefined-constant">null</span>; } } <span class="directive">public</span> <span class="type">class</span> <span class="class">Customer</span> { <span class="annotation">@Property</span>(mustSatisfy=StartWithCapitalLetterSpecification.class) <span class="directive">public</span> <span class="predefined-type">String</span> getFirstName() { ... } ... }</code></pre> </div> </div> <div class="paragraph"> <p>The <code>AbstractSpecification2</code> class is almost identical; its type-safe method is <code>satisfiesTranslatableSafely(T)</code> instead.</p> </div> </div> <div class="sect3"> <h4 id="_combining_specifications">Combining specifications</h4> <div class="paragraph"> <p>There are also adapter classes that can be inherited from to combine specifications:</p> </div> <div class="ulist"> <ul> <li> <p><code>SpecificationAnd</code> - all provided specifications' constraints must be met</p> </li> <li> <p><code>SpecificationOr</code> - at least one provided specifications' constraints must be met</p> </li> <li> <p><code>SpecificationNot</code> - its constraints are met if-and-only-if the provided specification’s constraint was <em>not</em> met.</p> </li> </ul> </div> <div class="paragraph"> <p>Note that these adapter classes inherit <code>Specification</code> but do not inherit <code>Specification2</code>; in other words they do not support i18n.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_i18n">3.9. i18n support</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/rgcms/_rgcms_classes_i18n.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/rgcms/_rgcms_classes_i18n.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/rgcms/_rgcms_classes_i18n.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/rgcms/_rgcms_classes_i18n.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/rgcms/_rgcms_classes_i18n.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>org.apache.isis.applib.services.i18n</code> package contains a single class to support i18n.</p> </div> <div class="sect3"> <h4 id="_rgcms_classes_i18n_TranslatableString">3.9.1. <code>TranslatableString</code></h4> <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/rgcms/_rgcms_classes_i18n_TranslatableString.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/rgcms/_rgcms_classes_i18n_TranslatableString.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/rgcms/_rgcms_classes_i18n_TranslatableString.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/rgcms/_rgcms_classes_i18n_TranslatableString.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/rgcms/_rgcms_classes_i18n_TranslatableString.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li> </ul> </div> <div class="admonitionblock important"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-important" title="Important"></i> </td> <td class="content"> FIXME - see <a href="../ugbtb/ugbtb.html#_ugbtb_i18n">user guide, i18n</a>. </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The <code>TranslatableString</code> utility class …​</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_contributee">3.10. Contributee</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/rgcms/_rgcms_classes_contributee.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/rgcms/_rgcms_classes_contributee.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/rgcms/_rgcms_classes_contributee.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/rgcms/_rgcms_classes_contributee.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/rgcms/_rgcms_classes_contributee.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 interfaces listed in this chapter act as contributees; they allow domain services to contribute actions/properties/collections to any domain objects that implement these interfaces.</p> </div> <div class="sect3"> <h4 id="_rgcms_classes_contributee_HasTransactionId">3.10.1. <code>HasTransactionId</code></h4> <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/rgcms/_rgcms_classes_contributee_HasTransactionId.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/rgcms/_rgcms_classes_contributee_HasTransactionId.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/rgcms/_rgcms_classes_contributee_HasTransactionId.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/rgcms/_rgcms_classes_contributee_HasTransactionId.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/rgcms/_rgcms_classes_contributee_HasTransactionId.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>HasTransactionId</code> interface is a mix-in for any domain objects that reference a transaction id, such as auditing entries or commands, or for <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_InteractionContext"><code>Interaction</code></a>s persisted as published events.</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>This identifier actually is for the request/interaction in which the object was created, so is actually now mis-named.</p> </div> </td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The interface is defined 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">HasTransactionId</span> { <span class="directive">public</span> <span class="predefined-type">UUID</span> getTransactionId(); <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">public</span> <span class="type">void</span> setTransactionId(<span class="directive">final</span> <span class="predefined-type">UUID</span> transactionId); }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>unique identifier (a GUID) of this request/interaction.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>Modules in the (non-ASF) <a href="http://platform.incode.org" target="_blank" rel="noopener">Incode Platform</a> that either have domain entity that implement and/or services that contribute this interface are:</p> </div> <div class="ulist"> <ul> <li> <p>audit module: <code>AuditEntry</code> entity, <code>AuditingServiceContributions</code> service</p> </li> <li> <p>command module: <code>CommandJdo</code> entity, <code>CommandServiceJdoContributions</code> service</p> </li> <li> <p>publishmq module: <code>PublishedEvent</code> entity</p> </li> </ul> </div> <div class="sect4"> <h5 id="_code_representsinteractionmemberexecution_code"><code>RepresentsInteractionMemberExecution</code></h5> <div class="paragraph"> <p>The <code>RepresentsInteractionMemberExecution</code> interface is a sub-interface of <code>HasTransactionId</code> that also includes a sequence property:</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">RepresentsInteractionMemberExecution</span> <span class="directive">extends</span> HasTransactionId { <span class="type">int</span> getSequence(); }</code></pre> </div> </div> <div class="paragraph"> <p>Here the (inherited) <code>getTransactionId()</code> is intended to be interpreted as an interaction (cf <a href="../../rgcms/rgcms.html#_rgcms_schema-ixn"><code>InteractionDto</code></a>) that has at least one member execution (cf <a href="../rgcms/rgcms.html#__rgcms_schema-ixn_memberExecutionDto"><code>memberExecutionDto</code></a>).</p> </div> <div class="paragraph"> <p>If the interaction (almost certainly an action) calls other actions by way of <a href="../../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a>), then there may be several member executions, each with a unique sequence number, within the same transaction Id.</p> </div> <div class="paragraph"> <p>The purpose of this interface is to allow mixins to be defined, though the framework itself defines none.</p> </div> <div class="paragraph"> <p>Currently the only implementation of this interface is that for <code>PublishedObjects</code> applib interface as defined by the <a href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-spi_PublisherService"><code>PublisherService</code></a>.</p> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_contributee_HasUserName">3.10.2. <code>HasUsername</code></h4> <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/rgcms/_rgcms_classes_contributee_HasUserName.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/rgcms/_rgcms_classes_contributee_HasUserName.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/rgcms/_rgcms_classes_contributee_HasUserName.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/rgcms/_rgcms_classes_contributee_HasUserName.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/rgcms/_rgcms_classes_contributee_HasUserName.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>HasUsername</code> interface is a mix-in for domain objects to be associated with a username. Other services and modules can then contribute actions/collections to render such additional information relating to the activities of the user.</p> </div> <div class="paragraph"> <p>The interface is defined 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">HasUsername</span> { <span class="directive">public</span> <span class="predefined-type">String</span> getUsername(); }</code></pre> </div> </div> <div class="paragraph"> <p>Modules in the (non-ASF) <a href="http://platform.incode.org" target="_blank" rel="noopener">Incode Platform</a> that either have domain entity that implement and/or services that contribute this interface are:</p> </div> <div class="ulist"> <ul> <li> <p>security module: <code>ApplicationUser</code> entity, <code>HasUsernameContributions</code> service</p> </li> <li> <p>audit module: <code>AuditEntry</code> entity</p> </li> <li> <p>command module: <code>CommandJdo</code> entity, <code>HasUsernameContributions</code> service</p> </li> <li> <p>sessionlogger module: <code>SessionLogEntry</code> entity, <code>HasUsernameContributions</code> service</p> </li> <li> <p>settings module: <code>UserSettingJdo</code> entity</p> </li> </ul> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_roles">3.11. Roles</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/rgcms/_rgcms_classes_roles.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/rgcms/_rgcms_classes_roles.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/rgcms/_rgcms_classes_roles.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/rgcms/_rgcms_classes_roles.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/rgcms/_rgcms_classes_roles.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 interfaces listed in this chapter are role interfaces; they define a contract for the framework to interact with those domain objects that implement these interfaces.</p> </div> <div class="sect3"> <h4 id="_rgcms_classes_roles_HoldsUpdatedAt">3.11.1. <code>HoldsUpdatedAt</code></h4> <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/rgcms/_rgcms_classes_roles_HoldsUpdatedAt.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/rgcms/_rgcms_classes_roles_HoldsUpdatedAt.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/rgcms/_rgcms_classes_roles_HoldsUpdatedAt.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/rgcms/_rgcms_classes_roles_HoldsUpdatedAt.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/rgcms/_rgcms_classes_roles_HoldsUpdatedAt.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>HoldsUpdatedAt</code> role interface allows the (framework-provided) <code>TimestampService</code> to update each object with the current timestamp whenever it is modified in a transaction.</p> </div> <div class="paragraph"> <p>The interface is defined as:</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">HoldsUpdatedAt</span> { <span class="type">void</span> setUpdatedAt(java.sql.Timestamp updatedAt); }</code></pre> </div> </div> <div class="paragraph"> <p>The current time is obtained from the <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_ClockService"><code>ClockService</code></a>.</p> </div> <div class="paragraph"> <p>Entities that implement this interface often also implement <a href="../rgcms/rgcms.html#_rgcms_classes_roles_HoldsUpdatedBy"><code>HoldsUpdatedBy</code></a> role interface; as a convenience the <a href="../rgcms/rgcms.html#_rgcms_classes_roles_Timestampable"><code>Timestampable</code></a> interface combines the two roles.</p> </div> <div class="sect4"> <h5 id="_alternative_approaches">Alternative approaches</h5> <div class="paragraph"> <p>An alternative way to maintain a timestamp is to use JDO’s <code>@Version</code> annotation. With this approach, it is the JDO/DataNucleus that maintains the version, rather than the framework’s <code>TimestampService</code>.</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="annotation">@javax</span>.jdo.annotations.Version( strategy=VersionStrategy.DATE_TIME, column=<span class="string"><span class="delimiter">"</span><span class="content">version</span><span class="delimiter">"</span></span>) <span class="directive">public</span> <span class="type">class</span> <span class="class">Customer</span> { ... public java.sql.Timestamp getVersionSequence() { <span class="keyword">return</span> (java.sql.Timestamp) JDOHelper.getVersion(<span class="local-variable">this</span>); } }</code></pre> </div> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_roles_HoldsUpdatedBy">3.11.2. <code>HoldsUpdatedBy</code></h4> <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/rgcms/_rgcms_classes_roles_HoldsUpdatedBy.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/rgcms/_rgcms_classes_roles_HoldsUpdatedBy.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/rgcms/_rgcms_classes_roles_HoldsUpdatedBy.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/rgcms/_rgcms_classes_roles_HoldsUpdatedBy.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/rgcms/_rgcms_classes_roles_HoldsUpdatedBy.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>HoldsUpdatedBy</code> role interface …​</p> </div> <div class="admonitionblock note"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> <td class="content"> FIXME …​ incomplete </td> </tr> </tbody> </table> </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">HoldsUpdatedBy</span> { <span class="type">void</span> setUpdatedBy(<span class="predefined-type">String</span> updatedBy); }</code></pre> </div> </div> <div class="paragraph"> <p>Entities that implement this interface often also implement <a href="../rgcms/rgcms.html#_rgcms_classes_roles_HoldsUpdatedAt"><code>HoldsUpdatedAt</code></a> role interface; as a convenience the <a href="../rgcms/rgcms.html#_rgcms_classes_roles_Timestampable"><code>Timestampable</code></a> interface combines the two roles.</p> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_roles_Timestampable">3.11.3. <code>Timestampable</code></h4> <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/rgcms/_rgcms_classes_roles_Timestampable.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/rgcms/_rgcms_classes_roles_Timestampable.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/rgcms/_rgcms_classes_roles_Timestampable.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/rgcms/_rgcms_classes_roles_Timestampable.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/rgcms/_rgcms_classes_roles_Timestampable.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>Timestampable</code> role interface is a convenience that combines the <a href="../rgcms/rgcms.html#_rgcms_classes_roles_HoldsUpdatedAt"><code>HoldsUpdatedAt</code></a> and <a href="../rgcms/rgcms.html#_rgcms_classes_roles_HoldsUpdatedBy"><code>HoldsUpdatedBy</code></a> interfaces. It is defined as:</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">Timestampable</span> <span class="directive">extends</span> HoldsUpdatedAt, HoldsUpdatedBy { }</code></pre> </div> </div> <div class="paragraph"> <p>The interface no additional methods of its own.</p> </div> <div class="sect4"> <h5 id="_alternatives_4">Alternatives</h5> <div class="paragraph"> <p>An alternative way to maintain a timestamp is to use JDO’s <code>@Version</code> annotation. With this approach, it is the JDO/DataNucleus that maintains the version, rather than the framework’s <code>TimestampService</code>. See <a href="../rgcms/rgcms.html#_rgcms_classes_roles_HoldsUpdatedBy"><code>HoldsUpdatedBy</code></a> for further details.</p> </div> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_mixins">3.12. Mixins</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/rgcms/_rgcms_classes_mixins.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/rgcms/_rgcms_classes_mixins.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/rgcms/_rgcms_classes_mixins.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/rgcms/_rgcms_classes_mixins.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/rgcms/_rgcms_classes_mixins.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>This chapter defines a number of role interfaces that definea contract for some framework-defined mixins.</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>See the <a href="../ugfun/ugfun.html#_ugfun_building-blocks_types-of-domain-objects_mixins">fundamentals user guide</a> for a discussion of mixins.</p> </div> </td> </tr> </tbody> </table> </div> <div class="sect3"> <h4 id="_rgcms_classes_mixins_Object">3.12.1. <code>Object</code></h4> <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/rgcms/_rgcms_classes_mixins_Object.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/rgcms/_rgcms_classes_mixins_Object.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/rgcms/_rgcms_classes_mixins_Object.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/rgcms/_rgcms_classes_mixins_Object.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/rgcms/_rgcms_classes_mixins_Object.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 framework provides a single mixin that contributes to simply <code>java.lang.Object</code>. It provides the ability to download the layout XML for any domain object (in practical terms: entities and view models).</p> </div> <div class="paragraph"> <p>These mixin actions are all associated with the "Metadata" fieldset. A number of other <a href="../rgcms/rgcms.html#_rgcms_classes_mixins_Persistable">mixins</a> also contribute properties or actions to the "Metadata" fieldset.</p> </div> <div class="sect4"> <h5 id="__rgcms_classes_mixins_Object_clearHints"><code>clearHints()</code></h5> <div class="paragraph"> <p>When a domain object is rendered the end-user can select different tabs, and for collections can sort the columns, navigate to second pages, or select different views of collections. If the user revisits that object, the <a href="../ugvw/ugvw.html">Wicket viewer</a> will remember these hints and render the domain object in the same state. These rendering hints are also included if the user copies the URL using the anchor link (to right hand of the object’s title).</p> </div> <div class="paragraph"> <p>The <code>Object_clearHints</code> mixin provides the ability for the end-user to discard these hints so that the object is rendered in its initial state:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> clearHints() { ... }</code></pre> </div> </div> <div class="sect5"> <h6 id="_related_services">Related Services</h6> <div class="paragraph"> <p>This mixin uses the <a href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_HintStore"><code>HintStore</code></a> service to store and retrieve UI hints for each rendered object, per user.</p> </div> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_mixins_Object_downloadLayoutXml"><code>downloadLayoutXml()</code></h5> <div class="paragraph"> <p>The <code>Object_downloadLayoutXml</code> mixin provides an action to download the <a href="../ugvw/ugvw.html#_ugvw_layout_file-based">layout XML</a> for the current domain object. It has the following signature:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">Object</span> downloadLayoutXml( <span class="annotation">@ParameterLayout</span>(named = <span class="string"><span class="delimiter">"</span><span class="content">File name</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="predefined-type">String</span> fileName, <span class="directive">final</span> LayoutService.Style style) { <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>either current, complete, normalized or minimal.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See the documentation on <a href="../ugvw/ugvw.html#_ugvw_layout_file-based">layout XML</a> and also the <a href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_LayoutService"><code>LayoutService</code></a> for more information on these styles</p> </div> <div class="sect5"> <h6 id="_related_services_2">Related Services</h6> <div class="paragraph"> <p>This mixin calls <a href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_LayoutService"><code>LayoutService</code></a> to obtain the layout XML.</p> </div> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_mixins_Object_rebuildMetamodel"><code>rebuildMetamodel()</code></h5> <div class="paragraph"> <p>The <code>Object_rebuildMetamodel</code> mixin provides the ability to discard the current internal metamodel data (an instance of <code>ObjectSpecification</code>) for the domain class of the rendered object, and recreate from code and other sources (most notably, layout XML data). It has the following signature:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> rebuildMetamodel() { ... }</code></pre> </div> </div> <div class="sect5"> <h6 id="_related_services_3">Related Services</h6> <div class="paragraph"> <p>This mixin calls <a href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_MetamodelService"><code>MetaModelService</code></a> and the <a href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_GridService"><code>GridService</code></a> to invalidate their caches.</p> </div> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_mixins_Object_downloadLayoutXml"><code>downloadLayoutXml()</code></h5> <div class="paragraph"> <p>The <code>Object_downloadLayoutXml</code> mixin provides an action to download the <a href="../ugvw/ugvw.html#_ugvw_layout_file-based">layout XML</a> for the current domain object. It has the following signature:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">Object</span> downloadLayoutXml( <span class="annotation">@ParameterLayout</span>(named = <span class="string"><span class="delimiter">"</span><span class="content">File name</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="predefined-type">String</span> fileName, <span class="directive">final</span> LayoutService.Style style) { <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>either current, complete, normalized or minimal.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>See the documentation on <a href="../ugvw/ugvw.html#_ugvw_layout_file-based">layout XML</a> and also the <a href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_LayoutService"><code>LayoutService</code></a> for more information on these styles</p> </div> <div class="sect5"> <h6 id="_related_services_4">Related Services</h6> <div class="paragraph"> <p>This mixin calls <a href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_LayoutService"><code>LayoutService</code></a> to obtain the layout XML.</p> </div> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_mixins_Object_openRestApi"><code>openRestApi()</code></h5> <div class="paragraph"> <p>The <code>Object_openRestApi</code> mixin provides an action to navigate to the URL of the <a href="../ugvro/ugvro.html">Restful Objects resource</a> corresponding to the domain object. It has the following signature:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">URL</span> openRestApi() { ... }</code></pre> </div> </div> <div class="sect5"> <h6 id="_related_services_5">Related Services</h6> <div class="paragraph"> <p>This mixin calls <a href="../rgsvc/rgsvc.html#_rgsvc_integration-api_BookmarkService"><code>BookmarkService</code></a> to build the URL.</p> </div> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_mixins_Dto">3.12.2. <code>Dto</code></h4> <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/rgcms/_rgcms_classes_mixins_Dto.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/rgcms/_rgcms_classes_mixins_Dto.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/rgcms/_rgcms_classes_mixins_Dto.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/rgcms/_rgcms_classes_mixins_Dto.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/rgcms/_rgcms_classes_mixins_Dto.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>Dto</code> role interface is intended to be implemented by JAXB-annotated view models, that is, annotated using <a href="../rgant/rgant.html#_rgant-XmlRootElement"><code>@XmlRootElement</code></a>. It enables the ability to download the XML and XSD schema of those objects using two <a href="../ugfun/ugfun.html#_ugfun_building-blocks_types-of-domain-objects_mixins">mixins</a>, <code>Dto_downloadXml</code> and <code>Dto_downloadXsd</code>.</p> </div> <div class="paragraph"> <p>The interface is just a marker interface (with no members), and is defined as:</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">Dto</span> { }</code></pre> </div> </div> <div class="paragraph"> <p>The <code>Dto_downloadXml</code> mixin defines the following action:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Mixin</span>(method=<span class="string"><span class="delimiter">"</span><span class="content">act</span><span class="delimiter">"</span></span>) <span class="directive">public</span> <span class="type">class</span> <span class="class">Dto_downloadXml</span> { <span class="directive">public</span> Dto_downloadXml(<span class="directive">final</span> Dto dto) { ... } <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">public</span> <span class="predefined-type">Object</span> act(<span class="directive">final</span> <span class="predefined-type">String</span> fileName) { ... } <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>provided as an action to any class that (trivially) implements the <code>Dto</code> interface</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>The action’s name is derived from the class name.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>This will return the XML text wrapped up in a <a href="../rgcms/rgcms.html#_rgcms_classes_value-types_Clob"><code>Clob</code></a>.</p> </div> <div class="paragraph"> <p>The <code>Dto_downloadXsd</code> mixin is similar:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Mixin</span>(method=<span class="string"><span class="delimiter">"</span><span class="content">act</span><span class="delimiter">"</span></span>) <span class="directive">public</span> <span class="type">class</span> <span class="class">Dto_downloadXsd</span> { <span class="directive">public</span> Dto_downloadXsd(<span class="directive">final</span> Dto dto) { ... } <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">public</span> <span class="predefined-type">Object</span> act(<span class="directive">final</span> <span class="predefined-type">String</span> fileName, <span class="directive">final</span> IsisSchemes isisSchemas) { ... } <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>provided as an action to any class that (trivially) implements the <code>Dto</code> interface</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>The action’s name be derived from the class name.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>If the domain object’s JAXB annotations reference only a single XSD schema then this will return that XML text as a <a href="../rgcms/rgcms.html#_rgcms_classes_value-types_Clob"><code>Clob</code></a> of that XSD. If there are multiple XSD schemas referenced then the action will return a zip of those schemas, wrapped up in a <a href="../rgcms/rgcms.html#_rgcms_classes_value-types_Blob"><code>Blob</code></a>. The <code>IsisSchemas</code> parameter to the action can be used to optionally ignore the common <a href="../rgcms/rgcms.html#_rgcms_schema">Apache Isis schemas</a> (useful if there is only one other XSD schema referenced by the DTO).</p> </div> <div class="sect4"> <h5 id="_related_services_6">Related Services</h5> <div class="paragraph"> <p>The <code>Dto_downloadXml</code> and <code>Dto_downloadXsd</code> delegate to the <a href="../rgsvc/rgsvc.html#_rgsvc_integration-api_JaxbService"><code>JaxbService</code></a> to actually generate the XML/XSD.</p> </div> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_mixins_Persistable">3.12.3. <code>Persistable</code></h4> <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/rgcms/_rgcms_classes_mixins_Persistable.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/rgcms/_rgcms_classes_mixins_Persistable.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/rgcms/_rgcms_classes_mixins_Persistable.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/rgcms/_rgcms_classes_mixins_Persistable.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/rgcms/_rgcms_classes_mixins_Persistable.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>All domain entities automatically implement the DataNucleus <code>Persistable</code> role interface as a result of the enhancer process (the fully qualified class name is <code>org.datanucleus.enhancement.Persistable</code>). So as a developer you do not need to write any code to obtain the mixins that contribute to this interface.</p> </div> <div class="paragraph"> <p>These mixin properties/actions are all associated with the "Metadata" fieldset. A number of other <a href="../rgcms/rgcms.html#_rgcms_classes_mixins_Object">mixins</a> also contribute properties or actions to the "Metadata" fieldset.</p> </div> <div class="sect4"> <h5 id="__rgcms_classes_mixins_Persistable_downloadJdoMetadata"><code>downloadJdoMetadata()</code></h5> <div class="paragraph"> <p>The <code>Persistable_downloadJdoMetadata</code> mixin provides an action which allows the JDO <a href="http://www.datanucleus.org/products/datanucleus/jdo/metadata_xml.html">class metadata</a> to be downloaded as XML. It has the following signature:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="predefined-type">Clob</span> downloadJdoMetadata( <i class="conum" data-value="1"></i><b>(1)</b> <span class="annotation">@ParameterLayout</span>(named = <span class="string"><span class="delimiter">"</span><span class="content">.jdo file name</span><span class="delimiter">"</span></span>) <span class="directive">final</span> <span class="predefined-type">String</span> fileName) { ... }</code></pre> </div> </div> <div class="colist arabic"> <table> <tbody> <tr> <td><i class="conum" data-value="1"></i><b>1</b></td> <td>returns the XML text wrapped up in a <a href="../rgcms/rgcms.html#_rgcms_classes_value-types_Clob"><code>Clob</code></a>.</td> </tr> </tbody> </table> </div> <div class="sect5"> <h6 id="_related_services_7">Related Services</h6> <div class="paragraph"> <p>The mixin delegates to the <a href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-api_IsisJdoSupport"><code>IsisJdoSupport</code></a> service to obtain a reference to the JDO <code>PersistenceManagerFactory</code>.</p> </div> </div> </div> <div class="sect4"> <h5 id="__rgcms_classes_mixins_Persistable_datanucleusXxx"><code>datanucleusXxx</code></h5> <div class="paragraph"> <p>The framework provides a number of mixins that expose the datanucleus Id and version of a persistable domain entity. Several implementations are provided to support different datatypes:</p> </div> <div class="ulist"> <ul> <li> <p><code>Persistable_datanucleusIdLong</code> will expose the entity’s id, assuming that the id is or can be cast to <code>java.lang.Long</code>. Otherwise the property will be hidden.</p> </li> <li> <p><code>Persistable_datanucleusVersionTimestamp</code> will expose the entity’s version, assuming that the version is or can be cast to <code>java.sql.Timestamp</code>. Otherwise the property will be hidden.</p> </li> <li> <p><code>Persistable_datanucleusVersionLong</code> will expose the entity’s version, assuming that the version is or can be cast to <code>java.lang.Long</code>. Otherwise the property will be hidden.</p> </li> </ul> </div> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_layout">3.13. (Object) Layout</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/rgcms/_rgcms_classes_layout.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/rgcms/_rgcms_classes_layout.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/rgcms/_rgcms_classes_layout.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/rgcms/_rgcms_classes_layout.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/rgcms/_rgcms_classes_layout.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>org.apache.isis.applib.layout.grid</code> and <code>org.apache.isis.applib.layout.component</code> packages together define a number of classes that allow the layout of domain objects (entities and view models) to be customized. These classes fall into two main categories:</p> </div> <div class="ulist"> <ul> <li> <p>grid classes, that define a grid structure of rows, columns, tab groups and tabs, and;</p> </li> <li> <p>common component classes, that capture the layout metadata for an object’s properties, collections and actions. These are bound (or associated) to the regions of the grid</p> </li> </ul> </div> <div class="paragraph"> <p>The framework provides an implementation of the grid classes modelled closely on <a href="http://getbootstrap.com">Bootstrap 3</a>, along with <a href="../ugvw/ugvw.html">Wicket viewer</a> components capable of rendering that grid system. In principle it is also possible to extend the layout architecture for other grid systems. The component classes, though, are intended to be reusable across all grid systems.</p> </div> <div class="paragraph"> <p>The component classes, meanwhile, are broadly equivalent to the "layout" annotations (<a href="../rgant/rgant.html#_rgant-PropertyLayout"><code>@PropertyLayout</code></a>, <a href="../rgant/rgant.html#_rgant-CollectionLayout"><code>@CollectionLayout</code></a>, <a href="../rgant/rgant.html#_rgant-ActionLayout"><code>@ActionLayout</code></a> and <a href="../rgant/rgant.html#_rgant-DomainObjectLayout"><code>@DomainObjectLayout</code></a></p> </div> <div class="paragraph"> <p>All of the classes in this package are JAXB-annotated, meaning that they can be serialized to/from XML (the <code>component</code> classes in the <code><a href="http://isis.apache.org/applib/layout/component" class="bare">http://isis.apache.org/applib/layout/component</a></code> XSD namespace, the bootstrap 3 grid classes in the <code><a href="http://isis.apache.org/applib/layout/grid/bootstrap3" class="bare">http://isis.apache.org/applib/layout/grid/bootstrap3</a></code> XSD namespace). This ability to serialize to/from XML is used by the <a href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_GridLoaderService"><code>GridLoaderService</code></a>, the default implementation of which reads the grid layout for a domain class from a <code>.layout.xml</code> file on the classpath. It also allows the grid to be exposed through the REST API provided by the <a href="../ugvro/ugvro.html">Restful Objects viewer</a>, as either XML or JSON.</p> </div> <div class="paragraph"> <p>The various components (properties, collections, actions and domain object) also allow a link to be associated with each. These links are populated by the framework automatically when exposing the object layout grid through the REST API, pointing back to the standard Restful Objects resources. This design greatly assists in the implementation of generic REST clients.</p> </div> <div class="sect3"> <h4 id="__rgcms_classes_layout_component">3.13.1. Component</h4> <div class="paragraph"> <p>The component classes reside in the <code>org.apache.isis.applib.layout.component</code> package, and consist of:</p> </div> <div class="ulist"> <ul> <li> <p><code>FieldSet</code><br></p> <div class="paragraph"> <p>A fieldset (sometimes also called a property group or member group) of a number of the domain object’s properties (along with any associationed actions of those properties).</p> </div> </li> <li> <p>layout data classes, which correspond to the similarly named annotations:</p> <div class="ulist"> <ul> <li> <p><code>PropertyLayoutData</code>, corresponding to the <a href="../rgant/rgant.html#_rgant-PropertyLayout"><code>@PropertyLayout</code></a> annotation;</p> </li> <li> <p><code>CollectionLayoutData</code>, corresponding to the <a href="../rgant/rgant.html#_rgant-CollectionLayout"><code>@CollectionLayout</code></a> annotation;</p> </li> <li> <p><code>ActionLayoutData</code>, corresponding to the <a href="../rgant/rgant.html#_rgant-ActionLayout"><code>@ActionLayout</code></a> annotation;</p> </li> <li> <p><code>DomainObjectLayoutData</code>, corresponding to the <a href="../rgant/rgant.html#_rgant-DomainObjectLayout"><code>@DomainObjectLayout</code></a> annotation.</p> </li> </ul> </div> </li> </ul> </div> <div class="paragraph"> <p>In addition, the component package includes <code>Grid</code>, representing the top level container for a custom layout for a domain object. <code>Grid</code> itself is merely an interface, but it also defines the visitor pattern to make it easy for validate and normalize the grid layouts. The <code>GridAbstract</code> convenience superclass provides a partial implementation of this visitor pattern.</p> </div> <div class="paragraph"> <p>The XSD for these classes is available at <a href="http://isis.apache.org/applib/layout/component/component.xsd" class="bare">http://isis.apache.org/applib/layout/component/component.xsd</a>.</p> </div> </div> <div class="sect3"> <h4 id="__rgcms_classes_layout_grid-bootstrap3">3.13.2. Bootstrap3 Grid</h4> <div class="paragraph"> <p>The bootstrap3 grid classes are modelled closely on <a href="http://getbootstrap.com">Bootstrap 3</a>. Bootstrap’s <a href="http://getbootstrap.com/css/#grid">grid system</a> divides the page width equally into 12 columns, and so each column spans 1 or more of these widths. Thus, a column with a span of 12 is the full width, one with a span of 6 is half the width, one with a span of 4 is a third of the width, and so on.</p> </div> <div class="paragraph"> <p>When specifying the span of a column, Bootstrap also allows a size to be specified (<code>XS</code>, <code>SM</code>, <code>MD</code>, <code>LG</code>). The size determines the rules for responsive design. Apache Isis defaults to <code>MD</code> but this can be overridden. It is also possible to specify multiple size/spans for a given column.</p> </div> <div class="paragraph"> <p>The grid classes provided by Apache Isis reside in the <code>org.apache.isis.applib.layout.grid.bootstrap3</code> package, and consist of:</p> </div> <div class="ulist"> <ul> <li> <p><code>BS3Grid</code><br></p> <div class="paragraph"> <p>Consists of a number of <code>BS3Row</code>s.</p> </div> <div class="paragraph"> <p>This class is the concrete implementation of <code>Grid</code> interface, discussed previously. As such, it extends the <code>Grid.Visitor</code> to iterate over all of the <code>Row</code>s of the grid.</p> </div> </li> <li> <p><code>BS3Row</code><br></p> <div class="paragraph"> <p>A container of <code>BS3Col</code>s. This element is rendered as <code>&lt;div class="row"&gt;</code>.</p> </div> </li> <li> <p><code>BS3Col</code><br></p> <div class="paragraph"> <p>A container of almost everything else. A column most commonly contains properties (grouped into <code>FieldSet</code>s, described above) or collections (specified by <code>CollectionLayoutData</code>, also above). However, a <code>Col</code> might instead contain a <code>BS3TabGroup</code> (described below) in order that the object members is arranged into tabs.</p> </div> <div class="paragraph"> <p>It is also possible for a <code>Col</code> to contain the object’s title/icon (using <code>DomainObjectLayoutData</code>) or indeed arbitrary actions (using <code>`ActionLayoutData</code>).</p> </div> <div class="paragraph"> <p>Finally, a <code>BS3Col</code> can also contain other <code>BS3Row</code>s, allowing arbitrarily deep hierarchies of containers as required.</p> </div> <div class="paragraph"> <p>This element is rendered as, for example, <code>&lt;div class="col-md-4"&gt;</code> (for a size <code>MD</code>, span of 4).</p> </div> </li> <li> <p><code>BS3TabGroup</code><br></p> <div class="paragraph"> <p>A container of <code>BS3Tab</code>s.</p> </div> </li> <li> <p><code>BS3Tab</code><br></p> <div class="paragraph"> <p>A container of <code>BS3Row</code>s, which will in turn contain <code>BS3Col</code>s and thence ultimately the object’s members.</p> </div> </li> </ul> </div> <div class="paragraph"> <p>There are also two close cousins of <code>Col</code>, namely <code>ClearFixVisible</code> and <code>ClearFixHidden</code>. These map to Bootstrap’s <a href="http://getbootstrap.com/css/#responsive-utilities">responsive utility class</a>es, and provide greater control for responsive designs.</p> </div> <div class="paragraph"> <p>As you can probably guess, the <code>BS3Grid</code> is the top-level object (that is, it is JAXB <code>@XmlRootElement</code>); this is the object that is serialized to/from XML.</p> </div> <div class="paragraph"> <p>All of these classes also allow custom CSS to be specified; these are added to the CSS classes for the corresponding <code>&lt;div</code>&gt; in the rendered page. The <a href="../ugvw/ugvw.html#_ugvw_customisation_tweaking-css-classes"><code>application.css</code></a> file can then be used for application-specific CSS, allowing arbitrary fine-tuning of the layout of the page.</p> </div> <div class="paragraph"> <p>The XSD for these classes is available at <a href="http://isis.apache.org/applib/layout/menubars/bootstrap3/menubars.xsd" class="bare">http://isis.apache.org/applib/layout/menubars/bootstrap3/menubars.xsd</a>.</p> </div> </div> <div class="sect3"> <h4 id="__rgcms_classes_layout_link">3.13.3. Link</h4> <div class="paragraph"> <p>The link classes reside in the <code>org.apache.isis.applib.layout.links</code> package, and consist of just the <code>Link</code> class:</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">Link</span> { <span class="directive">public</span> <span class="predefined-type">String</span> getRel() { ... } <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">public</span> <span class="predefined-type">String</span> getMethod() { ... } <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">public</span> <span class="predefined-type">String</span> getHref() { ... } <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">public</span> <span class="predefined-type">String</span> getType() { ... } <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>a "rel" (as defined by section 2.7.1.2 of the RO spec v1.0), identifying the nature of the link.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the HTTP method to access the link. This is always "GET".</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>The (absolute) URL to access the Restful Objects resource.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>The media type (<code>Accept</code> header) that will be returned by the URL.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The XSD for these classes is available at <a href="http://isis.apache.org/applib/layout/links/links.xsd" class="bare">http://isis.apache.org/applib/layout/links/links.xsd</a>.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_classes_menubars">3.14. MenuBars Layout</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/rgcms/_rgcms_classes_menubars.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/rgcms/_rgcms_classes_menubars.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/rgcms/_rgcms_classes_menubars.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/rgcms/_rgcms_classes_menubars.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/rgcms/_rgcms_classes_menubars.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>org.apache.isis.applib.layout.menubars</code> package and subpackages define a number of interfaces classes that allow the layout of domain service actions to be organised across menu bars, menus and menu sections.</p> </div> <div class="paragraph"> <p>The classes define a hierarchical structure of menu bars, menus and menu sections. Similar to the <a href="#_rgcms_classes_layout">object layout</a> classes, the concrete menu classes support bootstrap3; support for other layout systems is possible.</p> </div> <div class="paragraph"> <p>The component class <code>ServiceActionLayoutData</code> defines action metadata, being broadly equivalent to the "layout" annotations for actions, ie <a href="../rgant/rgant.html#_rgant-ActionLayout"><code>@ActionLayout</code></a>. This is similar to the <code>ActionLayoutData</code> component class used for object layouts, but also captures the identity of the "owning" domain service. Service actions are grouped into menu sections.</p> </div> <div class="paragraph"> <p>All of the classes in this package are JAXB-annotated, meaning that they can be serialized to/from XML (in the <code><a href="http://isis.apache.org/applib/layout/menubars/bootstrap3" class="bare">http://isis.apache.org/applib/layout/menubars/bootstrap3</a></code> XSD namespace). This ability to serialize to/from XML is used by the <a href="../rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_MenuBarsLoaderService"><code>MenuBarsLoaderService</code></a>, the default implementation of which reads the grid layout for a domain class from a <code>.layout.xml</code> file on the classpath. It also allows the menu bars to be exposed through the REST API provided by the <a href="../ugvro/ugvro.html">Restful Objects viewer</a>, as either XML or JSON.</p> </div> <div class="paragraph"> <p>The service action component also allows a link to be associated with it. Each such link is populated by the framework automatically when exposing the menu bars layout through the REST API, pointing back to the standard Restful Objects resources. This design greatly assists in the implementation of generic REST clients.</p> </div> <div class="sect3"> <h4 id="_rgcms_classes_menubars_menus">3.14.1. Menus</h4> <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/rgcms/_rgcms_classes_menubars_menus.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/rgcms/_rgcms_classes_menubars_menus.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/rgcms/_rgcms_classes_menubars_menus.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/rgcms/_rgcms_classes_menubars_menus.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/rgcms/_rgcms_classes_menubars_menus.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 menu classes reside in the <code>org.apache.isis.applib.layout.menubars.bootstrap3</code> package, consisting of:</p> </div> <div class="ulist"> <ul> <li> <p><code>BS3MenuBars</code></p> <div class="paragraph"> <p>The top-level structure that define three fields: a primary <code>BS3MenuBar</code>, secondary <code>BS3MenuBar</code> and tertiary <code>BS3MenuBar</code>. The <a href="../ugvw/ugvw.html">Wicket viewer</a> places the primary bar to the left, the secondary bar aligned right, and the tertiary bar (expected to consist of just one <code>BS3Menu</code>) under the user names.</p> </div> </li> <li> <p><code>BS3MenuBar</code></p> <div class="paragraph"> <p>consisting of one or many <code>BS3Menu</code>s.</p> </div> </li> <li> <p><code>BS3Menu</code></p> <div class="paragraph"> <p>consisting of one or many <code>BS3MenuSection</code>s. The <a href="../ugvw/ugvw.html">Wicket viewer</a> renders a separator between each section.</p> </div> </li> <li> <p><code>BS3MenuSection</code></p> <div class="paragraph"> <p>consisting of one or many actions (<code>ServiceActionLayoutData</code>s)</p> </div> </li> </ul> </div> </div> <div class="sect3"> <h4 id="_rgcms_classes_menubars_components">3.14.2. Components</h4> <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/rgcms/_rgcms_classes_menubars_components.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/rgcms/_rgcms_classes_menubars_components.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/rgcms/_rgcms_classes_menubars_components.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/rgcms/_rgcms_classes_menubars_components.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/rgcms/_rgcms_classes_menubars_components.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 service action class reside in the <code>org.apache.isis.applib.layout.component</code> package, consisting of just:</p> </div> <div class="ulist"> <ul> <li> <p><code>ServiceActionLayoutData</code> class</p> <div class="paragraph"> <p>which correspond to the <a href="../rgant/rgant.html#_rgant-ActionLayout"><code>@ActionLayout</code></a> annotation.</p> </div> </li> </ul> </div> <div class="paragraph"> <p>This is similar to <code>ActionLayoutData</code> (of the <a href="#_rgcms_classes_layout">object layout</a> classes), however it also identifies the domain service to which it belongs. (This isn’t required for the object layouts because the owner in that case is implicit).</p> </div> </div> <div class="sect3"> <h4 id="__rgcms_classes_layout_link">3.14.3. Link</h4> <div class="paragraph"> <p>The link classes reside in the <code>org.apache.isis.applib.layout.links</code> package, and consist of just the <code>Link</code> class:</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">Link</span> { <span class="directive">public</span> <span class="predefined-type">String</span> getRel() { ... } <i class="conum" data-value="1"></i><b>(1)</b> <span class="directive">public</span> <span class="predefined-type">String</span> getMethod() { ... } <i class="conum" data-value="2"></i><b>(2)</b> <span class="directive">public</span> <span class="predefined-type">String</span> getHref() { ... } <i class="conum" data-value="3"></i><b>(3)</b> <span class="directive">public</span> <span class="predefined-type">String</span> getType() { ... } <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>an "rel" (as defined by section 2.7.1.2 of the RO spec v1.0), identifying the nature of the link.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the HTTP method to access the link. This is always "GET".</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>The (absolute) URL to access the Restful Objects resource.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>The media type (<code>Accept</code> header) that will be returned by the URL.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The XSD for these classes is available at <a href="http://isis.apache.org/applib/layout/links/links.xsd" class="bare">http://isis.apache.org/applib/layout/links/links.xsd</a>.</p> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_rgcms_schema">4. Schema</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/rgcms/_rgcms_schema.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/rgcms/_rgcms_schema.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/rgcms/_rgcms_schema.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/rgcms/_rgcms_schema.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/rgcms/_rgcms_schema.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>Most applications need to integrate with other apps in the enterprise. To facilitate such integration scenarios, Apache Isis defines a number of standard XSD schemas:</p> </div> <div class="ulist"> <ul> <li> <p>the <a href="../rgcms/rgcms.html#_rgcms_schema-mml">metamodel</a> schema, which allows the internal metamodel to be exported in a canonical fashion</p> </li> <li> <p>the <a href="../rgcms/rgcms.html#_rgcms_schema-cmd">command</a> schema, which captures the <em>intention</em> of a user to invoke an action or edit a property</p> </li> <li> <p>the <a href="../rgcms/rgcms.html#_rgcms_schema-ixn">interaction execution</a> schema, which captures the actual execution of an action invocation/property edit</p> </li> <li> <p>the <a href="../rgcms/rgcms.html#_rgcms_schema-chg">changes</a> schema, which captures which objects have been created, updated or deleted as the result of an execution of an action invocation/property edit</p> </li> <li> <p>the <a href="../rgcms/rgcms.html#_rgcms_schema-aim">action memento invocation</a> schema (deprecated in <code>1.13.0</code>, replaced by either "cmd" or "ixn"), which allows action invocations to be captured and reified.</p> </li> </ul> </div> <div class="paragraph"> <p>These each use XSD types defined by the <a href="../rgcms/rgcms.html#_rgcms_schema-common">common schema</a> (most notably the <code>oidDto</code> complex type which identifies a domain object).</p> </div> <div class="paragraph"> <p>The (non-ASF) <a href="http://platform.incode.org" target="_blank" rel="noopener">Incode Platform</a>'s command and publishmq modules use these schemas to reify corresponding applib objects (<code>Command</code>, <code>Interaction.Execution</code> and <code>PublishedObjects</code>), either to persist or publishing using an <a href="http://activemq.apache.org">Apache ActiveMQ</a> message queue.</p> </div> <div class="paragraph"> <p>The sections below discuss these schemas in more detail.</p> </div> <div class="sect2"> <h3 id="_rgcms_schema-mml">4.1. MetaModel</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/rgcms/_rgcms_schema-mml.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/rgcms/_rgcms_schema-mml.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/rgcms/_rgcms_schema-mml.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/rgcms/_rgcms_schema-mml.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/rgcms/_rgcms_schema-mml.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 metamodel ("mml") schema defines the serialized form of the metamodel, used by the framework to render and interact with the application’s domain objects.</p> </div> <div class="paragraph"> <p>The top-level metamodel consists of a set of domain classes, which in turn contain members (actions, properties and collections). Actions also have action parameters. All of the elements of the metamodel (domain classes, domain class members and action parameters) can have multiple facets associated with them. Some facets relate to presentational aspects (for example the name), others to the domain layer (for example the presence of a <code>validateXxx()</code> method to enforce business rules).</p> </div> <div class="sect3"> <h4 id="__rgcms_schema-mml_metamodelDto">4.1.1. <code>metamodelDto</code></h4> <div class="paragraph"> <p>The <code>metamodelDto</code> root element is defined as:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/metamodel</span><span class="delimiter">"</span></span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="attribute-name">elementFormDefault</span>=<span class="string"><span class="delimiter">"</span><span class="content">qualified</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/metamodel</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:xs</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://www.w3.org/2001/XMLSchema</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">metamodelDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence</span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">ref</span>=<span class="string"><span class="delimiter">"</span><span class="content">domainClassDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>the metamodel schema has a namespace URI of "http://isis.apache.org/schema/mml". Although URIs are not the same as URLs, you will find that the schemas are also downloadable from this location.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>definition of the <code>metamodelDto</code> root element. The corresponding XML will use this as its top-level element.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>consists of a list of <code>domainClassDto</code>, defined below.</td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-mml_domainClassDto">4.1.2. <code>domainClassDto</code></h4> <div class="paragraph"> <p>The <code>domainClassDto</code> element describes the behaviour and structure of a single domain class within the metamodel.</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/mml</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">domainClassDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">facetHolder</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">majorVersion</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">default</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">minorVersion</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">default</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">properties</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">prop</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">property</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">collections</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">coll</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">collection</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">actions</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">act</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">action</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">id</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:ID</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="7"></i><b>(7)</b> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">service</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:boolean</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="8"></i><b>(8)</b> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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><code>domainClassDto</code> is defined as an element so that if necessary each domain class can be serialized to XML independently (rather than only within an outer <code>metamodelDto</code>.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>extends from <code>facetHolder</code> type, defined below. <div class="paragraph"> <p>This allows a map of facets to be associated with the domain class.</p> </div></td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>each instance of this schema indicates the version of the schema it is compatible with (following semantic versioning)</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>the collection of properties (if any) of this domain class. <div class="paragraph"> <p>This will include any mixin properties.</p> </div></td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>the collection of collections (if any) of this domain class. <div class="paragraph"> <p>This will include any mixin collections.</p> </div></td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>the collection of actions (if any) of this domain class. <div class="paragraph"> <p>This will include any mixin actions.</p> </div></td> </tr> <tr> <td><i class="conum" data-value="7"></i><b>7</b></td> <td>The fully qualified class name of the underlying Java class. <div class="paragraph"> <p>This is declared as 'xs:ID' so can be referenced elsewhere (using 'xs:IDREF').</p> </div></td> </tr> <tr> <td><i class="conum" data-value="8"></i><b>8</b></td> <td>Whether this is domain type is a domain service</td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-mml_member">4.1.3. <code>member</code></h4> <div class="paragraph"> <p>The <code>member</code> (abstract) complex type is the supertype for properties, collections and actions.</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/mml</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">member</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">facetHolder</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">id</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>Inherits from <code>facetHolder</code>, allowing a set of facets to be associated with the member.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>The id of the member, which should be unique within the domain class. <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>This assumes no overloading of method names.</p> </div> </td> </tr> </tbody> </table> </div></td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-mml_property">4.1.4. <code>property</code></h4> <div class="paragraph"> <p>The <code>property</code> complex type represent a scalar association returning a single value (eg <code>getFirstName()</code>).</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/mml</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">property</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">member</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">type</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:IDREF</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>Extends from <code>member</code> complex type, defined above. Every property therefore has an id (unique within the domain class), and a set of facets.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>A (reference to ) the type of this property, eg a String or a Customer. <div class="paragraph"> <p>This will be the value of the <code>id</code> of some other <code>domainClassDto</code>.</p> </div></td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-mml_collection">4.1.5. <code>collection</code></h4> <div class="paragraph"> <p>Like <code>property</code> (above), the <code>collection</code> complex types represent an association, but this time one that is a vector, in other words returning multiple instances (eg <code>getOrders()</code>).</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/mml</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">collection</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">member</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">type</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:IDREF</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>Extends from <code>member</code> complex type, defined above. Every collection therefore has an id (unique within the domain class), and a set of facets.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>A (reference to ) the <em>element</em> type of this collection, eg a Customer. <div class="paragraph"> <p>This will be the value of the <code>id</code> of some other <code>domainClassDto</code>.</p> </div></td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-mml_action">4.1.6. <code>action</code></h4> <div class="paragraph"> <p>The <code>action</code> complex type represents a behaviour of the domain object.</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/mml</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">action</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">member</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">returnType</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:IDREF</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">params</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">param</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">param</span><span class="delimiter">"</span></span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>Extends from <code>member</code> complex type, defined above. Every action therefore has an id (unique within the domain class), and a set of facets.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>(A reference to) the return type of this action, eg a String or a Customer.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>Each action has a collection of parameters (possibly none).</td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-mml_action-parameters">4.1.7. Action parameters</h4> <div class="paragraph"> <p>The <code>param</code> (abstract) complex type represents a parameter of an <code>action</code>. The concrete implementations are either <code>scalarParam</code> or <code>vectorParam</code>.</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/mml</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">param</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">facetHolder</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">type</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:IDREF</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">id</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">scalarParam</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">param</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">vectorParam</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">param</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>defines the <code>param</code> (abstract) complex type</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>inherits from <code>facetHolder</code>, allowing a set of facets to be associated with the action parameter.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>A (reference to) the type of this action parameter, eg a String or a Customer. <div class="paragraph"> <p>For vector parameters, this is the <em>element</em> type of the collection parameter.</p> </div></td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>The id of the parameter, which should be unique within the action.</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>defines the <code>scalarParam</code> (concrete) complex type</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>defines the <code>vectorParam</code> (concrete) complex type</td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-mml_action-facetholder-and-facet">4.1.8. <code>facetHolder</code> and <code>facet</code></h4> <div class="paragraph"> <p>The <code>facetHolder</code> (abstract) complex type defines a collection of <code>facet</code>s, where a <code>facet</code> is in effect just a type and an implementation. In most cases the type has a particular purpose, for example representing the means to obtain the icon of a domain class, or the name of a parameter.</p> </div> <div class="paragraph"> <p>Each <code>facet</code> can also have bag of associated attributes (each attribute is just a tuple of key/value pairs). The meaning of the attributes depends on the facet implementation.</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/mml</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">facetHolder</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">facets</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">facet</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">facet</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">facet</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">attr</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">facetAttr</span><span class="delimiter">"</span></span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">id</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">fqcn</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">facetAttr</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="7"></i><b>(7)</b> <span class="tag">&lt;xs:simpleContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">name</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="8"></i><b>(8)</b> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:simpleContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>defines the <code>facetHolder</code> (abstract) complex type</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>... which contains a set of <code>facet</code>s</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>defines the <code>facet</code> complex type</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>... which contains a set of <code>facetAttr</code>s. <div class="paragraph"> <p>The meaning of the attributes depends on the implementation of the facet.</p> </div></td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>the identifier of the <em>type</em> of the facet, well-known by the framework as representing a certain semantic (eg icon name or name of an action parameter)</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>the fully qualified class name of the implementation of the facet</td> </tr> <tr> <td><i class="conum" data-value="7"></i><b>7</b></td> <td>defines the <code>facetAttr</code> complex type</td> </tr> <tr> <td><i class="conum" data-value="8"></i><b>8</b></td> <td>the name of the attribute, unique across all facet attributes of a facet. <div class="paragraph"> <p>Note this complexType extends from <code>xs:string,</code> which defines the attribute’s corresponding value.</p> </div></td> </tr> </tbody> </table> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_schema-cmd">4.2. Command</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/rgcms/_rgcms_schema-cmd.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/rgcms/_rgcms_schema-cmd.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/rgcms/_rgcms_schema-cmd.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/rgcms/_rgcms_schema-cmd.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/rgcms/_rgcms_schema-cmd.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 command ("cmd") schema defines the serialized form of the <em>intention</em> to invoke an action or to edit a property. It can be supplemented with optional timings capturing the actual invocation of a command (introduced to support the replication of commands in a master/slave arrangement).</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>Mixin actions are represented as regular actions on the mixed-in object. In other words, the fact that the actual implementation of the action is defined by a mixin is an implementation detail only.</p> </div> </td> </tr> </tbody> </table> </div> <div class="sect3"> <h4 id="__rgcms_schema-cmd_commandDto">4.2.1. <code>commandDto</code></h4> <div class="paragraph"> <p>The <code>commandDto</code> root element is defined as:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/cmd</span><span class="delimiter">"</span></span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="attribute-name">elementFormDefault</span>=<span class="string"><span class="delimiter">"</span><span class="content">qualified</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:xs</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://www.w3.org/2001/XMLSchema</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/cmd</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:com</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:import</span> <span class="attribute-name">namespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="attribute-name">schemaLocation</span>=<span class="string"><span class="delimiter">"</span><span class="content">../common/common-1.0.xsd</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">commandDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">majorVersion</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">default</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">minorVersion</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">default</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">transactionId</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">user</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">targets</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:oidsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="7"></i><b>(7)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">member</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="8"></i><b>(8)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">timings</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberDto</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="9"></i><b>(9)</b> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">commandsDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="10"></i><b>(10)</b> <span class="tag">&lt;xs:annotation&gt;</span> <span class="tag">&lt;xs:documentation&gt;</span>Collection of commandDto's<span class="tag">&lt;/xs:documentation&gt;</span> <span class="tag">&lt;/xs:annotation&gt;</span> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence</span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">ref</span>=<span class="string"><span class="delimiter">"</span><span class="content">commandDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>the command schema has a namespace URI of "http://isis.apache.org/schema/cmd". Although URIs are not the same as URLs, you will find that the schemas are also downloadable from this location.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>uses complex types defined in the <a href="../rgcms/rgcms.html#_rgcms_schema_common">"common" schema</a>.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>definition of the <code>commandDto</code> root element. The corresponding XML will use this as its top-level element.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>each instance of this schema indicates the version of the schema it is compatible with (following semantic versioning)</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>unique identifier for the transaction in which this command is created. The transaction Id is used to correlate to the <a href="../rgcms/rgcms.html#_rgcms_schema_interaction">interaction</a> that executes the command, and to any <a href="../rgcms/rgcms.html#_rgcms_schema_changes">changes</a> to domain objects occurring as a side-effect of that interaction.</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>the name of the user who created the command (whose intention it is to invoke the action/edit the property).</td> </tr> <tr> <td><i class="conum" data-value="7"></i><b>7</b></td> <td>the target object (or objects) to be invoked. A bulk action will create multiple commands, each with only a single target. (A future version of the framework may also support a single bulk command against this multiple targets, ie all-or-nothing).</td> </tr> <tr> <td><i class="conum" data-value="8"></i><b>8</b></td> <td>the <code>memberDto</code>, defined below, the captures the action/property and arguments/new value.</td> </tr> <tr> <td><i class="conum" data-value="9"></i><b>9</b></td> <td>optional timings for the invocation of a command.</td> </tr> <tr> <td><i class="conum" data-value="10"></i><b>10</b></td> <td>groups multiple commands together.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The <code>CommandDto</code> DTO corresponding to the <code>commandDto</code> root element can be marshalled to/from XML using the <code>CommandDtoUtils</code> class. The <code>CommandsDto</code> DTO allows multiple commands to be marshalled together. This was introduced to support replication of commands in a master/slave arrangement (eg for regression testing).</p> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-cmd_memberDto">4.2.2. <code>memberDto</code> and subtypes</h4> <div class="paragraph"> <p>The <code>memberDto</code> complex type is an abstract type representing the intention to either invoke an action or to edit a property. The <code>actionDto</code> and <code>propertyDto</code> are the concrete subtypes:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/cmd</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span><span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberDto</span><span class="delimiter">"</span></span> <span class="attribute-name">abstract</span>=<span class="string"><span class="delimiter">"</span><span class="content">true</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberIdentifier</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">logicalMemberIdentifier</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">interactionType</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:interactionType</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">actionDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">parameters</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">paramsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">propertyDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">newValue</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:valueWithTypeDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:schema&gt;</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>the <code>memberDto</code> is an abstract type. Its primary responsibility is simply to identify the member (action or property).</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the formal identifier (fully qualified class name + member name) of the member being interacted with (action or property).</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>the "logical" formal identifier (object type, as per <code>@DomainObject(objectType=)</code>, + member name) of the member being interacted with (action or property).</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>the <code>interactionType</code> attribute indicates whether the member is an action or a property.</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>the <code>actionDto</code> complex type captures the set of parameters (also including the argument values) with which to invoke the action. The <code>paramsDto</code> type is defined <a href="../rgcms/rgcms.html#__rgcms_schema-cmd_ancillary">below</a>.</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>the <code>propertyDto</code> complex type captures the new value (possibly <code>null</code>) to set the property to.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>In general the <code>logicalMemberIdentifier</code> should be used in preference to the <code>memberIdentifier</code> because will not (necessarily) have to change if the class is moved during a refactoring.</p> </div> <div class="paragraph"> <p>Note also that there is a corresponding <a href="../rgcms/rgcms.html#__rgcms_schema-ixn_memberExecutionDto"><code>memberExecutionDto</code></a> complex type in the "ixn" schema that is for the actual execution (capturing metrics about its execution and also the return value if an action invocation).</p> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-cmd_ancillary">4.2.3. Ancillary types</h4> <div class="paragraph"> <p>The schema also defines a small number of supporting types:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/cmd</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span><span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">paramsDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:sequence</span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">parameter</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">paramDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">paramDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:valueWithTypeDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">name</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">required</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:schema&gt;</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>the <code>paramsDto</code> is simply the list of parameter/arguments.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the <code>paramDto</code> complex type essentially combines a parameter with its corresponding argument: a named value that has a type. It extends the <code>valueWithTypeDto</code> complex type taken from the <a href="../rgcms/rgcms.html#_rgcms_schema-common">"common"</a> schema.</td> </tr> </tbody> </table> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_schema-ixn">4.3. Interaction Execution</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/rgcms/_rgcms_schema-ixn.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/rgcms/_rgcms_schema-ixn.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/rgcms/_rgcms_schema-ixn.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/rgcms/_rgcms_schema-ixn.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/rgcms/_rgcms_schema-ixn.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 interaction ("ixn") schema defines the serialized form of an action invocation or a property edit. In fact, it actually defines a call-graph of such executions for those cases where the <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a> is used to execute sub-actions/property edits.</p> </div> <div class="paragraph"> <p>Each execution identifies the target object, the member to invoke, and the arguments. It also captures metrics about the execution, and the result of the execution (eg return value of an action invocation).</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>Mixin actions are represented as regular actions on the mixed-in object. In other words, the fact that the actual implementation of the action is defined by a mixin is an implementation detail only.</p> </div> </td> </tr> </tbody> </table> </div> <div class="sect3"> <h4 id="__rgcms_schema-ixn_interactionDto">4.3.1. <code>interactionDto</code></h4> <div class="paragraph"> <p>The <code>interactionDto</code> root element is defined as:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/ixn</span><span class="delimiter">"</span></span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="attribute-name">elementFormDefault</span>=<span class="string"><span class="delimiter">"</span><span class="content">qualified</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:xs</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://www.w3.org/2001/XMLSchema</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/ixn</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:cmd</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/cmd</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:com</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:import</span> <span class="attribute-name">namespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="attribute-name">schemaLocation</span>=<span class="string"><span class="delimiter">"</span><span class="content">../common/common-1.0.xsd</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:import</span> <span class="attribute-name">namespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/cmd</span><span class="delimiter">"</span></span> <span class="attribute-name">schemaLocation</span>=<span class="string"><span class="delimiter">"</span><span class="content">../cmd/cmd-1.0.xsd</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">interactionDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">majorVersion</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">default</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">minorVersion</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">default</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">transactionId</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">execution</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberExecutionDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;/xs:schema&gt;</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>the interaction schema has a namespace URI of "http://isis.apache.org/schema/ixn". Although URIs are not the same as URLs, you will find that the schemas are also downloadable from this location.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>uses complex types defined in the <a href="../rgcms/rgcms.html#_rgcms_schema_common">"common" schema</a> and also the <a href="../rgcms/rgcms.html#_rgcms_schema_cmd">"cmd" schema</a></td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>definition of the <code>interactionDto</code> root element. The corresponding XML will use this as its top-level element.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>each instance of this schema indicates the version of the schema it is compatible with (following semantic versioning)</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>unique identifier for the transaction in which this interaction is being executed. The transaction Id is used to correlate back to the <a href="../rgcms/rgcms.html#_rgcms_schema_command">command</a> that represented the intention to perform this execution, as well as to any <a href="../rgcms/rgcms.html#_rgcms_schema_changes">changes</a> to domain objects that occur as a side-effect of the interaction.</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>the top-level <code>memberExecutionDto</code>, defined below, either an action invocation or edit of a property.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The <code>InteractionDto</code> DTO corresponding to the <code>interactionDto</code> root element can be marshalled to/from XML using the <code>InteractionDtoUtils</code> class.</p> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-ixn_memberExecutionDto">4.3.2. <code>memberExecutionDto</code></h4> <div class="paragraph"> <p>The <code>memberExecutionDto</code> complex type is an abstract type representing either the invocation an action or the editing of a property. It corresponds to the <a href="../rgcms/rgcms.html#__rgcms_schema-cmd_memberDto"><code>memberDto</code></a> of the "cmd" schema; some elements are copied directly:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/ixn</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberExecutionDto</span><span class="delimiter">"</span></span> <span class="attribute-name">abstract</span>=<span class="string"><span class="delimiter">"</span><span class="content">true</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">sequence</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:int</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">target</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:oidDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberIdentifier</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">logicalMemberIdentifier</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">user</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">title</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="7"></i><b>(7)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">metrics</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">metricsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="8"></i><b>(8)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">threw</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">exceptionDto</span><span class="delimiter">"</span></span> <i class="conum" data-value="9"></i><b>(9)</b> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">childExecutions</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="10"></i><b>(10)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">execution</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberExecutionDto</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">interactionType</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:interactionType</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="11"></i><b>(11)</b> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>the <code>memberExecutionDto</code> is an abstract type</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>uniquely identifies this execution within the transaction. Can be combined with <code>transactionId</code> to create a unique identifier (across all other interaction executions and also changed objects events) of this particular interaction execution.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>the target object, corresponding to one of the elements of the <code>targets</code> element of the <a href="../rgcms/rgcms.html#__rgcms_schema-cmd_memberDto"><code>memberDto</code></a></td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>the member identifier; corresponds to <code>memberIdentifier</code> of the <code>member</code> element of the <a href="../rgcms/rgcms.html#__rgcms_schema-cmd_memberDto"><code>memberDto</code></a></td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>the <em>logical</em> member identifier; corresponds to <code>logicalMemberIdentifier</code> of the <code>member</code> element of the <a href="../rgcms/rgcms.html#__rgcms_schema-cmd_memberDto"><code>memberDto</code></a></td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>the user executing the action invocation/property edit; corresponds to the <code>user</code> element of the <a href="../rgcms/rgcms.html#__rgcms_schema-cmd_memberDto"><code>memberDto</code></a></td> </tr> <tr> <td><i class="conum" data-value="7"></i><b>7</b></td> <td>the current "human-friendly" title of the target object</td> </tr> <tr> <td><i class="conum" data-value="8"></i><b>8</b></td> <td>the set of metrics captured for this execution, of type <code>metricsDto</code> defined <a href="../rgcms/rgcms.html#__rgcms_schema-ixn_ancillary">below</a>.</td> </tr> <tr> <td><i class="conum" data-value="9"></i><b>9</b></td> <td>if the action invocation/property edit threw an exception, then this is captured here.</td> </tr> <tr> <td><i class="conum" data-value="10"></i><b>10</b></td> <td>if any sub-actions or sub-edits were performed via the <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a>, then these are captured in the <code>childExecutions</code> element.</td> </tr> <tr> <td><i class="conum" data-value="11"></i><b>11</b></td> <td>the <code>interactionType</code> attribute indicates whether the member is an action or a property (similar attribute exists for the "cmd" schema).</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>In general the <code>logicalMemberIdentifier</code> should be used in preference to the <code>memberIdentifier</code> because will not (necessarily) have to change if the class is moved during a refactoring.</p> </div> <div class="paragraph"> <p>The <code>actionInvocationDto</code> and <code>propertyEditDto</code> are the concrete subtypes:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/ixn</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">actionInvocationDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberExecutionDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">parameters</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">cmd:paramsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">returned</span><span class="delimiter">"</span></span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:valueWithTypeDto</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">propertyEditDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">memberExecutionDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">newValue</span><span class="delimiter">"</span></span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:valueWithTypeDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>the <code>actionInvocationDto</code> inherits from <code>memberExecutionDto</code>. It corresponds to the similar <a href="../rgcms/rgcms.html#__rgcms_schema-cmd_memberDto"><code>actionDto</code></a> complex type of the "cmd" schema</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the <code>parameters</code> element captures the parameter and argument values; for the top-level execution it is a direct copy of the corresponding <code>parameters</code> element of the <code>actionDto</code> complex type of the "cmd" schema.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>the <code>returned</code> element captures the returned value (if not void). It is not valid for both this element and the inherited <code>threw</code> element to both be populated.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>the <code>propertyEditDto</code> inherits from <code>memberExecutionDto</code>. It corresponds to the similar <a href="../rgcms/rgcms.html#__rgcms_schema-cmd_memberDto"><code>propertyDto</code></a> complex type of the "cmd" schema</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>the <code>newValue</code> element captures the new value; for the top-level execution it is a direct copy of the corresponding <code>newValue</code> element of the <code>propertyDto</code> complex type of the "cmd" schema.</td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-ixn_ancillary">4.3.3. Ancillary types</h4> <div class="paragraph"> <p>The schema also defines a small number of supporting types:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/ixn</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">metricsDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">timings</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:periodDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">objectCounts</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">objectCountsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">objectCountsDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">loaded</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:differenceDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">dirtied</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:differenceDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">exceptionDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">message</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">stackTrace</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">causedBy</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">exceptionDto</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:schema&gt;</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>the <code>metricsDto</code> captures the time to perform an execution, and also the differences in various object counts.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the <code>objectCountsDto</code> complex type is the set of before/after differences, one for each execution; the framework tracks number of objects loaded (read from) the database and the number of objects dirtied (will need to be saved back to the database). Together these metrics give an idea of the "size" of this particular execution.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>the <code>exceptionDto</code> complex type defines a structure for capturing the stack trace of any exception that might occur in the course of invoking an action or editing a property.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The <a href="../rgcms/rgcms.html#_rgcms_schema_changes">changes</a> schema also provides metrics on the number of objects loaded/changed, but relates to the entire interaction rather than just one (sub)execution of an interaction.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_schema-chg">4.4. Changes</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/rgcms/_rgcms_schema-chg.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/rgcms/_rgcms_schema-chg.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/rgcms/_rgcms_schema-chg.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/rgcms/_rgcms_schema-chg.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/rgcms/_rgcms_schema-chg.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 changes ("chg") schema defines the serialized form identifying which objects have been created, updated or deleted as the result of invoking an action or editing a property. It also captures a number of other metrics counts (number of objects loaded, number of object properties modified), useful for profiling.</p> </div> <div class="paragraph"> <p>An instance of the DTO (corresponding to this schema) is used within the <a href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-spi_PublisherService"><code>PublisherService</code></a> SPI, identifying changed objects that are to be published (as per <a href="../rgant/rgant.html#_rgant-DomainObject_publishing"><code>@DomainObject#publishing()</code></a> or equivalent).</p> </div> <div class="sect3"> <h4 id="_code_changesdto_code">4.4.1. <code>changesDto</code></h4> <div class="paragraph"> <p>The <code>changesDto</code> root element is defined as:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/chg</span><span class="delimiter">"</span></span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="attribute-name">elementFormDefault</span>=<span class="string"><span class="delimiter">"</span><span class="content">qualified</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:xs</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://www.w3.org/2001/XMLSchema</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/chg</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:com</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:import</span> <span class="attribute-name">namespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="attribute-name">schemaLocation</span>=<span class="string"><span class="delimiter">"</span><span class="content">../common/common-1.0.xsd</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">changesDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:complexType&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">majorVersion</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">default</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">minorVersion</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">default</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">transactionId</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">sequence</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:int</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">completedAt</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:dateTime</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="7"></i><b>(7)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">user</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="8"></i><b>(8)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">objects</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">objectsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="9"></i><b>(9)</b> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:element&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>the changes schema has a namespace URI of "http://isis.apache.org/schema/chg". Although URIs are not the same as URLs, you will find that the schemas are also downloadable from this location.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>uses complex types defined in the <a href="../rgcms/rgcms.html#_rgcms_schema_common">"common" schema</a>.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>definition of the <code>changesDto</code> root element. The corresponding XML will use this as its top-level element.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>each instance of this schema indicates the version of the schema it is compatible with (following semantic versioning)</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>unique identifier for the transaction in which this interaction is being executed. The transaction Id is used to correlate back to the <a href="../rgcms/rgcms.html#_rgcms_schema_command">command</a> that represented the intention to perform this execution, as well as to the <a href="../rgcms/rgcms.html#_rgcms_schema_interaction">interaction</a> that executes said command.</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>uniquely identifies this set of changes within the interaction. Can be combined with <code>transactionId</code> to create a unique identifier (across all other changed object events and also any interaction executions) of this particular set of changed objects.</td> </tr> <tr> <td><i class="conum" data-value="7"></i><b>7</b></td> <td>the date/time that the transaction that dirtied this objects completed</td> </tr> <tr> <td><i class="conum" data-value="8"></i><b>8</b></td> <td>the user that executed the (top-level) action invocation/property edit.</td> </tr> <tr> <td><i class="conum" data-value="9"></i><b>9</b></td> <td>identifies the objects that have changed.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The <code>ChangesDto</code> DTO corresponding to the <code>changesDto</code> root element can be marshalled to/from XML using the <code>ChangesDtoUtils</code> class.</p> </div> </div> <div class="sect3"> <h4 id="_code_objectsdto_code">4.4.2. <code>objectsDto</code></h4> <div class="paragraph"> <p>The <code>objectsDto</code> complex type actually identifies the objects created, updated or deleted. It also captures additional metrics counters:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/chg</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">objectsDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">loaded</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:int</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">created</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:oidsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">updated</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:oidsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">deleted</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">com:oidsDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">propertiesModified</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:int</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:schema&gt;</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>the number of objects that were loaded, in total, by the interaction.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the identities of the objects that were, respectively, created, updated or deleted within the transaction.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>the number of objects' properties changed, in total, by the interaction.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>The <a href="../rgcms/rgcms.html#_rgcms_schema_ixn">interaction</a> schema also provides metrics on the number of objects loaded/changed, but is more granular, each figure relating to a single (sub-)execution within an interaction.</p> </div> </div> </div> <div class="sect2"> <h3 id="_rgcms_schema-aim">4.5. Action Invocation Memento</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/rgcms/_rgcms_schema-aim.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/rgcms/_rgcms_schema-aim.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/rgcms/_rgcms_schema-aim.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/rgcms/_rgcms_schema-aim.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/rgcms/_rgcms_schema-aim.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 "aim" schema previously defined the serialized form (or memento) of an action invocation.</p> </div> <div class="paragraph"> <p>The schema was removed in <code>1.13.0</code>, and was replaced by:</p> </div> <div class="ulist"> <ul> <li> <p><a href="../rgcms/rgcms.html#_rgcms_schema-ixn">ixn.xsd</a></p> <div class="paragraph"> <p>for action invocations/property edits, and</p> </div> </li> <li> <p><a href="../rgcms/rgcms.html#_rgcms_schema-cmd">cmd.xsd</a></p> <div class="paragraph"> <p>for commands, ie the <em>intention</em> to invoke an action/edit a property.</p> </div> </li> </ul> </div> </div> <div class="sect2"> <h3 id="_rgcms_schema-common">4.6. Common Schema</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/rgcms/_rgcms_schema-common.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/rgcms/_rgcms_schema-common.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/rgcms/_rgcms_schema-common.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/rgcms/_rgcms_schema-common.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/rgcms/_rgcms_schema-common.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 "common" schema defines a number of complex types that are used by other higher-level schemas.</p> </div> <div class="sect3"> <h4 id="__rgcms_schema-common_oidDto">4.6.1. <code>oidDto</code></h4> <div class="paragraph"> <p>The <code>oidDto</code> complex type captures an object’s type and its identifier. This is basically a formal XML equivalent to the <code>Bookmark</code> object obtained from the <a href="../rgsvc/rgsvc.html#_rgsvc_integration-api_BookmarkService"><code>BookmarkService</code></a>.</p> </div> <div class="paragraph"> <p>Although simple, this is an enormously powerful concept, in that it represents a URI to any domain object managed by a given Apache Isis application. With it, we have the ability to lookup any arbitrary object. Further discussion and examples can be found <a href="../ugfun/ugfun.html#_ugfun_building-blocks_identifiers_oid">here</a>.</p> </div> <div class="paragraph"> <p>The <code>oidDto</code> complex type is defined as:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="attribute-name">elementFormDefault</span>=<span class="string"><span class="delimiter">"</span><span class="content">qualified</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span> <span class="attribute-name">xmlns:xs</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://www.w3.org/2001/XMLSchema</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">oidDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:sequence</span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">type</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">id</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">objectState</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">bookmarkObjectState</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:simpleType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">bookmarkObjectState</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:restriction</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">persistent</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">transient</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">viewModel</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:restriction&gt;</span> <span class="tag">&lt;/xs:simpleType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">oidsDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">oid</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">oidDto</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>the common schema has a namespace URI of "http://isis.apache.org/schema/common". Although URIs are not the same as URLs, you will find that the schemas are also downloadable from this location.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>the <code>oidDto</code> complex type defines the unique identifier for any domain object: its type, and an identifier. The <code>objectState</code> attribute can usually be omitted (indicating a persistent object)</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>the object type, corresponding to either the <a href="../rgant/rgant.html#_rgant-DomainObject_objectType"><code>@DomainObject#objectType()</code></a> attribute, or to the (JDO) <a href="../rgant/rgant.html#_rgant-PersistenceCapable"><code>@PersistenceCapable</code></a> annotation (<code>schema</code> and/or <code>table</code> attributes), or to the (JDO) <a href="../rgant/rgant.html#_rgant-Discriminator"><code>@Discriminator</code></a> annotation. If none is specified, then the fully qualified class name will be used.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>the object identifier (aka primary key), converted to string form.</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>the <code>bookmarkObjectState</code> enumerates the possible persistence states of the referenced object. In previous versions of the schema the attribute was defaulted to "persistent"; the "persistent" state is assumed if the attribute is omitted.</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>Models a list of OIDs. This is used by the <a href="../rgcms/rgcms.html#_rgcms_schema_cmd">"cmd" schema</a> to represent the intention to perform a bulk actions (against a number of selected objects).</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>In previous versions of the schema the object type and object identifers of <code>oidDto</code> were modelled as an element rather than an attribute. The element form can still be used, but is deprecated.</p> </div> <div class="paragraph"> <p>The <code>oidDto</code> complex type is used in a number of places by the framework:</p> </div> <div class="ulist"> <ul> <li> <p>first, as a means of serializing JAXB view model/DTOs (annotated with <a href="../rgant/rgant.html#_rgant-XmlRootElement"><code>@XmlRootElement</code></a>), that reference domain entities.</p> <div class="paragraph"> <p>These references are serialized instead into OIDs</p> </div> </li> <li> <p>second, as references to the target of a command representing the <em>intention</em> to invoke an action or edit a property, as described by the <a href="../rgcms/rgcms.html#_rgcms_schema-cmd">"cmd" (command)</a> schema.</p> <div class="paragraph"> <p>They are also used to represent references to any action arguments/properties that take domain object entities/view models.</p> </div> </li> <li> <p>third, as references to the target of an interaction capturing the actual execution of an action invocation or property edit, as described by the <a href="../rgcms/rgcms.html#_rgcms_schema-ixn">"ixn" (interaction)</a> schema.</p> </li> </ul> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-common_collectionDto">4.6.2. <code>collectionDto</code> etc</h4> <div class="paragraph"> <p>The <code>collectionDto</code> type defines a collection of values, also capturing the type of those values (for example <code>string</code>s, or <code>OidDto</code>s). It is used primarily to model invocations of actions with collection parameters.</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">collectionDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">value</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueDto</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">type</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">required</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueType</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">null</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">optional</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:boolean</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</span></code></pre> </div> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-common_valueDto">4.6.3. <code>valueDto</code> etc</h4> <div class="paragraph"> <p>The common schema also defines two types representing values: the <code>valueDto</code> complex type, the <code>valueType</code> simple type and the <code>valueWithTypeDto</code> complex type:</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:choice</span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">string</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">byte</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:byte</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">short</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:short</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> ... <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">timestamp</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:dateTime</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">enum</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">enumDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">reference</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">oidDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">collection</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">collectionDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">blob</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">blobDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">clob</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">clobDto</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:choice&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:simpleType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueType</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:restriction</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">byte</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">short</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> ... <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">enum</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">reference</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">collection</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">blob</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">clob</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">void</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;/xs:restriction&gt;</span> <span class="tag">&lt;/xs:simpleType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueWithTypeDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="tag">&lt;xs:complexContent&gt;</span> <span class="tag">&lt;xs:extension</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">type</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">required</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueType</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">null</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">optional</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:boolean</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:extension&gt;</span> <span class="tag">&lt;/xs:complexContent&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> ... <span class="tag">&lt;/xs:schema&gt;</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>Intended to hold any valid value, eg of an argument to an action or a new value of a property.</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>Enumerates the full set of types understood by the framework; note that these also include references to entities or view models, and to enums.</td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>Not valid to be used as the parameter type of an action; can be used as its return type.</td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>Inherits from <code>valueDto</code>, capturing both a value and its corresponding type. Used for the return value of action invocations, and for the new value in property edits.</td> </tr> </tbody> </table> </div> <div class="paragraph"> <p>These type definitions are just building blocks. The first, <code>valueDto</code> is The second, <code>valueType</code>, enumerates the different types of vales, eg of a formal parameter to an action.</p> </div> <div class="admonitionblock important"> <table> <tbody> <tr> <td class="icon"> <i class="fa icon-important" title="Important"></i> </td> <td class="content"> <div class="paragraph"> <p>When used as a parameter, blob and clob arguments are <em>not</em> serialized. Instead these are persisted only as references. This is primarily to save storage space if the resultant XML is persisted as a memento (eg <code>CommandDto</code>).</p> </div> </td> </tr> </tbody> </table> </div> </div> <div class="sect3"> <h4 id="__rgcms_schema-common_ancillary">4.6.4. Ancillary types</h4> <div class="paragraph"> <p>The common schema also defines a number of ancillary types, used either by the common schema itself (see above) or by the <a href="../rgcms/rgcms.html#_rgcms_schema_cmd">"cmd"</a> and <a href="../rgcms/rgcms.html#_rgcms_schema_ixn">"ixn"</a> schemas.</p> </div> <div class="listingblock"> <div class="content"> <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;xs:schema</span> <span class="attribute-name">targetNamespace</span>=<span class="string"><span class="delimiter">"</span><span class="content">http://isis.apache.org/schema/common</span><span class="delimiter">"</span></span> <span class="attribute-name">...</span> <span class="tag">&gt;</span> ... <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">enumDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="1"></i><b>(1)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">enumType</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">enumName</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">blobDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="2"></i><b>(2)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">name</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">mimeType</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">bytes</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:hexBinary</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">type</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">required</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueType</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">null</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">optional</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:boolean</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">clobDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="3"></i><b>(3)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">name</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">mimeType</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">chars</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">type</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">required</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">valueType</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">null</span><span class="delimiter">"</span></span> <span class="attribute-name">use</span>=<span class="string"><span class="delimiter">"</span><span class="content">optional</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:boolean</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">periodDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="4"></i><b>(4)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">startedAt</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:dateTime</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">completedAt</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:dateTime</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">0</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">differenceDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="5"></i><b>(5)</b> <span class="tag">&lt;xs:sequence</span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">before</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:int</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;xs:attribute</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">after</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:int</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;xs:simpleType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">interactionType</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="6"></i><b>(6)</b> <span class="tag">&lt;xs:restriction</span> <span class="attribute-name">base</span>=<span class="string"><span class="delimiter">"</span><span class="content">xs:string</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">action_invocation</span><span class="delimiter">"</span></span> <span class="tag">/&gt;</span> <span class="tag">&lt;xs:enumeration</span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">property_edit</span><span class="delimiter">"</span></span> <span class="tag">/&gt;</span> <span class="tag">&lt;/xs:restriction&gt;</span> <span class="tag">&lt;/xs:simpleType&gt;</span> <span class="tag">&lt;xs:complexType</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">oidsDto</span><span class="delimiter">"</span></span><span class="tag">&gt;</span> <i class="conum" data-value="7"></i><b>(7)</b> <span class="tag">&lt;xs:sequence&gt;</span> <span class="tag">&lt;xs:element</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">"</span><span class="content">oid</span><span class="delimiter">"</span></span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">oidDto</span><span class="delimiter">"</span></span> <span class="attribute-name">minOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">1</span><span class="delimiter">"</span></span> <span class="attribute-name">maxOccurs</span>=<span class="string"><span class="delimiter">"</span><span class="content">unbounded</span><span class="delimiter">"</span></span><span class="tag">/&gt;</span> <span class="tag">&lt;/xs:sequence&gt;</span> <span class="tag">&lt;/xs:complexType&gt;</span> <span class="tag">&lt;/xs:schema&gt;</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>Models an instance member of an enum (eg <code>Color.RED</code>).</td> </tr> <tr> <td><i class="conum" data-value="2"></i><b>2</b></td> <td>Models a <code>Blob</code></td> </tr> <tr> <td><i class="conum" data-value="3"></i><b>3</b></td> <td>Models a <code>Clob</code></td> </tr> <tr> <td><i class="conum" data-value="4"></i><b>4</b></td> <td>Captures a period of time, eg for capturing metrics/timings.</td> </tr> <tr> <td><i class="conum" data-value="5"></i><b>5</b></td> <td>Captures a pair of numbers representing a difference. Used for example to capture metrics (number objects modified before and after).</td> </tr> <tr> <td><i class="conum" data-value="6"></i><b>6</b></td> <td>Whether this command/interaction with a member is invoking an action, or editing a property. Used by both the <a href="../rgcms/rgcms.html#_rgcms_schema_cmd">"cmd"</a> and <a href="../rgcms/rgcms.html#_rgcms_schema_ixn">"ixn"</a> schemas.</td> </tr> <tr> <td><i class="conum" data-value="7"></i><b>7</b></td> <td>Contains a list of OIDs, eg for use in "bulk" actions that apply to multiple targets.</td> </tr> </tbody> </table> </div> </div> </div> </div> </div> </div> </div> <div class="hidden-xs hidden-sm hidden-md col-lg-3"> <nav id="toc" data-spy="affix" data-toggle="toc"></nav> </div> </div> </div> <footer class="footer"> <div class="container"> <div class="row"> <p class="text-center small text-muted"> Copyright © 2010~2018 The Apache&nbsp;Software&nbsp;Foundation, licensed under the Apache&nbsp;License,&nbsp;v2.0. <br> Apache, the Apache feather logo, Apache&nbsp;Isis, and the Apache&nbsp;Isis project logo are all trademarks of The&nbsp;Apache&nbsp;Software&nbsp;Foundation. </p> </div> </div> </footer> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="../../js/bootstrap/3.3.7/bootstrap.min.js"></script> <script src="../../js/bootstrap-toc/0.4.1/bootstrap-toc.min.js"></script> <script src="../../js/slick/1.5.0/slick.min.js"></script> <script src="../../js/elasticlunr/elasticlunr.min.js"></script> <script src="../../js/sticky-header/sticky-header.js"></script> <script src="../../js/search-panel/search-panel.js"></script> <script src="../../js/header-link/header-link.js"></script> <script src="../../js/toc-scroll/toc-scroll.js"></script> </body> </html>