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

[58/59] [abbrv] isis-site git commit: ISIS-1521: adds a search capability

http://git-wip-us.apache.org/repos/asf/isis-site/blob/2a33ec48/content/elasticlunr/index.json
----------------------------------------------------------------------
diff --git a/content/elasticlunr/index.json b/content/elasticlunr/index.json
index 7b7ceb5..dce2219 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":{"2409349":{"title":"Action Parameters","url":"guides/ugfun/ugfun.html#_action_parameters","body":"Action Parameters ","description":"","id":2409349},"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\u2019s see how to run both the app and the tests. ","description":" Let\u2019s 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 Is
 is' 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 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\u2019s sup
 ertypes (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 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},"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\u2026\u200b()","url":"guides/rgcms/rgcms.html#_rgcms_methods_prefixes_hide","body":"hide\u2026\u200b()  The hide\u2026\u200b() supporting method is called for properties, collections and actions. It allows the property/collection to be completely hidden from view.  It\u2019s 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\u2026\u200b() 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_allowlateregistratio
 n_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 this meant in practice is that it generally didn\u2019t 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 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 p
 osted 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(\u2026\u200b) 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(\u2026\u200b) method. ","id":17000573},"17618894":{"title":"New Feature","url":"release-notes/release-notes.html#_new_feature_20","body":"New Feature ","description":"","id":17618894},"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 ClockService 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 ","description":"","id":21212015},"21257842":{"title":"Default for action param","url":"guides/ugfun/ugfun.html#_default_for_action_param","body":"Default for action param ","description":"","id":21257842},"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},"26509816":{"title":"Commit changes","url":"g
 uides/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},"27405938":{"title":"Editable Properties","url":"guides/ugfun/ugfun.html#__ugfun_how-tos_class-structure_properties_editable-properties","body":"Editable Properties  Apache Isis provides the capability to allow individual properties to be modified. This is specified using the @Property(editing=\u2026\u200b) attribute.  For example:  If this is omitted then whether editing is enabled or disabled is defined globally, in the isis.properties configuration file; see reference configuration guide for further details. ","description":" Apache Isis provides the capability to allow individual properties to be modified. This is specified using the @Property(editing=\u2026\u200b) attribute. ","id":27405938},"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 \u2014 eg [1-Apr-2015, 1-July-2015) \u2014 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},"29174134":{"title":"Overriding JDO Annotations","url":"guides/ugodn/ugodn.html#_ugodn_overriding-jdo-annotations","body":"Overriding JDO Annotations ","d
 escription":"","id":29174134},"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 cu
 rrent 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-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 \u2026\u200bDefault implementation takes priority over the \u2026\u200bNoop 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  For example, the regular view is:  With the header and footer both suppressed only the main content is shown:  It is also possible to suppress just the header, or just the footer. ","description":" For example, the regular view is: ","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 A
 ppManifest 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 specify the name of a Font Awesome icon name, to be rendered as the domain object\u2019s icon.  These attribute can also be applied to domain objects to specify the object\u2019s icon, and to actions to specify an icon for the action\u2019s 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\u2019s icon. ","id":57327287},"64591190":{"title":"InteractionContext","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 reporte
 d 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\u2019ve 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},"75054401":{"title":"Su
 pporting 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 me
 mbers. ","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},"78624086":{"title":"Other Guides","url":"guides/ugsec/ugsec.html#_other_guides","body":"Other Gu
 ides  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},"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 FixtureScr
 ipt classes, how to execute those classes, and hints that influence the UI. ","description":" The FixtureScriptsDefault service provides the ability to execute fixture scripts . ","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 (sim
 plified) is:  while Agreement's is implemented as:  and Party's is similarly implemented as:  DataNucleus\u2019s 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 FixtureScripts domain service class, and the FixtureScript view model class:  Let\u2019s 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},"9
 5725933":{"title":"Isis Add-ons (not ASF)","url":"guides/ugvw/ugvw.html#_ugvw_isis-addons","body":"Isis Add-ons (not ASF) ","description":"","id":95725933},"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},"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 integra
 tion 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 these 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},"105480253":{"title":"Visitor","url":"guides/ugbtb/ugbtb.html#__code_visitor_code","body":"Visitor  More often than not, you\u2019ll 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\u2019ll 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 dynamically 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 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\u2019s also possible to use the attribute to suppress the action completely:  In such cases, though, it wou
 ld 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\u2019re likely to run Apache Isis using the Wicket viewer. In this case Apache Isis' \"deployment type\" concept maps to Wicket\u2019s \"configuration\" concept:  Wicket\u2019s 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\u2019re likely to run Apache Isis using the Wicket viewer. In this case Apache Isis' \"deployment type\" concept maps to Wicket\u2019s \"configuration\" concept: ",
 "id":106606865},"108186637":{"title":"Event Bus","url":"guides/ugbtb/ugbtb.html#_ugbtb_decoupling_event-bus","body":"Event Bus ","description":"","id":108186637},"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/ugfu
 n.html#_prerequisites","body":"Prerequisites  Apache Isis is a Java based framework, so in terms of prerequisites, you\u2019ll need to install:  You\u2019ll 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\u2019re a NetBeans user you should have no problems as it too has strong support for Maven.  When building and running within an IDE, you\u2019ll also need to configure the Datanucleus enhancer. This is implemented as a Maven plugin, so in the case of IntelliJ, it\u2019s 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\u2019
 ll need to install: ","id":110978244},"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) 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() annotation. ","id":114685873},"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, but it\u2019s also possible for an individual instance to return a custom icon. This could represent the state of that object (eg a shipped order, say, or overdue library book). ","description":" The icon is often the same for all instances of a particular class, but it\u2019s also possible for an individual instance to return a custom icon. This could represent the state of that object (eg a shipped order, say, or overdue library book). ","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 pla
 ced, 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\u2019s 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 day
 s 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 chap
 ter act as contributees; they allow domain services to contribute actions/properties/collections to any domain objects that implement these interfaces. ","id":122762699},"122876421":{"title":"Class Definition","url":"guides/ugfun/ugfun.html#_ugfun_how-tos_class-structure_class-definition","body":"Class Definition  Apache Isis supports recognises three main types of domain classes:  Domain classes are generally recognized using annotations. Apache Isis defines its own set of annotations, while entities are annotated using JDO/DataNucleus (though XML can also be used if required). JAXB can also be used for view models. Apache Isis recognizes some of the JDO and JAXB annotations and infers domain semantics from these annotations.  You can generally recognize an Apache Isis domain class because it will be probably be annotated using @DomainObject and @DomainService. The framework also defines supplementary annotations, @DomainObjectLayout and @DomainServiceLayout. These provide hints re
 lating to the layout of the domain object in the user interface. (Alternatively, these UI hints can be defined in a supplementary .layout.xml file.  We use Maven modules as a way to group related domain objects together; we can then reason about all the classes in that module as a single unit. By convention there will be a single top-level package corresponding to the module.  For example, the (non-ASF) Document module (part of the Incode Catalog) has a top-level package of org.incode.module.document. Within the module there may be various subpackages, but its the module defines the namespace.  In the same way that the Java module act as a namespace for domain objects, it\u2019s good practice to map domain entities to their own (database) schemas. ","description":" Apache Isis supports recognises three main types of domain classes: ","id":122876421},"125299345":{"title":"Example","url":"guides/rgant/rgant.html#_example_2","body":"Example  This example is taken from the (non-ASF) Isis a
 ddons' todoapp: ","description":" This example is taken from the (non-ASF) Isis addons' todoapp: ","id":125299345},"125419669":{"title":"Unreferenced Members","url":"guides/ugfun/ugfun.html#__ugfun_object-layout_dynamic_xml-unreferenced","body":"Unreferenced Members  As noted in the preceding discussion, several of the grid\u2019s regions have either an unreferencedActions, unreferencedCollections or unreferencedProperties attribute.  The rules are:  The purpose of these attributes is to indicate where in the layout any unreferenced members should be rendered. Every grid must nominate one region for each of these three member types, the reason being that to ensure that the layout can be used even if it is incomplete with respect to the object members inferred from the Java source code. This might be because the developer forgot to update the layout, or it might be because of a new mixin (property, collection or action) contributed to many objects.  The framework ensures that in any giv
 en grid exactly one region is specified for each of the three unreferenced\u2026\u200b attributes. If the grid fails this validation, then a warning message will be displayed, and the invalid XML logged. The layout XML will then be ignored. ","description":" As noted in the preceding discussion, several of the grid\u2019s regions have either an unreferencedActions, unreferencedCollections or unreferencedProperties attribute. ","id":125419669},"125961908":{"title":"Do it!","url":"pages/tg/tg.html#_do_it","body":"Do it! ","description":"","id":125961908},"136403234":{"title":"Dynamic (JSON) Layout","url":"guides/ugfun/ugfun.html#_ugfun_object-layout_dynamic","body":"Dynamic (JSON) Layout  Metadata providing UI hints can be specified either statically, using annotations, or dynamically, using either a layout.xml file or (as described here) a .layout.json file. ","description":" Metadata providing UI hints can be specified either statically, using annotations, or dynamically, using either a layo
 ut.xml file or (as described here) a .layout.json file. ","id":136403234},"137196424":{"title":"Persistence Concerns","url":"guides/ugfun/ugfun.html#_persistence_concerns","body":"Persistence Concerns ","description":"","id":137196424},"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 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) Isis addons' audit module provide
 s 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","url":"guides/ugbtb/ugbtb.html#_ugbtb_programming-model_layout-metadata-reader","body":"Layout Metadata Reader  The metadata for domain objects is obtained both statically and dynamically.  The default implementation for reading dynamic layout metadata is org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson, which is responsible for reading from the Xxx.layout.json files on the classpath (for each domain entity Xxx).  You can also implement your own metadata readers and plug them into Apache Isis. These could read from a different file format, or they could, even, read data dynamically from a URL or database. (Indeed, one could imagine an implementation whereby users could share layouts, all stored in som
 e central repository). ","description":" The metadata for domain objects is obtained both statically and dynamically. ","id":148135206},"151718660":{"title":"Specifying components","url":"guides/rgcfg/rgcfg.html#_rgcfg_configuring-components","body":"Specifying components ","description":"","id":151718660},"153425152":{"title":"AngularJS Tips","url":"guides/ugvro/ugvro.html#_angularjs_tips","body":"AngularJS Tips  The hypermedia API exposed by Apache Isis' Restful Objects viewer is intended be support both bespoke custom-written viewers as well as generic viewers. Indeed, we expect most clients consuming the API will be bespoke, not generic.  This page captures one or two tips on using AngularJS to write such a bespoke client. ","description":" The hypermedia API exposed by Apache Isis' Restful Objects viewer is intended be support both bespoke custom-written viewers as well as generic viewers. Indeed, we expect most clients consuming the API will be bespoke, not generic. ","id":153
 425152},"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},"154220136":{"title":"Other Annotations","url":"guides/ugfun/ugfun.html#_other_annotations","body":"Other Annotations  As of 1.8.0, all the layout annotations have been consolidated into the various XxxLayout annotations: @ActionLayout @CollectionLayout, @DomainObjectLayout, @DomainServiceLayout, @ParameterLayout, @PropertyLayout, and @ViewModelLayout ","description":" As of 1.8.0, all the layout annotations have been consolidated into the various XxxLayout annotations: @ActionLayout @CollectionLayout, @DomainObjectLayout, @DomainServiceLayout, @ParameterLayout, @PropertyLayout
 , and @ViewModelLayout ","id":154220136},"155655500":{"title":"@PrimaryKey (javax.jdo)","url":"guides/rgant/rgant.html#_rgant-PrimaryKey","body":"@PrimaryKey (javax.jdo) ","description":"","id":155655500},"155926851":{"title":"Properties vs Parameters","url":"guides/ugfun/ugfun.html#_ugfun_how-tos_class-structure_properties-vs-parameters","body":"Properties vs Parameters  In many cases the value types of properties and of action parameters align. For example, a Customer entity might have a surname property, and there might also be corresponding changeSurname. Ideally we want the surname property and surname action parameter to use the same value type.  Since JDO/DataNucleus handles persistence, its annotations are requiredto specify semantics such as optionality or maximum length on properties. However, they cannot be applied to action parameters. It is therefore necessary to use Apache Isis' equivalent annotations for action parameters.  The table below summarises the equivalence o
 f some of the most common cases. ","description":" In many cases the value types of properties and of action parameters align. For example, a Customer entity might have a surname property, and there might also be corresponding changeSurname. Ideally we want the surname property and surname action parameter to use the same value type. ","id":155926851},"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:  I
 f you can\u2019t 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},"159667759":{"title":"Mapping Clobs","url":"guides/ugfun/ugfun.html#__ugfun_how-tos_class-structure_properties_mapping-blobs-and-clobs_mapping-clobs","body":"Mapping Clobs  Mapping Clob`s works in a very similar way, but the `jdbcType and sqlType attributes will, respectively, be CLOB and LONGVARCHAR: ","description":" Mapping Clob`s works in a very similar way, but the `jdbcType and sqlType attributes will, respectively, be CLOB and LONGVARCHAR: ","id":159667759},"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 co
 nvert 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_restfulobjects.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 C
 heck  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 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":167
 039338},"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 implementation 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 f
 or 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 be 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 goo
 d 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 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 u
 se 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 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\u2019s 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 Act
 ionDomainEvent.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\u2019s 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 Tr
 anslatableException, 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:  Th
 e 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 ClockService.  Entities that implement this interface often also implement HoldsUpdatedBy role interface; as a convenience the Timestampable interface combines the two roles. ","description":" The HoldsUpda
 tedAt 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 ","description":"","id":191180113},"193237835":{"title":"Core","url":"release-notes/release-notes.html#_core_8","body":"Core ","description":"","id":193237835},"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 effecti
 ve 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 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 shou
 ld 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},"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},"201087485":{"title":"Using the ISIS_OPTS environment variable","url":"guides/ugbtb/ugbtb.html#_using_the_code_isis_opts_code_environment_variable","body":"Using the ISIS_OPTS environment variable  The servlet context initializer will search for an environment variable called $ISIS_OPTS and if present will parse the content as a set of key/value pairs. Each key/value pair is separated by \"||\".  For example:  can be used to run with a different app manifest, and also to disable editing of properties.  To use a different separator, set the (optional) $ISIS_OPTS_SEPARATOR variable.  The Docker\u2019s ENTRYPOINT therefore just needs to parse the Docker container\u2019s own command line arguments and use to set this environment variable. ","description":" The servlet conte
 xt initializer will search for an environment variable called $ISIS_OPTS and if present will parse the content as a set of key/value pairs. Each key/value pair is separated by \"||\". ","id":201087485},"203208629":{"title":"New Feature","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 i
 s 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\u2019s 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\u2019ve made locally to your fork:  This will create a corresponding branch in the 
 remote github repo. If you use gitk --all, you\u2019ll 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\u2019ll probably want to sign up to the dev mailing list first before issuing your first pull request (though that isn\u2019t 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\u2019ve 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\u2019s important that subscribers register before an
 y 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 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 i
 t 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},"223057782":{"title":"Syntax","url":"guides/ugbtb/ugbtb.html#_syntax","body":"Syntax  Any n-parameter action provided by a service will automatically be contributed to the list of actions for each of its (entity) parameters. From the viewpoint of the entity the action is called a contributed action.  For example, given a service:  and the entities:  and  then the borrow(\u2026\u200b) action will be contributed to both Book and to LibraryMember.  This is an important capability because it helps to decouple the concrete classes from the services.  If necessary, though, this behaviour can be suppressed by annotating the service ac
 tion with @org.apache.isis.applib.annotations.NotContributed.  For example:  If annotated at the interface level, then the annotation will be inherited by every concrete class. Alternatively the annotation can be applied at the implementation class level and only apply to that particular implementation.  Note that an action annotated as being @NotContributed will still appear in the service menu for the service. If an action should neither be contributed nor appear in service menu items, then simply annotate it as @Hidden. ","description":" Any n-parameter action provided by a service will automatically be contributed to the list of actions for each of its (entity) parameters. From the viewpoint of the entity the action is called a contributed action. ","id":223057782},"224301547":{"title":"IsisWebAppBootstrapper","url":"guides/ugbtb/ugbtb.html#__code_isiswebappbootstrapper_code","body":"IsisWebAppBootstrapper  The IsisWebAppBootstrapper servlet context listener bootstraps the share
 d (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},"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 view
 er. 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 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 us
 ages 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 r
 endered 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 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). ","description":" Assuming that the configuratio
 n-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).  The Docker\u2019s ENTRYPOINT therefore just needs to parse the Docker container\u2019s 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":{"titl
 e":"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 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","id":255768608},"255908905":{"title":"GridLoaderService","url":"guides/rg
 svc/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 AppManifest interface to bootstrap both an Apache Isis web application, and also its integration tests. ","id":257661017},"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 from 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 re
 sponsible 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 AuditingServiceInternal 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\u2019s perspective, which means including the user interface.  For mos
 t 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 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 fac
 t, 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\u2019s perspective, which means including the user interface. ","id":273843820},"273985863":{"title":"addTo\u2026\u200b()","url":"guides/rgcms/rgcms.html#_rgcms_methods_prefixes_addTo","body":"addTo\u2026\u200b()  The addTo\u2026\u200b() 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\u2026\u200b()` ","description":" The addTo\u2026\u200b() 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 provi
 des guidance on building a domain application. We don\u2019t mandate any particular design, but we suggest one with no more than 3 to 6 domain entities in the first instance. If you\u2019re 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\u2019t mandate any particular design, but we suggest one with no more than 3 to 6 domain entities in the first instance. If you\u2019re 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 return 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 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 SimpleObject to Customer) without having to waste time deleting lots of generated code.  If you run into issues, please don\u2019t 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(\u2026\u200b) 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(\u2026\u200b) method, else is done implicitly when the t
 ransaction commits at the end of the user request. ","id":285898371},"287120012":{"title":"Actions","url":"guides/ugfun/ugfun.html#_actions_2","body":"Actions ","description":"","id":287120012},"288377989":{"title":"Philosophy and Architecture","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 can be closed with either OK or the Esc key. ","description":" The copy URL dialog is typically obtained by clicking on the icon. ","id":288392697},"291813215":{"title":"Raisi
 ng events programmatically","url":"guides/rgant/rgant.html#_raising_events_programmatically","body":"Raising events programmatically  Normally events are only raised for interactions through the UI. However, events can be raised programmatically either by calling the EventBusService API directly, or by emulating the UI by wrapping the target object using the WrapperFactory domain service. ","description":" Normally events are only raised for interactions through the UI. However, events can be raised programmatically either by calling the EventBusService API directly, or by em

<TRUNCATED>