http://git-wip-us.apache.org/repos/asf/isis-site/blob/1e14c189/content/elasticlunr/index.json
----------------------------------------------------------------------
diff --git a/content/elasticlunr/index.json b/content/elasticlunr/index.json
index d3c8585..97f424a 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},"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 abilit
 y 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 action 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.Obj
 ect). 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 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","id":11600575},"12196042":{"title":"Tertiary 
Menu","url":"guides/ugvw/ugvw.html#_tertiary_menu","body":"Tertiary Menu  
Domain services' actions can be associated with the te
 rtiary menu using the same @DomainServiceLayout annotation, but be aware that 
the @DomainServiceLayout#name() attribute will be ignored (there is only one 
effective menu).  For example, the updateEpochDate(…​) and 
listAllSettings(…​) actions come from the following service:  Because the 
number of items on the tertiary menu is expected to be small and most will 
pertain to the current user, the viewer does not place dividers between actions 
from different services on the tertiary menu. ","description":" Domain 
services' actions can be associated with the tertiary menu using the same 
@DomainServiceLayout annotation, but be aware that the 
@DomainServiceLayout#name() attribute will be ignored (there is only one 
effective menu). ","id":12196042},"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 ver
 sion 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 completely 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…​() sup
 porting method is called for properties, collections and actions. It allows 
the property/collection to be completely hidden from view. 
","id":13573617},"14290952":{"title":"Vetoing 
Visibility","url":"guides/htg.html#_ugbtb_hints-and-tips_vetoing-visibility","body":"Vetoing
 Visibility  eg if included an addon such as auditing or security.  solution is 
to write a domain event subscriber that vetoes the visibility  All the addons 
actions inherit from common base classes so this can be as broad-brush or 
fine-grained as required ","description":" eg if included an addon such as 
auditing or security. ","id":14290952},"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 se
 tting a configuration flag. 
