http://git-wip-us.apache.org/repos/asf/isis-site/blob/952d8154/content/elasticlunr/index.json
----------------------------------------------------------------------
diff --git a/content/elasticlunr/index.json b/content/elasticlunr/index.json
index c25db06..20f6ad3 100644
--- a/content/elasticlunr/index.json
+++ b/content/elasticlunr/index.json
@@ -1 +1 @@
-{"version":"0.9.5","fields":["title","body","description","url"],"ref":"id","documentStore":{"docs":{"372886":{"title":"Rows,
 full-width cols, and 
tabs","url":"guides/ugvw/ugvw.html#_rows_full_width_cols_and_tabs","body":"Rows,
 full-width cols, and tabs  The example layout consists of three rows: a row 
for the object/icon, a row containing a properties, and a row containing 
collections. In all three cases the row contains a single column spanning the 
full width of the page. For the property and collection rows, the column 
contains a tab group.  This corresponds to the following XML:  You will notice 
that one of the columns has an unreferencedActions attribute, while one of the 
tabGroups has a similar unreferencedCollections attribute. This topic is 
discussed in more detail below. ","description":" The example layout consists 
of three rows: a row for the object/icon, a row containing a properties, and a 
row containing collections. In all three cases the row contains a single column 
s
 panning the full width of the page. For the property and collection rows, the 
column contains a","id":372886},"2646929":{"title":"Apache Isis vs 
…​","url":"guides/ugfun/ugfun.html#_ugfun_core-concepts_apache-isis-vs","body":"Apache
 Isis vs …​  Many other frameworks promise rapid application development 
and provide automatically generated user interfaces, so how do they compare to 
Apache Isis? ","description":" Many other frameworks promise rapid application 
development and provide automatically generated user interfaces, so how do they 
compare to Apache Isis? 
","id":2646929},"2909574":{"title":"created()","url":"guides/rgcms/rgcms.html#_rgcms_methods_reserved_created","body":"created()
  The created() lifecycle callback method is called when an object has just 
been created using newTransientInstance() ","description":" The created() 
lifecycle callback method is called when an object has just been created using 
newTransientInstance() ","id":2909574},"3836440":{"title":"Running
 ","url":"guides/dg/dg.html#__dg_ide_intellij_running","body":"Running  Let’s 
see how to run both the app and the tests. ","description":" Let’s see how to 
run both the app and the tests. ","id":3836440},"11600575":{"title":"Using 
Contributions","url":"pages/tg/tg.html#_using_contributions","body":"Using 
Contributions  One of Apache Isis' most powerful features is the ability for 
the UI to combine functionality from domain services into the representation of 
an entity. The effect is similar to traits or mix-ins in other languages, 
however the \"mixing in\" is done at runtime, within the Apache Isis metamodel. 
In Apache Isis' terminology, we say that the domain service action is 
contributed to the entity.  Any action of a domain service that has a domain 
entity type as one of its parameter types will (by default) be contributed. If 
the service action takes more than one argument, or does not have safe 
semantics, then it will be contributed as an entity action. If the service actio
 n has precisely one parameter type (that of the entity) and has safe semantics 
then it will be contributed either as a collection or as a property (dependent 
on whether it returns a collection of a scalar).  Why are contributions so 
useful? Because the service action will match not on the entity type, but also 
on any of the entity’s supertypes (all the way up to java.lang.Object). That 
means that you can apply the dependency inversion principle to ensure that the 
modules of your application have acyclic dependencies; but in the UI it can 
still appear as if there are bidirectional dependencies between those modules. 
The lack of bidirectional dependencies can help save your app degrading into a 
big ball of mud.  Finally, note that the layout of contributed 
actions/collections/properties can be specified using the .layout.json file 
(and it is highly recommended that you do so). ","description":" One of Apache 
Isis' most powerful features is the ability for the UI to combine functiona
 lity from domain services into the representation of an entity. The effect is 
similar to traits or mix-ins in other languages, however the \"mixing in\" is 
done at runtime, within the Apache Isis 
metamodel","id":11600575},"12649581":{"title":"Mark the version as 
released","url":"guides/cgcom/cgcom.html#_mark_the_version_as_released","body":"Mark
 the version as released  In JIRA, go to the administration section for the 
Apache Isis project and update the version as being released.  In the Kanban 
view this will have the effect of marking all tickets as released (clearing the 
\"done\" column). ","description":" In JIRA, go to the administration section 
for the Apache Isis project and update the version as being released. 
","id":12649581},"13573617":{"title":"hide…​()","url":"guides/rgcms/rgcms.html#_rgcms_methods_prefixes_hide","body":"hide…​()
  The hide…​() supporting method is called for properties, collections and 
actions. It allows the property/collection to be complete
 ly hidden from view.  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 disabled, ie greyed out).  The signature of 
the supporting method is simply:  Returning true will hide the property, 
collection or action, returning false leaves it visible.  For example, to hide 
an action:  Or, to hide a property: ","description":" The hide…​() 
supporting method is called for properties, collections and actions. It allows 
the property/collection to be completely hidden from view. 
","id":13573617},"14971197":{"title":"Suppressing 'remember 
me'","url":"guides/ugvw/ugvw.html#_ugvw_configuration-properties_suppressing-remember-me","body":"Suppressing
 'remember me'  The 'remember me' checkbox on the login page can be suppressed, 
if required, by setting a configuration flag. ","description":" The 'remember 
me' checkbox on the login page can be suppressed, if required, by setting 
 a configuration flag. ","id":14971197},"15527588":{"title":"Restful Objects 
Specification","url":"pages/books/books.html#_restful_objects_specification","body":"Restful
 Objects Specification 
","description":"","id":15527588},"16629694":{"title":"allowLateRegistration","url":"migration-notes/migration-notes.html#__code_allowlateregistration_code","body":"allowLateRegistration
  One possible issue is that (as per ISIS-830) the EventBusService is now 
initialized as one of the first domain services; this is to ensure that any 
object lifecycle events caused by domain services initializing themselves can 
be posted on the event bus for subscribers. The typical case for such lifecycle 
events to occur is from domain services that seed reference data; one such 
example can be found in the (non-ASF) Isis addons' security module.  In 
previous releases, the ordering of initialization for the EventBusService was 
undefined (but would typically be towards the \"end\" of the list of services. 
What thi
 s meant in practice is that it generally didn’t matter whether (domain 
service) subscribers were initialized before or after seed services.  Now, 
though, because the EventBusService is initialized early on, it proactively 
checks that all subscribers have been registered before any event posts occur 
(so that no events get missed). If any subscriber attempts to register after at 
least one event has been posted, then the service will fail fast and the 
framework will not start. The error looks something like:  To ensure that 
subscriber domain services are initialized before \"seed\" domain services, the 
@DomainServiceLayout#menuOrder() attribute can be used. Normally this attribute 
is just used to order UI-visible services on the menu bars, but it also is used 
internally to sequence the internal list of services being initialized.  
Alternatively, you can disable this checking within the EventBusService using:  
If you do that, be aware that not all subscribers may not receive some even
 ts generated by other domain services.  For more details, see the 
EventBusService man page. ","description":" One possible issue is that (as per 
ISIS-830) the EventBusService is now initialized as one of the first domain 
services; this is to ensure that any object lifecycle events caused by domain 
services initializing themselves can be posted on the event bus for 
subscribers. The typical case for 
such","id":16629694},"17000573":{"title":"ObjectCreatedEvent","url":"guides/rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectCreatedEvent","body":"ObjectCreatedEvent
  Subclass of AbstractLifecycleEvent, broadcast when an object is first 
instantiated using the DomainObjectContainer's #newTransientInstance(…​) 
method.  ObjectCreatedEvent.Default is the concrete implementation that is 
used. ","description":" Subclass of AbstractLifecycleEvent, broadcast when an 
object is first instantiated using the DomainObjectContainer's 
#newTransientInstance(…​) method. ","id":17000573},"176188
 94":{"title":"New 
Feature","url":"release-notes/release-notes.html#_new_feature_20","body":"New 
Feature ","description":"","id":17618894},"17724516":{"title":"Multi-select 
action 
parameters","url":"guides/ugfun/ugfun.html#_multi_select_action_parameters","body":"Multi-select
 action parameters  As well as scalar values, action parameters can also be 
collections. For this to be valid, a choices or autoComplete supporting method 
must be provided.  For example, suppose we want to \"tag\" or \"label\" an 
object: ","description":" As well as scalar values, action parameters can also 
be collections. For this to be valid, a choices or autoComplete supporting 
method must be provided. ","id":17724516},"18445041":{"title":"Verifying 
Releases","url":"downloads.html#_verifying_releases","body":"Verifying Releases 
","description":"","id":18445041},"19254915":{"title":"API & 
Implementation","url":"guides/rgsvc/rgsvc.html#_api_implementation_7","body":"API
 & Implementation  The API defined by Clock
 Service is:  This class (o.a.i.applib.services.clock.ClockService) is also the 
default implementation. The time provided by this default implementation is 
based on the system clock. ","description":" The API defined by ClockService 
is: ","id":19254915},"21190750":{"title":"Run the 
archetype","url":"pages/tg/tg.html#_run_the_archetype","body":"Run the 
archetype  Throughout this tutorial you can, if you wish, just checkout from 
the github repo wherever you see a \"git checkout\" note:  Run the simpleapp 
archetype to build an empty Isis application. With the *nix bash shell, use:  
Adjust as necessary if using Windows cmd.exe or Powershell.  This will generate 
the app in a petclinic directory. Move the contents back: ","description":" 
Throughout this tutorial you can, if you wish, just checkout from the github 
repo wherever you see a \"git checkout\" note: 
","id":21190750},"21212015":{"title":"Key 
features","url":"pages/powered-by/powered-by.html#_key_features","body":"Key 
features ","d
 escription":"","id":21212015},"21857601":{"title":"Other 
Guides","url":"guides/cgcom/cgcom.html#_other_guides","body":"Other Guides  
Apache Isis documentation is broken out into a number of user, reference and 
\"supporting procedures\" guides.  The user guides available are:  The 
reference guides are:  The remaining guides are:  This guide provides guidance 
for Apache Isis' own committers. ","description":" Apache Isis documentation is 
broken out into a number of user, reference and \"supporting procedures\" 
guides. 
","id":21857601},"23125949":{"title":"Editing","url":"guides/dg/dg.html#__dg_ide_intellij_hints-and-tips_editing","body":"Editing
 
","description":"","id":23125949},"23524101":{"title":"Collections","url":"guides/ugvw/ugvw.html#_collections","body":"Collections
  In the final row the collections are placed in tabs, simply one collection 
per tab. This corresponds to the following XML:  As with properties, actions 
can be associated with collections; this indicates that they 
 should be rendered in the collection’s header. ","description":" In the 
final row the collections are placed in tabs, simply one collection per tab. 
This corresponds to the following XML: 
","id":23524101},"26509816":{"title":"Commit 
changes","url":"guides/cgcom/cgcom.html#__cgcom_cutting-a-release_releasing-core_commit-changes","body":"Commit
 changes  Commit any changes from the preceding steps: ","description":" Commit 
any changes from the preceding steps: 
","id":26509816},"27806498":{"title":"renderedAsDayBefore()","url":"guides/rgant/rgant.html#_rgant-ParameterLayout_renderedAsDayBefore","body":"renderedAsDayBefore()
  The renderedAsDayBefore() attribute applies only to date parameters whereby 
the date will be rendered as the day before the value actually held in the 
domain object. It is ignored for parameters of other types. This attribute is 
also supported for properties.  This behaviour might at first glance appear 
odd, but the rationale is to support the use case of a sequen
 ce of instances that represent adjacent intervals of time. In such cases there 
would typically be startDate and endDate properties, eg for all of Q2. Storing 
this as a half-closed interval — eg [1-Apr-2015, 1-July-2015) — can 
substantially simplify internal algorithms; the endDate of one interval will 
correspond to the startDate of the next.  However, from an end-user perspective 
the requirement may be to render the interval as a fully closed interval; eg 
the end date should be shown as 30-Jun-2015.  This attribute therefore bridges 
the gap; it presents the information in a way that makes sense to an end-user, 
but also stores the domain object in a way that is easy work with internally.  
For example: ","description":" The renderedAsDayBefore() attribute applies only 
to date parameters whereby the date will be rendered as the day before the 
value actually held in the domain object. It is ignored for parameters of other 
types. This attribute is also supported for properties. ","id
 ":27806498},"27984599":{"title":"Graphviz 
diagrams","url":"guides/dg/dg.html#__markup-docs_asciidoc_graphviz","body":"Graphviz
 diagrams  Asciidoctor includes support for the ditaa, allowing boxes-and-lines 
diagrams to be easily sketched.  For example:  renders as: ","description":" 
Asciidoctor includes support for the ditaa, allowing boxes-and-lines diagrams 
to be easily sketched. ","id":27984599},"31857620":{"title":"Interacting with 
the 
services","url":"guides/rgsvc/rgsvc.html#_interacting_with_the_services","body":"Interacting
 with the services  Typically domain objects will have little need to interact 
with the CommandContext and Command directly; what is more useful is that these 
are persisted in support of the various use cases identified above.  One case 
however where a domain object might want to obtain the Command is to determine 
whether it has been invoked in the foreground, or in the background. It can do 
this using the getExecutedIn() method:  Although not often needed, 
 this then allows the domain object to access the Command object through the 
CommandContext service. To expand th above example:  If run in the background, 
it might then notify the user (eg by email) if all work is done.  This leads us 
onto a related point, distinguishing the current effective user vs the 
originating \"real\" user. When running in the foreground, the current user can 
be obtained from the UserService, using:  If running in the background, 
however, then the current user will be the credentials of the background 
process, for example as run by a Quartz scheduler job.  The domain object can 
still obtain the original (\"effective\") user that caused the job to be 
created, using: ","description":" Typically domain objects will have little 
need to interact with the CommandContext and Command directly; what is more 
useful is that these are persisted in support of the various use cases 
identified above. 
","id":31857620},"36734123":{"title":"Bug","url":"release-notes/release-no
 tes.html#_bug_8","body":"Bug 
","description":"","id":36734123},"39248326":{"title":"Runtime vs Noop 
implementation","url":"guides/rgfis/rgfis.html#_runtime_vs_noop_implementation","body":"Runtime
 vs Noop implementation  The framework provides two implementations:  The 
…​Default implementation takes priority over the …​Noop implementation. 
","description":" The framework provides two implementations: 
","id":39248326},"39290887":{"title":"Implementation","url":"guides/rgsvc/rgsvc.html#_implementation_22","body":"Implementation
  The core framework provides a default implementation of this service 
(o.a.i.core.metamodel.services.container.DomainObjectContainerDefault). 
","description":" The core framework provides a default implementation of this 
service (o.a.i.core.metamodel.services.container.DomainObjectContainerDefault). 
","id":39290887},"42240053":{"title":"Screenshots","url":"guides/ugvw/ugvw.html#_screenshots_9","body":"Screenshots
  The screenshot below shows the Isis addo
 ns example todoapp (not ASF) with a 'brand logo' image in its header:  A 
custom brand logo (typically larger) can also be specified for the signin page: 
","description":" The screenshot below shows the Isis addons example todoapp 
(not ASF) with a 'brand logo' image in its header: 
","id":42240053},"44021072":{"title":"Subsidiary 
Goals","url":"guides/rgcms/rgcms.html#_subsidiary_goals","body":"Subsidiary 
Goals  There are a number of subsidiary goals of the AppManifest class (though 
as of v1.13.0 these have not yet implemented): ","description":" There are a 
number of subsidiary goals of the AppManifest class (though as of v1.13.0 these 
have not yet implemented): ","id":44021072},"44483327":{"title":"New 
Feature","url":"release-notes/release-notes.html#_new_feature_17","body":"New 
Feature 
","description":"","id":44483327},"57327287":{"title":"cssClassFa()","url":"guides/rgant/rgant.html#_rgant-ViewModelLayout_cssClassFa","body":"cssClassFa()
  The cssClassFa() attribute is used to speci
 fy the name of a Font Awesome icon name, to be rendered as the domain 
object’s icon.  These attribute can also be applied to domain objects to 
specify the object’s icon, and to actions to specify an icon for the 
action’s representation as a button or menu item.  If necessary the icon 
specified can be overridden by a particular object instance using the 
iconName() method.  For example:  There can be multiple \"fa-\" classes, eg to 
mirror or rotate the icon. There is no need to include the mandatory fa 
\"marker\" CSS class; it will be automatically added to the list. The fa- 
prefix can also be omitted from the class names; it will be prepended to each 
if required.  The related cssClassFaPosition() attribute is currently unused 
for domain objects; the icon is always rendered to the left. ","description":" 
The cssClassFa() attribute is used to specify the name of a Font Awesome icon 
name, to be rendered as the domain object’s icon. 
","id":57327287},"64591190":{"title":"Interacti
 
onContext","url":"guides/rgsvc/rgsvc.html#_rgsvc_api_InteractionContext","body":"InteractionContext
  The InteractionContext is a request-scoped domain service that is used to 
obtain the current Interaction.  An Interaction generally consists of a single 
top-level Execution, either to invoke an action or to edit a property. If that 
top-level action or property uses WrapperFactory to invoke child 
actions/properties, then those sub-executions are captured as a call-graph. The 
Execution is thus a graph structure.  If a bulk action is performed (as per an 
action annotated using @Action#invokeOn()), then this will result in multiple 
Interactions, one per selected object (not one Interaction with multiple 
top-level Executions).  It is possible for Interaction.Executions to be 
persisted; this is supported by the (non-ASF) Isis addons' publishmq module, 
for example. Persistent Interactions support several use cases: 
","description":" The InteractionContext is a request-scoped domain service 
 that is used to obtain the current Interaction. 
","id":64591190},"64932464":{"title":"Other 
Guides","url":"guides/ugtst/ugtst.html#_other_guides","body":"Other Guides  
Apache Isis documentation is broken out into a number of user, reference and 
\"supporting procedures\" guides.  The user guides available are:  The 
reference guides are:  The remaining guides are: ","description":" Apache Isis 
documentation is broken out into a number of user, reference and \"supporting 
procedures\" guides. 
","id":64932464},"66604001":{"title":"@Programmatic","url":"guides/rgant/rgant.html#_rgant-Programmatic","body":"@Programmatic
 ","description":"","id":66604001},"68441589":{"title":"License 
headers","url":"guides/cgcom/cgcom.html#__cgcom_cutting-a-release_releasing-core_license-headers","body":"License
 headers  The Apache Release Audit Tool RAT (from the Apache Creadur project) 
checks for missing license header files. The parent pom.xml of each releasable 
module specifies the RAT Maven plugin, with
  a number of custom exclusions.  To run the RAT tool, use:  where 
rat.numUnapprovedLicenses property is set to a high figure, temporarily 
overriding the default value of 0. This will allow the command to run over all 
submodules, rather than failing after the first one. The command writes out a 
target\\rat.txt for each submodule. missing license notes are indicated using 
the key !???. The for command collates all the errors.  Investigate and fix any 
reported violations, typically by either:  To add missing headers, use the 
groovy script addmissinglicenses.groovy (in the scripts directory) to 
automatically insert missing headers for certain file types. The actual files 
checked are those with extensions specified in the line def fileEndings = 
[\".java\", \".htm\"]:  (If the -x is omitted then the script is run in \"dry 
run\" mode). Once you’ve fixed all issues, confirm once more that 
apache-rat-plugin no longer reports any license violations, this time leaving 
the rat.numUnapprovedLi
 censes property to its default, 0: ","description":" The Apache Release Audit 
Tool RAT (from the Apache Creadur project) checks for missing license header 
files. The parent pom.xml of each releasable module specifies the RAT Maven 
plugin, with a number of custom exclusions. 
","id":68441589},"73703450":{"title":"New 
Feature","url":"release-notes/release-notes.html#_new_feature_29","body":"New 
Feature ","description":"","id":73703450},"75054401":{"title":"Supporting 
Method 
Prefixes","url":"guides/rgcms/rgcms.html#_rgcms_methods_prefixes","body":"Supporting
 Method Prefixes  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.  This association is performed by name matching. Thus, a 
property called \"firstName\", derived from a method getFirstName() may have 
supporting methods hideFirstName(), disableFirstName() and
  validateFirstName(). Supporting methods are, therefore, each characterized by 
their own particular prefix.  The table below lists the method prefixes that 
are recognized as part of Apache Isis' default programming model. 
","description":" 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. ","id":75054401},"77231561":{"title":"Interaction 
Execution","url":"guides/rgcms/rgcms.html#_rgcms_schema-ixn","body":"Interaction
 Execution  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 WrapperFactory is used to execute 
sub-actions/property edits.  Each execution identifies the target object, the 
member to invoke, and the arguments. It also captures metrics about the 
execution, a
 nd the result of the execution (eg return value of an action invocation). 
","description":" 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 WrapperFactory is used 
to execute sub-actions/property edits. 
","id":77231561},"78112488":{"title":"Screencast","url":"guides/ugvw/ugvw.html#_screencast","body":"Screencast
  This screencast describes the feature. ","description":" This screencast 
describes the feature. ","id":78112488},"78624086":{"title":"Other 
Guides","url":"guides/ugsec/ugsec.html#_other_guides","body":"Other Guides  
Apache Isis documentation is broken out into a number of user, reference and 
\"supporting procedures\" guides.  The user guides available are:  The 
reference guides are:  The remaining guides are: ","description":" Apache Isis 
documentation is broken out into a number of user, reference and \"supporting 
procedures\" guide
 s. ","id":78624086},"83933647":{"title":"Persistence 
Concerns","url":"guides/ugbtb/ugbtb.html#_persistence_concerns","body":"Persistence
 Concerns 
","description":"","id":83933647},"84766875":{"title":"FixtureScriptsDefault","url":"guides/rgsvc/rgsvc.html#_rgsvc_api_FixtureScriptsDefault","body":"FixtureScriptsDefault
  The FixtureScriptsDefault service provides the ability to execute fixture 
scripts .  The service extends from the FixtureScripts, and is only 
instantiated by the framework if there no custom implementation of 
FixtureScripts has been otherwise provided; in other words it is a fallback.  
If this service is instantiated (as a fallback) then it uses the 
FixtureScriptsSpecificationProvider to obtain a FixtureScriptsSpecification. 
This configures this service, telling it which package to search for 
FixtureScript classes, how to execute those classes, and hints that influence 
the UI. ","description":" The FixtureScriptsDefault service provides the 
ability to execute fixture s
 cripts . 
","id":84766875},"85931482":{"title":"Task","url":"release-notes/release-notes.html#_task_24","body":"Task
 
","description":"","id":85931482},"87271564":{"title":"2004:","url":"pages/articles-and-presentations/articles-and-presentations.html#_2004","body":"2004:
 ","description":"","id":87271564},"89585884":{"title":"Security 
API","url":"guides/rgsvc/rgsvc.html#_rgsvc_api_DomainObjectContainer_security-api","body":"Security
 API  The security API allows the domain object to obtain the identity of the 
user interacting with said object.  where in turn (the essence of) UserMemento 
is:  and RoleMemento is simpler still:  The roles associated with the 
UserMemento will be based on the configured security (typically Shiro).  In 
addition, when using the Wicket viewer there will be an additional 
\"org.apache.isis.viewer.wicket.roles.USER\" role; this is used internally to 
restrict access to web pages without authenticating. ","description":" The 
security API allows the domain object to
  obtain the identity of the user interacting with said object. 
","id":89585884},"90561824":{"title":"Wicket 
Viewer","url":"release-notes/release-notes.html#_wicket_viewer_8","body":"Wicket
 Viewer ","description":"","id":90561824},"90935214":{"title":"Wicket 
Viewer","url":"release-notes/release-notes.html#_wicket_viewer_10","body":"Wicket
 Viewer ","description":"","id":90935214},"91902412":{"title":"The issue in 
more 
detail","url":"guides/ugodn/ugodn.html#_the_issue_in_more_detail","body":"The 
issue in more detail  Consider these entities (yuml.me/b8681268):  In the 
course of a transaction, the Agreement entity is loaded into memory (not 
necessarily modified), and then new AgreementRoles are associated to it.  All 
these entities implement Comparable using ObjectContracts, and the 
implementation of AgreementRole's (simplified) is:  while Agreement's is 
implemented as:  and Party's is similarly implemented as:  DataNucleus’s 
persistence-by-reachability algorithm adds the AgreementRol
 e instances into a SortedSet, which causes AgreementRole#compareTo() to fire:  
In other words, in figuring out whether AgreementRole requires the 
persistence-by-reachability algorithm to run, it causes the adjacent associated 
entity Party to also be retrieved. ","description":" Consider these entities 
(yuml.me/b8681268): ","id":91902412},"92467660":{"title":"API and 
Usage","url":"guides/ugtst/ugtst.html#_ugtst_fixture-scripts_api-and-usage","body":"API
 and Usage  There are two parts to using fixture scripts: the FixtureScripts 
domain service class, and the FixtureScript view model class:  Let’s look at 
FixtureScripts domain service in more detail first. ","description":" There are 
two parts to using fixture scripts: the FixtureScripts domain service class, 
and the FixtureScript view model class: 
","id":92467660},"96583162":{"title":"Configure toolchains 
plugin","url":"guides/cgcom/cgcom.html#_configure_toolchains_plugin","body":"Configure
 toolchains plugin  Apache Isis releases ar
 e built using Java 7, enforced using the maven toolchains plugin. Ensure that 
Java 7 is installed and the toolchains plugin is configured, as described in 
the contributors' guide. ","description":" Apache Isis releases are built using 
Java 7, enforced using the maven toolchains plugin. Ensure that Java 7 is 
installed and the toolchains plugin is configured, as described in the 
contributors' guide. 
","id":96583162},"98976996":{"title":"Bootstrapping","url":"guides/rgcms/rgcms.html#_bootstrapping","body":"Bootstrapping
  One of the primary goals of the AppManifest 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.  We strongly recommend using 
a myapp-app Maven module to hold the implementation of the AppManifest. This 
Maven module can then also hold dependencies which are common to both 
integration tests and the webapp, specifically the 
org.apache.isis.core:isis-core-runtime 
 and the org.apache.isis.core:isis-core-wrapper modules.  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 myapp-app module. This will allow the architectural layering of the 
overall application to be enforced by Maven.  What then remains is to update 
the bootstrapping code itself. ","description":" One of the primary goals of 
the AppManifest 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. ","id":98976996},"100682258":{"title":"Update 
dependencies","url":"guides/cgcom/cgcom.html#_update_dependencies","body":"Update
 dependencies  With the release complete, now is a good time to bump versions 
of dependencies (so that there is a full release cycle to identify any possible 
issues).  You will probably want to create a new JIRA ticket for thes
 e updates (or if minor then use the \"catch-all\" JIRA ticket raised earlier 
for the next release). ","description":" With the release complete, now is a 
good time to bump versions of dependencies (so that there is a full release 
cycle to identify any possible issues). 
","id":100682258},"102347041":{"title":"Bug","url":"release-notes/release-notes.html#_bug_10","body":"Bug
 ","description":"","id":102347041},"104167755":{"title":"How to implement a 
spellchecker?","url":"guides/ugbtb/ugbtb.html#_ugbtb_hints-and-tips_how-to-implement-a-spellchecker","body":"How
 to implement a spellchecker?  From this thread on the Apache Isis users 
mailing list:  One way to implement is to use the event bus:  if if the change 
is made through an edit, you can use @Property#domainEvent().  You’ll need 
some way to know which fields should be spell checked. Two ways spring to mind: 
 And you’ll (obviously) also need some sort of spell checker implementation 
to call. ","description":" From this thread on
  the Apache Isis users mailing list: 
","id":104167755},"105480253":{"title":"Visitor","url":"guides/ugbtb/ugbtb.html#__code_visitor_code","body":"Visitor
  More often than not, you’ll want to visit every element in the metamodel, 
and so for this you can instead subclass from 
MetaModelValidatorVisiting.Visitor:  You can then create your custom validator 
by subclassing MetaModelValidatorComposite and adding the visiting validator:  
If you have more than one rule then each can live in its own visitor. 
","description":" More often than not, you’ll want to visit every element in 
the metamodel, and so for this you can instead subclass from 
MetaModelValidatorVisiting.Visitor: ","id":105480253},"105873374":{"title":"JDO 
PersistenceManager","url":"guides/rgsvc/rgsvc.html#__rgsvc_api_IsisJdoSupport_jdo-persistencemanager","body":"JDO
 PersistenceManager  The functionality provided by IsisJdoSupport focus only on 
the most common use cases. If you require more flexibility than this, eg for dy
 namically constructed queries, then you can use the service to access the 
underlying JDO PersistenceManager API:  For example: ","description":" The 
functionality provided by IsisJdoSupport focus only on the most common use 
cases. If you require more flexibility than this, eg for dynamically 
constructed queries, then you can use the service to access the underlying JDO 
PersistenceManager API: 
","id":105873374},"106558909":{"title":"contributedAs()","url":"guides/rgant/rgant.html#_rgant-ActionLayout_contributedAs","body":"contributedAs()
  For a domain service action that can be contributed, the contributedAs() 
attribute determines how it is contributed: as an action or as an association 
(ie a property or collection).  The distinction between property or collection 
is automatic: if the action returns a java.util.Collection (or subtype) then 
the action is contributed as a collection; otherwise it is contributed as a 
property.  For a domain service action to be contributed, the domain s
 ervices must have a nature nature of either VIEW or VIEW_CONTRIBUTIONS_ONLY, 
and the action must have safe action semantics, and takes a single argument, 
namely the contributee domain object.  For example:  It’s also possible to 
use the attribute to suppress the action completely:  In such cases, though, it 
would probably make more sense to annotate the action as either hidden or 
indeed @Programmatic. ","description":" For a domain service action that can be 
contributed, the contributedAs() attribute determines how it is contributed: as 
an action or as an association (ie a property or collection). 
","id":106558909},"106606865":{"title":"Using the Wicket 
Viewer","url":"guides/rgcfg/rgcfg.html#_using_the_wicket_viewer","body":"Using 
the Wicket Viewer  Most of the you’re likely to run Apache Isis using the 
Wicket viewer. In this case Apache Isis' \"deployment type\" concept maps to 
Wicket’s \"configuration\" concept:  Wicket’s mechanism for specifying the 
\"configuration\" is t
 o use a context parameter in web.xml; Apache Isis automatically infers its own 
deployment type from this. In other words: ","description":" Most of the 
you’re likely to run Apache Isis using the Wicket viewer. In this case Apache 
Isis' \"deployment type\" concept maps to Wicket’s \"configuration\" concept: 
","id":106606865},"108721033":{"title":"Incode 
Catalog","url":"guides/ugfun/ugfun.html#_ugfun_available-domain-services_incode-catalog","body":"Incode
 Catalog  The Incode Catalog website also provides a number of reusable 
modules, focusing on business logic for generic subdomains.  This section 
surveys the functionality available.  The modules themselves fall into a number 
of broader groups:  Each of the modules has a full README and demo application 
demonstrating their usage. The sections below briefly outline the capabilities 
of these modules. ","description":" The Incode Catalog website also provides a 
number of reusable modules, focusing on business logic for generic subdo
 mains. 
","id":108721033},"109833874":{"title":"Persistable","url":"guides/rgcms/rgcms.html#_rgcms_classes_mixins_Persistable","body":"Persistable
  All domain entities automatically implement the DataNucleus Persistable role 
interface as a result of the enhancer process (the fully qualified class name 
is org.datanucleus.enhancement.Persistable). So as a developer you do not need 
to write any code to obtain the mixins that contribute to this interface. 
","description":" All domain entities automatically implement the DataNucleus 
Persistable role interface as a result of the enhancer process (the fully 
qualified class name is org.datanucleus.enhancement.Persistable). So as a 
developer you do not need to write any code to obtain the mixins that 
contribute to this interface. 
","id":109833874},"110978244":{"title":"Prerequisites","url":"guides/ugfun/ugfun.html#_prerequisites","body":"Prerequisites
  Apache Isis is a Java based framework, so in terms of prerequisites, you’ll 
need to insta
 ll:  You’ll probably also want to use an IDE; the Apache Isis committers use 
either IntelliJ or Eclipse; in the Developers' Guide we have detailed setup 
instructions for using these two IDEs. If you’re a NetBeans user you should 
have no problems as it too has strong support for Maven.  When building and 
running within an IDE, you’ll also need to configure the Datanucleus 
enhancer. This is implemented as a Maven plugin, so in the case of IntelliJ, 
it’s easy enough to run the enhancer as required. It should be just as 
straightforward for NetBeans too.  For Eclipse the maven integration story is a 
little less refined. All is not lost, however; DataNucleus also has an 
implementation of the enhancer as an Eclipse plugin, which usually works well 
enough. ","description":" Apache Isis is a Java based framework, so in terms of 
prerequisites, you’ll need to install: 
","id":110978244},"112375674":{"title":"Auditing","url":"migration-notes/migration-notes.html#_auditing","body":"Audi
 ting  The AuditingService SPI service has been deprecated, instead replaced by 
the AuditerService.  There can be more than one implementation of this new SPI, 
and a framework-provided implementation (AuditerServiceLogging) will log to a 
file. The (non-ASF) Isis addons' audit module also implements the new SPI. 
","description":" The AuditingService SPI service has been deprecated, instead 
replaced by the AuditerService. 
","id":112375674},"114685873":{"title":"Usage","url":"guides/rgsvc/rgsvc.html#_usage_19","body":"Usage
  To indicate that an action invocation should be published, annotate it with 
the @Action#publishing() annotation.  To indicate that an property edit should 
be published, annotate it with the @Property#publishing() annotation.  To 
indicate that a changed object should be published is to annotate it with the 
@DomainObject#publishing() annotation. ","description":" To indicate that an 
action invocation should be published, annotate it with the 
@Action#publishing() annot
 ation. ","id":114685873},"115229271":{"title":"Domain 
Entities","url":"guides/ugfun/ugfun.html#_ugfun_programming-model_domain-entities","body":"Domain
 Entities  Entities are persistent domain objects, with their persistence 
handled by JDO/DataNucleus. As such, they are mapped to a persistent object 
store, typically an RDBMS, with DataNucleus taking care of both lazy loading 
and also the persisting of modified (\"dirty\") objects.  Domain entities are 
generally decorated with both DataNucleus and Apache Isis annotations. Let’s 
look at some of the most commonly-used annotations.  To start with, entities 
are flagged as being \"persistence capable\", indicating how JDO/DataNucleus 
should manage their identity:  All domain entities will have some sort of 
mandatory key properties. The example below is a very simple case, where the 
entity is identified by a name property:  It’s also common for domain 
entities to have queries annotated on them. These are used by repository domain 
servi
 ces to query for instances of the entity:  DataNucleus provides several APIs 
for defining queries, including entirely programmatic and type-safe APIs; but 
JDOQL is very similar to SQL and so easily learnt.  The corresponding 
repository method for the above query is: ","description":" Entities are 
persistent domain objects, with their persistence handled by JDO/DataNucleus. 
As such, they are mapped to a persistent object store, typically an RDBMS, with 
DataNucleus taking care of both lazy loading and also the persisting of 
modified (\"dirty\") objects. ","id":115229271},"117553409":{"title":"Object 
Icon","url":"guides/ugfun/ugfun.html#_object_icon","body":"Object Icon  The 
icon is often the same for all instances of a particular class, and is picked 
up by convention.  It’s is also possible for an individual instance to return 
a custom icon, typically so that some significant state of that domain object 
is represented. For example, a custom icon could be used to represent a shipped 
 order, say, or an overdue library loan. ","description":" The icon is often 
the same for all instances of a particular class, and is picked up by 
convention. 
","id":117553409},"117778574":{"title":"ClockService","url":"guides/rgsvc/rgsvc.html#_rgsvc_api_ClockService","body":"ClockService
  Most applications deal with dates and times in one way or another. For 
example, if an Order is placed, then the Customer may have 30 days to pay the 
Invoice, otherwise a penalty may be levied.  However, such date/time related 
functionality can quickly complicate automated testing: \"today+30\" will be a 
different value every time the test is run.  Even disregarding testing, there 
may be a requirement to ensure that date/times are obtained from an NNTP server 
(rather than the system PC). While instantiating a java.util.Date to current 
the current time is painless enough, we would not want complex technical logic 
for querying an NNTP server spread around domain logic code.  Therefore it’s 
common to
  provide a domain service whose responsibility is to provide the current time. 
This service can be injected into any domain object (and can be mocked out for 
unit testing). Apache Isis provides such a facade through the ClockService. 
","description":" Most applications deal with dates and times in one way or 
another. For example, if an Order is placed, then the Customer may have 30 days 
to pay the Invoice, otherwise a penalty may be levied. 
","id":117778574},"121574190":{"title":"Related 
Services","url":"guides/rgsvc/rgsvc.html#_related_services_18","body":"Related 
Services  The ActionInteractionContext service allows bulk actions to 
co-ordinate with each other.  The QueryResultsCache is useful for caching the 
results of expensive method calls. ","description":" The 
ActionInteractionContext service allows bulk actions to co-ordinate with each 
other. ","id":121574190},"121879267":{"title":"Wicket 
Viewer","url":"release-notes/release-notes.html#_wicket_viewer_2","body":"Wicket
 Viewer 
 
","description":"","id":121879267},"122762699":{"title":"Contributee","url":"guides/rgcms/rgcms.html#_rgcms_classes_contributee","body":"Contributee
  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. ","description":" 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. 
","id":122762699},"125299345":{"title":"Example","url":"guides/rgant/rgant.html#_example_2","body":"Example
  This example is taken from the (non-ASF) Isis addons' todoapp: 
","description":" This example is taken from the (non-ASF) Isis addons' 
todoapp: ","id":125299345},"125961908":{"title":"Do 
it!","url":"pages/tg/tg.html#_do_it","body":"Do it! 
","description":"","id":125961908},"134804772":{"title":"How to handle 
void/null results","url":"guides/ugbtb
 
/ugbtb.html#_ugbtb_hints-and-tips_how-to-handle-void-and-null-results","body":"How
 to handle void/null results  From this thread on the Apache Isis users mailing 
list:  One way to implement this idea is to provide a custom implementation of 
the RoutingService SPI domain service. The default implementation will either 
return the current object (if not null), else the home page (as defined by 
@HomePage) if one exists.  The following custom implementation refines this to 
use the breadcrumbs (available in the Wicket viewer) to return the first 
non-deleted domain object found in the list of breadcrumbs:  Note that the 
above implementation uses Java 8, so if you are using Java 7 then you’ll need 
to backport accordingly. ","description":" From this thread on the Apache Isis 
users mailing list: ","id":134804772},"140760147":{"title":"Isis Add-on 
modules","url":"guides/ugvw/ugvw.html#_isis_add_on_modules","body":"Isis Add-on 
modules  Some of the (non-ASF) Isis Addons modules also provide s
 ervices whose actions appear in top-level menus.  The security's module places 
its domain service menus in three top-level menus:  Meanwhile the devutils 
module places its actions - to download layouts and so forth - on a 
\"Prototyping\" top-level menu, on the SECONDARY menu bar.  Currently there is 
no facility to alter the placement of these services. However, their UI can be 
suppressed using security or using a vetoing subscriber. ","description":" Some 
of the (non-ASF) Isis Addons modules also provide services whose actions appear 
in top-level menus. ","id":140760147},"145340696":{"title":"Registering the 
Services","url":"guides/rgsvc/rgsvc.html#_registering_the_services_20","body":"Registering
 the Services  The (non-ASF) Isis addons' audit module provides an 
implementation of this service (AuditingService), and also provides a number of 
related domain services (AuditingServiceMenu, AuditingServiceRepository and 
AuditingServiceContributions).  Assuming that an AppManifest is bein
 g used to bootstrap the app) then this can be activated by updating the 
pom.xml and updating the AppManifest#getModules() method.  If menu items or 
contributions are not required in the UI, these can be suppressed either using 
security or by implementing a vetoing subscriber. ","description":" The 
(non-ASF) Isis addons' audit module provides an implementation of this service 
(AuditingService), and also provides a number of related domain services 
(AuditingServiceMenu, AuditingServiceRepository and 
AuditingServiceContributions). ","id":145340696},"148135206":{"title":"Layout 
Metadata Reader 
(deprecated)","url":"guides/ugbtb/ugbtb.html#_ugbtb_programming-model_layout-metadata-reader","body":"Layout
 Metadata Reader (deprecated)  The metadata for domain objects is obtained both 
annotations and files. There is also deprecated support for reading layouts 
from .layout.json files. This service provides an SPI (and default 
implementation) for reading layouts defined in this fashion. ","descr
 iption":" The metadata for domain objects is obtained both annotations and 
files. There is also deprecated support for reading layouts from .layout.json 
files. This service provides an SPI (and default implementation) for reading 
layouts defined in this fashion. 
","id":148135206},"151718660":{"title":"Specifying 
components","url":"guides/rgcfg/rgcfg.html#_rgcfg_configuring-components","body":"Specifying
 components 
","description":"","id":151718660},"153666205":{"title":"Implementation","url":"guides/rgsvc/rgsvc.html#_implementation_17","body":"Implementation
  The core framework provides a default implementation of this service 
(o.a.i.core.metamodel.services.title.TitleServiceDefault). ","description":" 
The core framework provides a default implementation of this service 
(o.a.i.core.metamodel.services.title.TitleServiceDefault). 
","id":153666205},"155655500":{"title":"@PrimaryKey 
(javax.jdo)","url":"guides/rgant/rgant.html#_rgant-PrimaryKey","body":"@PrimaryKey
 (javax.jdo) ","descrip
 tion":"","id":155655500},"158069558":{"title":"Usability: 
Defaults","url":"pages/tg/tg.html#_usability_defaults","body":"Usability: 
Defaults  Quick detour: often we want to set up defaults to go with choices. 
Sensible defaults for action parameters can really improve the usability of the 
app. ","description":" Quick detour: often we want to set up defaults to go 
with choices. Sensible defaults for action parameters can really improve the 
usability of the app. 
","id":158069558},"158897592":{"title":"Refactoring","url":"guides/dg/dg.html#__dg_ide_intellij_hints-and-tips_refactoring","body":"Refactoring
  Loads of good stuff on the Refactor menu; most used are:  If you can’t 
remember all those shortcuts, just use ctrl-shift-alt-T (might want to rebind 
that to something else!) and get a context-sensitive list of refactorings 
available for the currently selected object ","description":" Loads of good 
stuff on the Refactor menu; most used are: 
","id":158897592},"160872749":{"title":"Rela
 ted 
Services","url":"guides/rgfis/rgfis.html#_related_services","body":"Related 
Services  The default implementation of ContentNegotiationService delegates to 
ContentMappingService (if present) to convert domain entities into a stable 
form (eg DTO).  The ContentNegotiationService is itself called by the (default 
implementation of) RepresentationService. ","description":" The default 
implementation of ContentNegotiationService delegates to ContentMappingService 
(if present) to convert domain entities into a stable form (eg DTO). 
","id":160872749},"163915714":{"title":"web.xml","url":"migration-notes/migration-notes.html#_web_xml","body":"web.xml
  In the web.xml, the \"isis.viewers\" context-param is now ignored. Instead 
the viewer_wicket.properties and viewer_restfulobjects.properties will both be 
loaded if present (but neither need be present). ","description":" In the 
web.xml, the \"isis.viewers\" context-param is now ignored. Instead the 
viewer_wicket.properties and viewer_restful
 objects.properties will both be loaded if present (but neither need be 
present). ","id":163915714},"166045728":{"title":"Sanity 
Check","url":"guides/cgcom/cgcom.html#_sanity_check_2","body":"Sanity Check  
Ensure that the framework builds ok using the same command that your CI server 
is set up to execute (see section above). ","description":" Ensure that the 
framework builds ok using the same command that your CI server is set up to 
execute (see section above). ","id":166045728},"166899251":{"title":"Installing 
and Setting 
up","url":"guides/dg/dg.html#__dg_ide_intellij_installing","body":"Installing 
and Setting up  This section covers installation and setup. These 
notes/screenshots were prepared using IntelliJ Community Edition 14.1.x, but 
are believed to be compatible with more recent versions/other editions of the 
IDE. ","description":" This section covers installation and setup. These 
notes/screenshots were prepared using IntelliJ Community Edition 14.1.x, but 
are believed to be c
 ompatible with more recent versions/other editions of the IDE. 
","id":166899251},"167039338":{"title":"Task","url":"release-notes/release-notes.html#_task_14","body":"Task
 
","description":"","id":167039338},"169081251":{"title":"Interaction","url":"guides/rgsvc/rgsvc.html#__code_interaction_code","body":"Interaction
  The public API of the Interaction class consists of:  This class is concrete 
(is also the implementation). ","description":" The public API of the 
Interaction class consists of: ","id":169081251},"174738887":{"title":"Related 
functionality","url":"guides/ugvw/ugvw.html#_related_functionality_2","body":"Related
 functionality  The Recent Pages also lists recently visited pages, selected 
from a drop-down. ","description":" The Recent Pages also lists recently 
visited pages, selected from a drop-down. 
","id":174738887},"175028546":{"title":"Implementation","url":"guides/rgsvc/rgsvc.html#_implementation_5","body":"Implementation
  The framework provides a default implementati
 on of this service, namely GridLoaderServiceDefault. This implementation loads 
the grid from its serialized representation as a .layout.xml file, loaded from 
the classpath.  For example, the layout for a domain class 
com.mycompany.myapp.Customer would be loaded from 
com/mycompany/myapp/Customer.layout.xml. ","description":" The framework 
provides a default implementation of this service, namely 
GridLoaderServiceDefault. This implementation loads the grid from its 
serialized representation as a .layout.xml file, loaded from the classpath. 
","id":175028546},"175197970":{"title":"Performance 
tuning","url":"pages/tg/tg.html#_performance_tuning","body":"Performance tuning 
 The QueryResultsCache (request-scoped) domain service allows arbitrary objects 
to be cached for the duration of a request.  This can be helpful for \"naive\" 
code which would normally make the same query within a loop. ","description":" 
The QueryResultsCache (request-scoped) domain service allows arbitrary objects 
to b
 e cached for the duration of a request. 
","id":175197970},"176767338":{"title":"Command and 
Events","url":"guides/rgsvc/rgsvc.html#__rgsvc_intro_commands-and-events","body":"Command
 and Events  A good number of the domain services manage the execution of 
action invocations/property edits, along with the state of domain objects that 
are modified as a result of these. These services capture information which can 
then be used for various purposes, most notably for auditing or for publishing 
events, or for deferring execution such that the execution be performed in the 
background at some later date.  The diagram below shows how these services fit 
together. The outline boxes are services while the coloured boxes represent 
data structures - defined in the applib and therefore accessible to domain 
applications - which hold various information about the executions.  To 
explain:  Implementations of CommandService can use the Command#getMemento() 
method to obtain a XML equivalent of that Comm
 and, reified using the cmd.xsd schema. This can be converted back into a 
CommandDto using the CommandDtoUtils utility class (part of the applib).  
Similarly, implementations of PublisherService can use the InteractionDtoUtils 
utility class to obtain a InteractionDto representing the interaction, either 
just for a single execution or for the entire call-graph. This can be converted 
into XML in a similar fashion.  Likewise, the PublishedObjects class passed to 
the PublisherService at the end of the interaction provides the 
PublishedObjects#getDto() method which returns a ChangesDto instance. This can 
be converted into XML using the ChangesDtoUtils utility class.  One final 
point: multiple PublisherService implementations are supported because 
different implementations may have different responsibilities. For example, the 
(non-ASF) Isis addons' publishmq module is responsible for publishing messages 
onto an ActiveMQ event bus, for inter-system communication. However, the SPI 
can also b
 e used for profiling; each execution within the call-graph contains metrics of 
the number of objects loaded or modified as a result of that execution, and 
thus could be used for application profiling. The framework provides a default 
PublisherServiceLogging implementation that logs this using SLF4J. 
","description":" A good number of the domain services manage the execution of 
action invocations/property edits, along with the state of domain objects that 
are modified as a result of these. These services capture information which can 
then be used for various purposes, most notably for auditing or for publishing 
events","id":176767338},"178125062":{"title":"domainEvent()","url":"guides/rgant/rgant.html#_rgant-Action_domainEvent","body":"domainEvent()
  Whenever a domain object (or list of domain objects) is to be rendered, the 
framework fires off multiple domain events for every property, collection and 
action of the domain object. In the cases of the domain object’s actions, the 
eve
 nts that are fired are:  Subscribers subscribe through the EventBusService 
using either Guava or Axon Framework annotations and can influence each of 
these phases.  By default the event raised is ActionDomainEvent.Default. For 
example:  The domainEvent() attribute allows a custom subclass to be emitted 
allowing more precise subscriptions (to those subclasses) to be defined 
instead. This attribute is also supported for collections and properties.  For 
example:  The benefit is that subscribers can be more targeted as to the events 
that they subscribe to. ","description":" Whenever a domain object (or list of 
domain objects) is to be rendered, the framework fires off multiple domain 
events for every property, collection and action of the domain object. In the 
cases of the domain object’s actions, the events that are fired are: 
","id":178125062},"180783343":{"title":"TranslatableException","url":"guides/ugbtb/ugbtb.html#__code_translatableexception_code","body":"TranslatableException
 
  Another mechanism by which messages can be rendered to the user are as the 
result of exception messages thrown and recognized by an ExceptionRecognizer.  
In this case, if the exception implements TranslatableException, then the 
message will automatically be translated before being rendered. The 
TranslatableException itself takes the form: ","description":" Another 
mechanism by which messages can be rendered to the user are as the result of 
exception messages thrown and recognized by an ExceptionRecognizer. 
","id":180783343},"183226640":{"title":"updatedLifecycleEvent()","url":"guides/rgant/rgant.html#_rgant-DomainObject_updatedLifecycleEvent","body":"updatedLifecycleEvent()
  Whenever a (persistent) domain object has been modified and has been updated 
in the database, an \"updated\" lifecycle event is fired.  Subscribers 
subscribe through the EventBusService and can use the event to obtain a 
reference to the domain object.  By default the event raised is 
ObjectUpdatedEvent.Default. 
 For example:  The purpose of the updatedLifecycleEvent() attribute is to 
allows a custom subclass to be emitted instead. A similar attribute is 
available for other lifecycle events.  For example:  The benefit is that 
subscribers can be more targeted as to the events that they subscribe to. 
","description":" Whenever a (persistent) domain object has been modified and 
has been updated in the database, an \"updated\" lifecycle event is fired. 
","id":183226640},"188123644":{"title":"2013","url":"pages/articles-and-presentations/articles-and-presentations.html#_2013","body":"2013
 
","description":"","id":188123644},"189180810":{"title":"HoldsUpdatedAt","url":"guides/rgcms/rgcms.html#_rgcms_classes_roles_HoldsUpdatedAt","body":"HoldsUpdatedAt
  The HoldsUpdatedAt role interface allows the (framework-provided) 
TimestampService to update each object with the current timestamp whenever it 
is modified in a transaction.  The interface is defined as:  The current time 
is obtained from the ClockSe
 rvice.  Entities that implement this interface often also implement 
HoldsUpdatedBy role interface; as a convenience the Timestampable interface 
combines the two roles. ","description":" The HoldsUpdatedAt role interface 
allows the (framework-provided) TimestampService to update each object with the 
current timestamp whenever it is modified in a transaction. 
","id":189180810},"191180113":{"title":"persistence.xml","url":"guides/ugodn/ugodn.html#_ugodn_configuring_persistence-xml","body":"persistence.xml
  DataNucleus will for itself also and read the META-INF/persistence.xml. In 
theory it can hold mappings and even connection strings. However, with Apache 
Isis we tend to use annotations instead and externalize connection strings. so 
its definition is extremely simply, specifying just the name of the 
\"persistence unit\".  Here’s the one provided by the SimpleApp archetype:  
Normally all one needs to do is to change the persistence-unit name.  See 
DataNucleus' documentation on persis
 tence.xml to learn more. ","description":" DataNucleus will for itself also 
and read the META-INF/persistence.xml. In theory it can hold mappings and even 
connection strings. However, with Apache Isis we tend to use annotations 
instead and externalize connection strings. so its definition is extremely 
simply, specifying just the name of the \"persistence 
unit","id":191180113},"193237835":{"title":"Core","url":"release-notes/release-notes.html#_core_8","body":"Core
 ","description":"","id":193237835},"193497711":{"title":"UI 
Hints","url":"guides/ugfun/ugfun.html#_ugfun_ui-hints","body":"UI Hints 
","description":"","id":193497711},"194608562":{"title":"SPI","url":"guides/rgsvc/rgsvc.html#_spi_19","body":"SPI
  The SudoService.Spi service allows implementations of SudoService to notify 
other services/components that the effective user and roles are different. The 
default implementation of UserService has been refactored to leverage this SPI. 
 The names of these methods were chosen based 
 on similar names within Shiro. ","description":" The SudoService.Spi service 
allows implementations of SudoService to notify other services/components that 
the effective user and roles are different. The default implementation of 
UserService has been refactored to leverage this SPI. 
","id":194608562},"195374240":{"title":"Update the LDAP committee (if a PMC 
member)","url":"guides/cgcom/cgcom.html#_update_the_ldap_committee_if_a_pmc_member","body":"Update
 the LDAP committee (if a PMC member)  (Assuming that the new committer is a 
PMC member), also add them as to the PMC committee. This takes two steps:  The 
new committer does not officially become a member of the PMC until the ASF 
records have been updated. ","description":" (Assuming that the new committer 
is a PMC member), also add them as to the PMC committee. This takes two steps: 
","id":195374240},"195848147":{"title":"ICLA, obtain new 
account","url":"guides/cgcom/cgcom.html#_icla_obtain_new_account","body":"ICLA, 
obtain new acc
 ount  If required (that is, if the committer is not already a committer for a 
different ASF project), then ask them to complete an ICLA. As a result of this, 
they should also get an @apache.org user name.  More info can be found in the 
ASF new committers guide. ","description":" If required (that is, if the 
committer is not already a committer for a different ASF project), then ask 
them to complete an ICLA. As a result of this, they should also get an 
@apache.org user name. ","id":195848147},"198329644":{"title":"Strings 
(Length)","url":"guides/ugfun/ugfun.html#__ugfun_programming-model_properties_datatypes_strings","body":"Strings
 (Length)  By default JDO/DataNucleus will map string properties to a 
VARCHAR(255). To limit the length, use the @Column(length=…​) annotation.  
For example:  This is a good example of a case where Apache Isis infers domain 
semantics from the JDO annotation. ","description":" By default JDO/DataNucleus 
will map string properties to a VARCHAR(255). To l
 imit the length, use the @Column(length=…​) annotation. 
","id":198329644},"198382465":{"title":"Actions","url":"pages/tg/tg.html#_actions","body":"Actions
  Most business functionality is implemented using actions basically a public 
method accepting domain classes and primitives as its parameter types. The 
action can return a domain entity, or a collection of entities, or a 
primitive/String/value, or void. If a domain entity is returned then that 
object is rendered immediately; if a collection is returned then the Wicket 
viewer renders a table. Such collections are sometimes called \"standalone\" 
collections. ","description":" Most business functionality is implemented using 
actions basically a public method accepting domain classes and primitives as 
its parameter types. The action can return a domain entity, or a collection of 
entities, or a primitive/String/value, or void. If a domain entity is returned 
then that object is rendered","id":198382465},"203208629":{"title":"New Fea
 ture","url":"release-notes/release-notes.html#_new_feature_18","body":"New 
Feature ","description":"","id":203208629},"204452611":{"title":"Related 
services","url":"guides/rgsvc/rgsvc.html#_related_services_15","body":"Related 
services  The ConfigurationServiceMenu exposes the allConfigurationProperties 
action in the user interface. ","description":" The ConfigurationServiceMenu 
exposes the allConfigurationProperties action in the user interface. 
","id":204452611},"207811701":{"title":"API","url":"guides/rgsvc/rgsvc.html#_api_2","body":"API
  The API of TitleService is: ","description":" The API of TitleService is: 
","id":207811701},"209853740":{"title":"To 
run","url":"guides/rgmvn/rgmvn.html#_to_run","body":"To run  The plugin is 
activated by default, so is run simply using:  This will run any tests, and 
then also - because the plugin is activated by the isis-validate property and 
bound to the test phase, will run the plugin’s validate goal.  If for any 
reason you want to disable 
 the validation, use: ","description":" The plugin is activated by default, so 
is run simply using: 
","id":209853740},"210078000":{"title":"MetaModelService3","url":"guides/rgsvc/rgsvc.html#_rgsvc_api_MetaModelService","body":"MetaModelService3
  The MetaModelService3 service provides access to a number of aspects of 
Apache Isis' internal metamodel. ","description":" The MetaModelService3 
service provides access to a number of aspects of Apache Isis' internal 
metamodel. ","id":210078000},"216231183":{"title":"Raising a pull 
request","url":"guides/dg/dg.html#_raising_a_pull_request","body":"Raising a 
pull request  If you have your own fork, you can now simply push the changes 
you’ve made locally to your fork:  This will create a corresponding branch in 
the remote github repo. If you use gitk --all, you’ll also see a 
remotes/origin/ISIS-123-blobs branch.  Then, use github to raise a pull 
request. Pull requests sent to the Apache GitHub repositories will forward a 
pull request e-mail
  to the dev mailing list. You’ll probably want to sign up to the dev mailing 
list first before issuing your first pull request (though that isn’t 
mandatory).  The process to raise the pull request, broadly speaking: 
","description":" If you have your own fork, you can now simply push the 
changes you’ve made locally to your fork: 
","id":216231183},"220685197":{"title":"AbstractSubscriber","url":"guides/rgcms/rgcms.html#_rgcms_classes_super_AbstractSubscriber","body":"AbstractSubscriber
  This is a convenience superclass for creating subscriber domain services on 
the EventBusService. It uses @PostConstruct and @PreDestroy callbacks to 
automatically register/unregister itself with the EventBusService.  It’s 
important that subscribers register before any domain services that might emit 
events on the EventBusService. For example, the (non-ASF) Isis addons' security 
module provides a domain service that automatically seeds certain domain 
entities; these will generate lifecycle even
 ts and so any subscribers must be registered before such seed services. The 
easiest way to do this is to use the @DomainServiceLayout#menuOrder() 
attribute.  As a convenience, the AbstractSubscriber specifies this attribute. 
","description":" This is a convenience superclass for creating subscriber 
domain services on the EventBusService. It uses @PostConstruct and @PreDestroy 
callbacks to automatically register/unregister itself with the EventBusService. 
","id":220685197},"221961571":{"title":"Release prepare \"dry 
run\"","url":"guides/cgcom/cgcom.html#__cgcom_cutting-a-release_releasing-core_release-prepare-dry-run","body":"Release
 prepare \"dry run\"  Most of the work is done using the mvn release:prepare 
goal. Since this makes a lot of changes, we run it first in \"dry run\" mode; 
only if that works do we run the goal for real.  Run the dry-run as follows:  
You may be prompted for the gpg passphrase. ","description":" Most of the work 
is done using the mvn release:prepare goal. S
 ince this makes a lot of changes, we run it first in \"dry run\" mode; only if 
that works do we run the goal for real. 
","id":221961571},"224301547":{"title":"IsisWebAppBootstrapper","url":"guides/ugbtb/ugbtb.html#__code_isiswebappbootstrapper_code","body":"IsisWebAppBootstrapper
  The IsisWebAppBootstrapper servlet context listener bootstraps the shared 
(global) metadata for the Apache Isis framework. This listener is not required 
(indeed must not be configured) if the Wicket viewer is in use.  Its definition 
is:  Its context parameters are: ","description":" The IsisWebAppBootstrapper 
servlet context listener bootstraps the shared (global) metadata for the Apache 
Isis framework. This listener is not required (indeed must not be configured) 
if the Wicket viewer is in use. 
","id":224301547},"227377078":{"title":"Initialization","url":"guides/ugfun/ugfun.html#_ugfun_programming-model_domain-services_initialization","body":"Initialization
  Services can optionally declare lifecycle call
 backs to initialize them (when the app is deployed) and to shut them down 
(when the app is undeployed).  An Apache Isis session is available when 
initialization occurs (so services can interact with the object store, for 
example).  The framework will call any public method annotated with 
@PostConstruct with either no arguments of an argument of type 
Map<String,String>. In the latter case, the framework passes in the 
configuration (isis.properties and any other component-specific configuration 
files).  Shutdown is similar; the framework will call any method annotated with 
@PreDestroy. ","description":" Services can optionally declare lifecycle 
callbacks to initialize them (when the app is deployed) and to shut them down 
(when the app is undeployed). 
","id":227377078},"228550183":{"title":"Policies","url":"guides/cgcom/cgcom.html#_cgcom_policies","body":"Policies
 ","description":"","id":228550183},"229025509":{"title":"Remove references to 
isis-viewer-wicket parent pom.","url":"migrat
 
ion-notes/migration-notes.html#_remove_references_to_code_isis_viewer_wicket_code_parent_pom","body":"Remove
 references to isis-viewer-wicket parent pom.  In earlier releases the Wicket 
viewer defined its own parent pom.xml for dependency management and its 
dependencies and to declare the various submodules that make up the viewer. 
This pom.xml has now been incorporated into the parent pom.xml for the Core 
framework.  Therefore, in the parent pom.xml of your own domain applications, 
remove: ","description":" In earlier releases the Wicket viewer defined its own 
parent pom.xml for dependency management and its dependencies and to declare 
the various submodules that make up the viewer. This pom.xml has now been 
incorporated into the parent pom.xml for the Core framework. 
","id":229025509},"231532971":{"title":"From v1.7.0 to 
1.8.0","url":"migration-notes/migration-notes.html#_release-notes_migration-notes_1.7.0-to-1.8.0","body":"From
 v1.7.0 to 1.8.0 ","description":"","id":231532971},
 "232471644":{"title":"Registering 
Subscribers","url":"guides/rgsvc/rgsvc.html#_registering_subscribers","body":"Registering
 Subscribers  The register() method should be called in the @PostConstruct 
lifecycle method. It is valid and probably the least confusing to readers to 
also \"unregister\" in the @PreDestroy lifecycle method (though as noted above, 
unregistering is actually a no-op).  For example:  This works for both 
singleton (application-scoped) and also @RequestScoped domain services. 
","description":" The register() method should be called in the @PostConstruct 
lifecycle method. It is valid and probably the least confusing to readers to 
also \"unregister\" in the @PreDestroy lifecycle method (though as noted above, 
unregistering is actually a no-op). 
","id":232471644},"235512052":{"title":"Usage","url":"guides/rgsvc/rgsvc.html#_usage_21","body":"Usage
  The usage will vary depending upon the conventions of the design. As of 
1.9.0, the usage of the service has been centralize
 d such that the packages to be scanned are located from the AppManifest's 
#getModules() method.  For example, the SimpleApp archetype's app manifest 
includes:  where the three module classes in effect define three different 
package prefixes to search under (for domain services, fixture scripts and 
persistent entities).  Other usages of the ClassDiscoveryService are likely to 
work in a similar way, requiring some sort of scope to be specified. 
","description":" The usage will vary depending upon the conventions of the 
design. As of 1.9.0, the usage of the service has been centralized such that 
the packages to be scanned are located from the AppManifest's #getModules() 
method. 
","id":235512052},"238546442":{"title":"rebuildMetamodel()","url":"guides/rgcms/rgcms.html#__rgcms_classes_mixins_Object_rebuildMetamodel","body":"rebuildMetamodel()
  The Object_rebuildMetamodel mixin provides the ability to discard the current 
internal metamodel data (an instance of ObjectSpecification) 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: 
","description":" The Object_rebuildMetamodel mixin provides the ability to 
discard the current internal metamodel data (an instance of 
ObjectSpecification) 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: ","id":238546442},"238979657":{"title":"New 
Feature","url":"release-notes/release-notes.html#_new_feature_22","body":"New 
Feature 
","description":"","id":238979657},"240026998":{"title":"Improvement","url":"release-notes/release-notes.html#_improvement_14","body":"Improvement
 
","description":"","id":240026998},"242030985":{"title":"1.4.0","url":"release-notes/release-notes.html#_release-notes_1.4.0","body":"1.4.0
 
","description":"","id":242030985},"243439147":{"title":"hidden()","url":"guides/rgant/rgant.html#_rgant-Property_hidden","body"
 :"hidden()  Properties can be hidden at the domain-level, indicating that they 
are not visible to the end-user. This attribute can also be applied to actions 
and collections.  For example:  The acceptable values for the where parameter 
are:  For example, if a property is annotated with @Title, then normally this 
should be hidden from all tables. Annotating with 
@Property(where=Where.NOWHERE) overrides this. ","description":" Properties can 
be hidden at the domain-level, indicating that they are not visible to the 
end-user. This attribute can also be applied to actions and collections. 
","id":243439147},"243876171":{"title":"Task","url":"release-notes/release-notes.html#_task_28","body":"Task
 ","description":"","id":243876171},"246275568":{"title":"Registering the 
Services","url":"guides/rgsvc/rgsvc.html#_registering_the_services_4","body":"Registering
 the Services  Assuming that the configuration-and-annotation services 
installer is configured (implicit if using the AppManifest to b
 ootstrap the app), then the default implementation of GridLoaderService is 
automatically registered and injected, and no further configuration is 
required.  To use an alternative implementation, use 
@DomainServiceLayout#menuOrder() (as explained in the introduction to this 
guide). ","description":" Assuming that the configuration-and-annotation 
services installer is configured (implicit if using the AppManifest to 
bootstrap the app), then the default implementation of GridLoaderService is 
automatically registered and injected, and no further configuration is 
required. ","id":246275568},"246409050":{"title":"Using system 
properties","url":"guides/ugbtb/ugbtb.html#_using_system_properties","body":"Using
 system properties  The servlet context initializer will search for any system 
properties called isis.xxx and if present will use them as overrides.  Thus, an 
alternative option for a Docker image is to bootstrap the servlet container 
(Tomcat, Jetty) with appropriate system properties s
 et up. For example, with Tomcat this can be done by writing into the 
conf/catalina.properties file (see for example this stackoverflow post).  The 
Docker’s ENTRYPOINT therefore just needs to parse the Docker container’s 
own command line arguments and use to create this file. ","description":" The 
servlet context initializer will search for any system properties called 
isis.xxx and if present will use them as overrides. 
","id":246409050},"251015067":{"title":"myapp-dom 
Module","url":"migration-notes/migration-notes.html#__code_myapp_dom_code_module","body":"myapp-dom
 Module  In your myapp-dom module (containing definitions of your persistent 
entities and domain services), create an empty class to represent the module. 
This should be at the root package for the domain, eg:  Since there is no 
requirement to actually instantiate this class (it merely provides the location 
of the myapp.dom package), we give it a private constructor.  If you have any 
other modules where you have eithe
 r domain services or entities, similarly create an empty \"module\" class. 
","description":" In your myapp-dom module (containing definitions of your 
persistent entities and domain services), create an empty class to represent 
the module. This should be at the root package for the domain, eg: 
","id":251015067},"255768608":{"title":"Multi-tenancy 
support","url":"pages/isis-in-pictures/isis-in-pictures.html#_multi_tenancy_support","body":"Multi-tenancy
 support  Of the various Isis Addons, the security module has the most 
features. One significant feature is the ability to associate users and objects 
with a \"tenancy\". The todoapp uses this feature so that different users' list 
of todo items are kept separate from one another. A user with administrator is 
able to switch their own \"tenancy\" to the tenancy of some other user, in 
order to access the objects in that tenancy:  For more details, see the 
security module README. ","description":" Of the various Isis Addons, the 
security mod
 ule has the most features. One significant feature is the ability to associate 
users and objects with a \"tenancy\". The todoapp uses this feature so that 
different users' list of todo items are kept separate from one another. A user 
with administrator 
is","id":255768608},"255908905":{"title":"GridLoaderService","url":"guides/rgsvc/rgsvc.html#_rgsvc_spi_GridLoaderService","body":"GridLoaderService
  The GridLoaderService provides the ability to load the XML layout (grid) for 
a domain class. ","description":" The GridLoaderService provides the ability to 
load the XML layout (grid) for a domain class. 
","id":255908905},"257661017":{"title":"AppManifest 
(bootstrapping)","url":"guides/rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping","body":"AppManifest
 (bootstrapping)  This section describes how to implement the AppManifest 
interface to bootstrap both an Apache Isis web application, and also its 
integration tests. ","description":" This section describes how to implement 
the Ap
 pManifest interface to bootstrap both an Apache Isis web application, and also 
its integration tests. ","id":257661017},"259358868":{"title":"Hints and 
Tips","url":"guides/ugodn/ugodn.html#_ugodn_hints-and-tips","body":"Hints and 
Tips 
","description":"","id":259358868},"266250802":{"title":"Implementation","url":"guides/rgsvc/rgsvc.html#_implementation_2","body":"Implementation
  The (non-ASF) Isis addons' kitchensink app provides an example 
implementation:  which is rendered as: ","description":" The (non-ASF) Isis 
addons' kitchensink app provides an example implementation: 
","id":266250802},"267695496":{"title":"Building Apache 
Isis","url":"guides/dg/dg.html#_dg_building-isis","body":"Building Apache Isis 
","description":"","id":267695496},"270003891":{"title":"persisting()","url":"guides/rgcms/rgcms.html#_rgcms_methods_reserved_persisting","body":"persisting()
  The persisting() lifecycle callback method is called when a 
(not-yet-persistent) object is just about to be persisted fro
 m the object store  See also persisted(). ","description":" The persisting() 
lifecycle callback method is called when a (not-yet-persistent) object is just 
about to be persisted from the object store 
","id":270003891},"272121430":{"title":"ChangedObjectsServiceInternal","url":"guides/rgfis/rgfis.html#_rgfis_spi_ChangedObjectsServiceInternal","body":"ChangedObjectsServiceInternal
  The ChangedObjectsServiceInternal class is an (internal) request-scoped 
domain service that is responsible for collecting the details of all changes to 
domain objects within an interaction. This is then used by various other 
(internal) domain services, notably AuditingServiceInternal and 
PublishingServiceInternal. ","description":" The ChangedObjectsServiceInternal 
class is an (internal) request-scoped domain service that is responsible for 
collecting the details of all changes to domain objects within an interaction. 
This is then used by various other (internal) domain services, notably 
AuditingServiceInte
 rnal and PublishingServiceInternal. 
","id":272121430},"273843820":{"title":"Simulated UI 
(WrapperFactory)","url":"guides/ugtst/ugtst.html#_simulated_ui_code_wrapperfactory_code","body":"Simulated
 UI (WrapperFactory)  When we talk about integration tests/specs here, we mean 
tests that exercise the domain object logic, through to the actual database. 
But we also want the tests to exercise the app from the users’s perspective, 
which means including the user interface.  For most other frameworks that would 
require having to test the application in a very heavy weight/fragile fashion 
using a tool such as Selenium, driving a web browser to navigate . In this 
regard though, Apache Isis has a significant trick up its sleeve. Because 
Apache Isis implements the naked objects pattern, it means that the UI is 
generated automatically from the UI. This therefore allows for other 
implementations of the UI.  The WrapperFactory domain service allows a test to 
wrap domain objects and thus to intera
 ct with said objects \"as if\" through the UI:  If the test invokes an action 
that is disabled, then the wrapper will throw an appropriate exception. If the 
action is ok to invoke, it delegates through.  What this means is that an Isis 
application can be tested end-to-end without having to deploy it onto a 
webserver; the whole app can be tested while running in-memory. Although 
integration tests re (necessarily) slower than unit tests, they are not any 
harder to write (in fact, in some respects they are easier). ","description":" 
When we talk about integration tests/specs here, we mean tests that exercise 
the domain object logic, through to the actual database. But we also want the 
tests to exercise the app from the users’s perspective, which means including 
the user interface. ","id":273843820},"273985863":{"title":"addTo…​() 
(deprecated)","url":"guides/rgcms/rgcms.html#_rgcms_methods_prefixes_addTo","body":"addTo…​()
 (deprecated)  The addTo…​() supporting method is c
 alled whenever an object is added to a collection. Its purpose is to allow 
additional business logic to be performed.  For example:  See also 
removeFrom…​()` ","description":" The addTo…​() supporting method is 
called whenever an object is added to a collection. Its purpose is to allow 
additional business logic to be performed. 
","id":273985863},"278890330":{"title":"Build a domain 
app","url":"pages/tg/tg.html#_build_a_domain_app","body":"Build a domain app  
The remainder of the tutorial provides guidance on building a domain 
application. We don’t mandate any particular design, but we suggest one with 
no more than 3 to 6 domain entities in the first instance. If you’re stuck 
for ideas, then how about:  Hopefully one of those ideas appeals or sparks an 
idea for something of your own. ","description":" The remainder of the tutorial 
provides guidance on building a domain application. We don’t mandate any 
particular design, but we suggest one with no more than 3 to 6 domai
 n entities in the first instance. If you’re stuck for ideas, then how about: 
","id":278890330},"278999912":{"title":"Integration 
API","url":"guides/rgsvc/rgsvc.html#_rgsvc_integration-api","body":"Integration 
API 
","description":"","id":278999912},"280239507":{"title":"GridSystemService","url":"guides/rgsvc/rgsvc.html#_rgsvc_spi_GridSystemService","body":"GridSystemService
  The GridSystemService encapsulates a single layout grid system which can be 
used to customize the layout of domain objects. In particular this means being 
able to return a \"normalized\" form (validating and associating domain object 
members into the various regions of the grid) and in providing a default grid 
if there is no other metadata available.  The framework provides a single such 
grid implementation, namely for Bootstrap3. ","description":" The 
GridSystemService encapsulates a single layout grid system which can be used to 
customize the layout of domain objects. In particular this means being able to 
re
 turn a \"normalized\" form (validating and associating domain object members 
into the various regions of the grid) and in providing a default grid 
if","id":280239507},"282766365":{"title":"Object CSS 
Styling","url":"guides/ugfun/ugfun.html#_object_css_styling","body":"Object CSS 
Styling  It is also possible for an object to return a CSS class. In 
conjunction with customized CSS this can be used to apply arbitrary styling; 
for example each object could be rendered in a page with a different background 
colour. ","description":" It is also possible for an object to return a CSS 
class. In conjunction with customized CSS this can be used to apply arbitrary 
styling; for example each object could be rendered in a page with a different 
background colour. ","id":282766365},"283629224":{"title":"App 
Structure","url":"guides/ugfun/ugfun.html#_app_structure","body":"App Structure 
 As noted above, the generated app is a very simple application consisting of a 
single domain object that can be eas
 ily renamed and extended. The intention is not to showcase all of Apache Isis' 
capabilities; rather it is to allow you to very easily modify the generated 
application (eg rename SimpleObject to Customer) without having to waste time 
deleting lots of generated code.  If you run into issues, please don’t 
hesitate to ask for help on the users mailing list. ","description":" As noted 
above, the generated app is a very simple application consisting of a single 
domain object that can be easily renamed and extended. The intention is not to 
showcase all of Apache Isis' capabilities; rather it is to allow you to very 
easily modify the generated application (eg 
rename","id":283629224},"285898371":{"title":"ObjectUpdatedEvent","url":"guides/rgcms/rgcms.html#_rgcms_classes_lifecycleevent_ObjectUpdatedEvent","body":"ObjectUpdatedEvent
  Subclass of AbstractLifecycleEvent, broadcast when an object has just been 
updated in the database. This is done either explicitly when the current 
transaction 
 is flushed using the DomainObjectContainer's #flush(…​) method, else is 
done implicitly when the transaction commits at the end of the user request.  
ObjectUpdatedEvent.Default is the concrete implementation that is used. 
","description":" Subclass of AbstractLifecycleEvent, broadcast when an object 
has just been updated in the database. This is done either explicitly when the 
current transaction is flushed using the DomainObjectContainer's #flush(…​) 
method, else is done implicitly when the transaction commits at the end of the 
user request. ","id":285898371},"286850218":{"title":"Dependent choices for 
action 
parameters","url":"guides/ugfun/ugfun.html#_dependent_choices_for_action_parameters","body":"Dependent
 choices for action parameters  For action it is also possible (in a limited 
form) to define dependencies between parameters. Specifically, if one parameter 
is a drop-down choice, then other drop-down choices can be derived from it.  A 
good example is a category/sub-ca
 tegory:  Note how the choices method for the 2nd parameter also accepts the 
first parameter. ","description":" For action it is also possible (in a limited 
form) to define dependencies between parameters. Specifically, if one parameter 
is a drop-down choice, then other drop-down choices can be derived from it. 
","id":286850218},"287120012":{"title":"Actions","url":"guides/ugfun/ugfun.html#_actions_2","body":"Actions
  Of course, the precondition business rules described above are only one type 
of business rule.  More generally, business rules are implemented in the form 
of the implementation of actions. Rather than have the end-user have to edit 
individual properties of numerous objects, an action can encode these rules and 
allow only safe transformations of the application from one consistent state to 
the next. ","description":" Of course, the precondition business rules 
described above are only one type of business rule. 
","id":287120012},"288377989":{"title":"Philosophy and Archit
 
ecture","url":"guides/ugfun/ugfun.html#_ugfun_core-concepts_philosophy","body":"Philosophy
 and Architecture  This section describes some of the core ideas and 
architectural patterns upon which Apache Isis builds. ","description":" This 
section describes some of the core ideas and architectural patterns upon which 
Apache Isis builds. ","id":288377989},"288392697":{"title":"User 
Experience","url":"guides/ugvw/ugvw.html#_user_experience_3","body":"User 
Experience  The copy URL dialog is typically obtained by clicking on the icon.  
Alternatively, alt+] will also open the dialog. It

<TRUNCATED>

Reply via email to