","id":14971197},"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) Incode Platform's 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 this 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 EventBu
 sService 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 events 
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},"17618894":{"title":"New 
Feature","url":"release-notes/release-notes.html#_new_feature_20","body":"New 
Feature ","description":"","id":17618894},"17724516":{"title":"Multi-select act
 ion 
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 of Scratchpad service is:  This class 
(o.a.i.applib.services.scratchpad.Scratchpad) is also the implementation. And, 
as you can see, the service is just a request-scoped wrapper around a java
 .util.Map. ","description":" The API of Scratchpad service 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 ","description":"","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 th
 e 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 sequence 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},"31312523":{"title":"Declarative 
style","url":"guides/htg.html#_declarative_style_3","body":"Declarative style  
To render an object with a particular CSS, use @D
 omainObjectLayout#cssClass().  When the domain object is rendered on its own 
page, this CSS class will appear on a top-level <div>. Or, when the domain 
object is rendered as a row in a collection, then the CSS class will appear in 
a <div> wrapped by the <tr> of the row.  One possible use case would be to 
render the most important object types with a subtle background colour: 
Customers shown in light green, or Orders shown in a light pink, for example. 
","description":" To render an object with a particular CSS, use 
@DomainObjectLayout#cssClass(). 
","id":31312523},"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 C
 ommand 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},"31966407":{"title":"Icons","url":"guides/htg.html#_icons","body":"Icons
  Action icons can be specified in several ways.  One option is to use the 
@ActionLayout#cssClassFa(). For example:  Alternatively, you can specify these 
hints dynamically in the Xxx.layout.xml for the entity:  Rather than annotating 
every action with @ActionLayout#cssClassFa() and @ActionLayout#cssClass() you 
can instead specify the UI hint globally using regular expressions. Not only 
does this save a lot of boilerplate/editing, it helps ensure consistency across 
all actions.  To declare fa classes globally, use the configuration property 
isis.reflector.facet.cssClassFa.patterns (a comma separated list of key:value 
pairs).  For example:  Here:  For example, \"fa-plus\" is applied to all action 
members called \"newXxx\" ","description":" Action icons can be specified in 
several ways. ","id":31966407},"
 
36734123":{"title":"Bug","url":"release-notes/release-notes.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 addons 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},"44483327":{"title":"New 
Feature","url":"release-notes/release-notes.html#_new_feature_17","body":"New 
Feature 
","description":"","id":44483327},"45128293":{"title":"getConfigurationProperties()","url":"guides/rgcms/rgcms.html#__rgcms_classes_AppManifest-bootstrapping_api_getConfigurationProperties","body":"getConfigurationProperties()
  This method allow arbitrary other configuration properties to be overridden. 
One common use case is in conjunction with the getFixtures() method, discussed 
above: ","description":" This method allow arbitrary other configuration 
properties to be overridden. One common use case is in conjunction with the
  getFixtures() method, discussed above: 
","id":45128293},"57327287":{"title":"cssClassFa()","url":"guides/rgant/rgant.html#_rgant-ViewModelLayout_cssClassFa","body":"cssClassFa()
  The cssClassFa() attribute is used to specify 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 a
 lways 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},"62314289":{"title":"Menu Bars 
Layout","url":"guides/ugvw/ugvw.html#_ugvw_menubars-layout","body":"Menu Bars 
Layout ","description":"","id":62314289},"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.numUnapprovedLicenses 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},"74705826":{"title":"How to implement 
a 
spellchecker?","url":"guides/htg.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":74705826},"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, and 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\" guides. 
","id":78624086},"80534397":{"title":"ContentMappingService","url":"guides/rgsvc/rgsv
 
c.html#_rgsvc_presentation-layer-spi_ContentMappingService","body":"ContentMappingService
  The ContentMappingService supports the (default implementation of the) 
ContentNegotiationService enabling the RestfulObjects viewer to represent 
domain objects in some other format as specified by the HTTP Accept header.  
See ContentNegotiationService for further discussion. ","description":" The 
ContentMappingService supports the (default implementation of the) 
ContentNegotiationService enabling the RestfulObjects viewer to represent 
domain objects in some other format as specified by the HTTP Accept header. 
","id":80534397},"83803344":{"title":"MessageService","url":"guides/rgsvc/rgsvc.html#_rgsvc_application-layer-api_MessageService","body":"MessageService
  The MessageService allows domain objects to raise information, warning or 
error messages. These messages can either be simple strings, or can be 
translated. ","description":" The MessageService allows domain objects to raise 
information,
  warning or error messages. These messages can either be simple strings, or 
can be translated. ","id":83803344},"83933647":{"title":"Persistence 
Concerns","url":"guides/ugbtb/ugbtb.html#_persistence_concerns","body":"Persistence
 Concerns 
","description":"","id":83933647},"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},"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  Consid
 er 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 
AgreementRole 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 FixtureS
 cripts 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 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. 
","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},"99090360":{"title":"Running the 
App","url":"guides/ugfun/ugfun.html#__ugfun_getting-started_simpleapp-arche
 type_running-the-app","body":"Running the App  The simpleapp archetype 
generates a single WAR file, configured to run both the Wicket viewer and the 
Restful Objects viewer. The archetype also configures the DataNucleus/JDO 
Objectstore to use an in-memory HSQLDB connection.  Once you’ve built the 
app, you can run the WAR in a variety of ways. ","description":" The simpleapp 
archetype generates a single WAR file, configured to run both the Wicket viewer 
and the Restful Objects viewer. The archetype also configures the 
DataNucleus/JDO Objectstore to use an in-memory HSQLDB connection. 
","id":99090360},"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 these updates 
(or if minor then use the \"catch-all\" JI
 RA 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":10416775
 
5},"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},"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 c
 ollection 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 services 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  Mo
 st 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 to 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},"108815435":{"title":"unchanging()","url":"guides/rgant/rgant.html#_rgant-PropertyLayout_unchanging","body":"unchanging()
  The unchanging() attribute is used to indicate that the value held by the 
property never changes over time, even when other properties of the object do 
change.  Setting this attribute to true is used as a hint to the viewer to not 
redraw the property after an AJAX update of some other property/ies of the objec
 t have changed. This is primarily for performance, eg can improve the user 
experience when rendering PDFs/blobs.  Note that for this to work, the viewer 
will also ensure that none of the property’s parent component (such as a tab 
group panel) are re-rendered.  For example: ","description":" The unchanging() 
attribute is used to indicate that the value held by the property never changes 
over time, even when other properties of the object do change. 
","id":108815435},"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.  
These mixin properties/actions are all associated with the \"Metadata\" 
fieldset. A number of 
 other mixins also contribute properties or actions to the \"Metadata\" 
fieldset. ","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},"112375674":{"title":"Auditing","url":"migration-notes/migration-notes.html#_auditing","body":"Auditing
  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) Incode Platform's audit module also implements the new SPI. 
","description":" The AuditingService SPI service has been deprecated, instead 
replaced by the AuditerService. ","id":112375674},"113098816":{"title":"DataN
 ucleus Object 
Store","url":"guides/htg.html#_datanucleus_object_store","body":"DataNucleus 
Object Store 
","description":"","id":113098816},"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() annotation. ","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 s
 tore, 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 
services 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 pers
 istent 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},"121574190":{"title":"Related 
Services","url":"guides/rgsvc/rgsvc.html#_related_services_18","body":"Related 
Services  The Act
 ionInteractionContext 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},"145340696":{"title":"Registering the 
Services","url":"guides/rgsvc/rgsvc.html#_registering_the_services_20","body":"Registering
 the Services  The (non-ASF) Incode Platform’s 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 being 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) Incode 
Platform’s 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. ","description":" 
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},"153666205":{"title":"Implementation","url":"guides/rg
 svc/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) 
","description":"","id":155655500},"158033412":{"title":"SPI","url":"guides/rgsvc/rgsvc.html#_spi_27","body":"SPI
  The SPI defined by the service is: ","description":" The SPI defined by the 
service is: ","id":158033412},"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 det
 our: 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},"159072030":{"title":"(non-ASF) Incode 
Platform","url":"migration-notes/migration-notes.html#_migration-notes_1.14.0-to-1.15.0_incode-platform","body":"(non-ASF)
 Incode Platform  The various (non-ASF) Isis Addons and Incode Catalog have 
also been combined into a single \"Incode Platform\".  While each module can 
still be consumed individually, t
 he new platform versions consistently (a change in any one module will result 
in a re-release of all). This should make these modules easier to consume, and 
easier to maintain/develop.  All the modules remain open source, still licensed 
under the ASF v2.0 license.  As of this release, none of the groupIds or 
artifactIds have changed. They will be rationalized/made consistent in a future 
release; most probably to coincide with v2.0.0 of the framework. 
","description":" The various (non-ASF) Isis Addons and Incode Catalog have 
also been combined into a single \"Incode Platform\". 
","id":159072030},"160872749":{"title":"Related 
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. ","descripti
 on":" The default implementation of ContentNegotiationService delegates to 
ContentMappingService (if present) to convert domain entities into a stable 
form (eg DTO). ","id":160872749},"163456888":{"title":"Dependency 
upgrade","url":"release-notes/release-notes.html#_dependency_upgrade_9","body":"Dependency
 upgrade 
","description":"","id":163456888},"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_restfulobjects.properties will both be 
loaded if present (but neither need be present). 
","id":163915714},"165602306":{"title":"GridLoaderService","url":"guides/rgsvc/rgsvc.html#_rgsvc_presentation-layer-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":165602306},"165750333":{"title":"loaded()","url":"guides/rgcms/rgcms.html#_rgcms_methods_lifecycle_loaded","body":"loaded()
  The loaded() lifecycle callback method is called when a (persistent) object 
has just been loaded from the object store. ","description":" The loaded() 
lifecycle callback method is called when a (persistent) object has just been 
loaded from the object store. ","id":165750333},"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 ex
 ecute (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 compatible 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). ","descripti
 on":" 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 implementation of this service, namely 
GridServiceDefault. ","description":" The framework provides a default 
implementation of this service, namely GridServiceDefault. 
","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 be cached for the duration of a request. 
","id":175197970},"175636232":{"title":"RepositoryService","url":"guides/rgsvc/rgsvc.html#_rgsvc_persistence-layer-api_RepositoryService","body":"RepositoryService
  The RepositoryService collects together methods for creating, persisting and 
searching for entities from the underlying persistence store. It acts as an 
abstraction over the JDO/DataNucleus objectstore.  You can use it during 
prototyping to write naive queries (find all rows, then filter using the Guava 
Predicate API, or you can use it to call JDO named queries using JDOQL.  As an 
alternative, you could also use JDO typesafe queries through the IsisJdoSupport 
service. ","description":" The RepositoryService collects together methods for 
creating, persisting and searching for entities from the underlying persisten
 ce store. It acts as an abstraction over the JDO/DataNucleus objectstore. 
","id":175636232},"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 ob
 tain a XML equivalent of that Command, 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) Incode Platform's publishmq module 
is responsible for publishing messages onto an ActiveMQ event bus, for 
inter-system com
 munication. However, the SPI can also be used for profiling; each execution 
within the call-graph contains metrics of the number of objects loaded or 
modified as a result of that execution, and thus could be used for application 
profiling. The framework provides a default 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 events 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_translatableexcepti
 on_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 cu
 rrent time is obtained from the ClockService.  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.  S
 ee DataNucleus' documentation on persistence.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 SPI defined by the service is:  where FixtureScriptsSpecification exposes 
these values:  The class is immutable but it has a builder (obtained using 
FixturescriptsSpecification.builder(…​)) for a fluent API. 
","description":" The SPI 
 defined by the service is: ","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 account  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 gu
 ide. ","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},"196560907":{"title":"XJC 
profile","url":"guides/rgmvn/rgmvn.html#__rgmvn_xsd_xsd-submodule_xjc-profile","body":"XJC
 profile  The xjc profile reads the XSD generated by the xsd goal, and from it 
generates Java DTOs. Note that this isn’t round-tripping: the original view 
model is only for use within the Isis app, whereas the DTO generated from the 
XSDs is for use in a standalone context, eg in a Java subscriber on an event 
bus.  The xjc profile is defined as:  The referenced catalog.xml file instructs 
the xjc plugin how to resolve referenced schema locations. Only a reference for 
the Apache Isis common schema is likely to be needed: ","description":" The xjc 
profile reads the XSD generated by the xsd goal, and from it generates Java 
DTOs. Note th
 at this isn’t round-tripping: the original view model is only for use within 
the Isis app, whereas the DTO generated from the XSDs is for use in a 
standalone context","id":196560907},"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 limit 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 a
 ction 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 
Feature","url":"release-notes/release-notes.html#_new_feature_18","body":"New 
Feature 
","description":"","id":203208629},"203740710":{"title":"RoutingService","url":"guides/rgsvc/rgsvc.html#_rgsvc_presentation-layer-spi_RoutingService","body":"RoutingService
  The RoutingService provides the ability to return (and 
 therefore render) an alternative object from an action invocation.  There are 
two primary use cases:  Currently the routing service is used only by the 
Wicket viewer; it is ignored by the Restful Objects viewer. ","description":" 
The RoutingService provides the ability to return (and therefore render) an 
alternative object from an action invocation. 
","id":203740710},"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 activ
 ated 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},"213642269":{"title":"Moving 
on","url":"guides/ugfun/ugfun.html#__ugfun_getting-started_helloworld-archetype_moving-on","body":"Moving
 on  When you are ready to start working on your own app, we don’t recommend 
building on top of the helloworld app.  Instead, we suggest that you start with 
the simpleapp archetype instead. Although a little more complex, it provides 
more structure and tests, all of which will help you as your application grows. 
","description":" When you are ready to start working on your own app, we 
don’t recommend building on top of the helloworld app. 
","id":213642269},"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 s
 uperclass 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) Incode Platform security module 
provides a domain service that automatically seeds certain domain entities; 
these will generate lifecycle events 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. 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. 
","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 callbacks 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 i
 s 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":"migration-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},"230599582":{"title":"AuditingServiceInternal","url":"guides/rgfis/rgfis.html#_rgfis_persistence-layer_AuditingServiceInternal","body":"AuditingServiceInternal
  The (internal) AuditingServiceInternal domain service acts as an internal 
facade to any configured AuditingService and AuditerService services. It is 
responsible for obtaining the details of all changes to domain objects within 
an interaction, and then to call the configured AuditingService to actually 
create audit entries of those changes. ","description":" The (internal) 
AuditingServiceInternal domain service acts as an internal facade to any 
configured AuditingService and AuditerService services. It is responsible for 
obtaining the details of all
  changes to domain objects within an interaction, and then to call the 
configured AuditingService to actually create audit entries of those changes. 
","id":230599582},"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 
centralized 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.ht
 ml#_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},"244520152":{"title":"SessionLoggingService","url":"guides/rgsvc/rgsvc.html#_rgsvc_presentatio
 n-layer-spi_SessionLoggingService","body":"SessionLoggingService  The 
SessionLoggingService defines an SPI to keep track of (typically: to log) the 
current sessions that are using the application. ","description":" The 
SessionLoggingService defines an SPI to keep track of (typically: to log) the 
current sessions that are using the application. 
","id":244520152},"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 bootstrap 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). That said, there should be little reason to 
use a different implementation; if behaviour d
 oes need to be changed, it would also be possible to replace the 
implementation of either the GridLoaderService or the GridSystemService. 
","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 set up. For example, with 
Tomcat this can be done by writing into the conf/catalina.properties file (see 
for example this stackoverflow post).  T
 he 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 either 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  One significant feature of the (non-ASF) Incode Platform's security 
module 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 (non-ASF) Incode Platform's 
security module README. ","description":" One significant feature of the 
(non-ASF) Incode Platform's security module is the ability to associate users 
and objects with a \"tenancy\". The todoapp uses this feature so that d
 ifferent users' list of todo items are kept separate from one another. A user 
with administrator is able to 
switch","id":255768608},"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 AppManifest interface to bootstrap both an Apache Isis web application, and 
also its integration tests. 
","id":257661017},"259202548":{"title":"Run-as","url":"guides/htg.html#_ugsec_hints-and-tips_run-as","body":"Run-as
  This hint shows how to temporarily change the current user as reported by 
Shiro. This can be useful to support \"Run As\", for example.  The heavy 
lifting is done in ShiroService:  This could be exposed in the UI using a 
simple RunAsService, for example:  Credits: adapted 
 from this gist. ","description":" This hint shows how to temporarily change 
the current user as reported by Shiro. This can be useful to support \"Run 
As\", for example. ","id":259202548},"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},"273843820":{"title":"Simulated UI 
(WrapperFactory)","url":"guides/ugtst/ugtst.html#_simulated_ui_code_wrapperfactory_code","body":"Simulated
 UI (WrapperFactory)  When we talk ab
 out 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 
declared domain-objects, -views and -services. This therefore allows for other 
implementations of the UI.  The WrapperFactory domain service allows a test to 
wrap domain objects and thus to interact 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 called 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},"278859977":{"title":"promptStyle()","url":"guides/rgant/rgant.html#_rgant-PropertyLayout_promptStyle","body":"promptStyle()
  The promptStyle() attribute is used to specify whether, when editing a domain 
object property, the new value for the property is prompted by way of a dialog 
box, or is prompted using an inline panel (replacing the property on the page). 
 If the attribute is not set, then the value of the configuration property 
isis.viewer.wicket.promptStyle is used. If this is itself not set, then an 
inline prompt is used.  For example:  Alternatively, the promptStyle() can be 
specified using file-based layouts. ","description":" The promptStyle() 
attribute is used to specify whether, when editing a domain object property, 
the new value for the property is prompted by way of a dialog box, or is 
prompted using an inl
 ine panel (replacing the property on the page). 
","id":278859977},"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 domain 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},"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},"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 commi
 ts 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-category:  Note how the choices method for the 
2nd parameter also accepts the first parameter. ","description":" For act
 ion 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 t

<TRUNCATED>

Reply via email to