blob: d1e0bd79d769d9419957bc9c93e72a4a36f366ac [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Untitled :: causeway</title>
<link rel="canonical" href="https://causeway.apache.org/refguide/latest/applib/index/annotation/hooks/Property_026-domain-events.html">
<meta name="generator" content="Antora 3.1.1">
<link rel="stylesheet" href="../../../../../../_/css/site.css">
<link rel="stylesheet" href="../../../../../../_/css/site-custom.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,700,700i|Raleway:300,400,500,700,800|Montserrat:300,400,700" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css"/>
<link rel="home" href="https://causeway.apache.org" title="causeway">
</head>
<body class="article">
<header class="header">
<nav class="navbar">
<div class="navbar-brand">
<a class="navbar-item" href="https://causeway.apache.org">
<span class="icon">
<img src="../../../../../../_/img/causeway-logo-no-words-65x48.png"></img>
</span>
<span class="navbar-title">causeway</span>
</a>
<button class="navbar-burger" data-target="topbar-nav">
<span></span>
<span></span>
<span></span>
</button>
</div>
<div id="topbar-nav" class="navbar-menu">
<a class="navbar-end">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Quick Start</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Starter Apps</span>
<a class="navbar-item" href="../../../../../../docs/latest/starters/helloworld.html">Hello World</a>
<a class="navbar-item" href="../../../../../../docs/latest/starters/simpleapp.html">Simple App</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Learning &amp; Tutorials</span>
<a class="navbar-item" href="../../../../../../docs/latest/reference/about.html">Reference App</a>
<a class="navbar-item" href="https://danhaywood.gitlab.io/isis-petclinic-tutorial-docs/petclinic/1.16.2/intro.html">Petclinic</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Resources</span>
<a class="navbar-item" href="../../../../../../docs/latest/resources/cheatsheet.html">Cheatsheet</a>
<a class="navbar-item" href="../../../../../../docs/latest/resources/icons.html">Icons</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Guides</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Core</span>
<a class="navbar-item" href="../../../../../../userguide/latest/about.html">User Guide</a>
<a class="navbar-item" href="../../../../../../refguide/latest/about.html">Reference Guide</a>
<a class="navbar-item" href="../../../../../../testing/latest/about.html">Testing Guide</a>
<a class="navbar-item" href="../../../../../../security/latest/about.html">Security Guide</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">For use in apps</span>
<a class="navbar-item" href="../../../../../../valuetypes/latest/about.html">Value Types</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Development</span>
<a class="navbar-item" href="../../../../../../setupguide/latest/about.html">Setup Guide</a>
<a class="navbar-item" href="../../../../../../conguide/latest/about.html">Contributors' Guide</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Components</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Security</span>
<a class="navbar-item" href="../../../../../../security/latest/bypass/about.html">Bypass</a>
<a class="navbar-item" href="../../../../../../security/latest/simple/about.html">Simple</a>
<a class="navbar-item" href="../../../../../../security/latest/shiro/about.html">Shiro</a>
<a class="navbar-item" href="../../../../../../security/latest/spring/about.html">Spring</a>
<a class="navbar-item" href="../../../../../../security/latest/keycloak/about.html">Keycloak</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Viewers</span>
<a class="navbar-item" href="../../../../../../vw/latest/about.html">Web UI (Wicket)</a>
<a class="navbar-item" href="../../../../../../gqlv/latest/about.html">GraphQL API</a>
<a class="navbar-item" href="../../../../../../vro/latest/about.html">REST API (Restful Objects)</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Persistence</span>
<a class="navbar-item" href="../../../../../../pjpa/latest/about.html">JPA (EclipseLink)</a>
<a class="navbar-item" href="../../../../../../pjdo/latest/about.html">JDO (DataNucleus)</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Extensions</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Core</span>
<a class="navbar-item" href="../../../../../../userguide/latest/commandlog/about.html">Command Log</a>
<a class="navbar-item" href="../../../../../../userguide/latest/docgen/about.html">Doc Gen</a>
<a class="navbar-item" href="../../../../../../userguide/latest/executionlog/about.html">Execution Log</a>
<a class="navbar-item" href="../../../../../../userguide/latest/executionoutbox/about.html">Execution Outbox</a>
<a class="navbar-item" href="../../../../../../userguide/latest/executionrepublisher/about.html">Execution Republisher</a>
<a class="navbar-item" href="../../../../../../userguide/latest/excel/about.html">Excel</a>
<a class="navbar-item" href="../../../../../../userguide/latest/flyway/about.html">Flyway</a>
<a class="navbar-item" href="../../../../../../userguide/latest/layoutloaders/about.html">Layout Loaders</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Security</span>
<a class="navbar-item" href="../../../../../../security/latest/secman/about.html">Secman</a>
<a class="navbar-item" href="../../../../../../security/latest/audittrail/about.html">Audit Trail</a>
<a class="navbar-item" href="../../../../../../security/latest/spring-oauth2/about.html">Spring OAuth2 Integration</a>
<a class="navbar-item" href="../../../../../../security/latest/shiro-realm-ldap/about.html">LDAP Realm for Shiro</a>
<a class="navbar-item" href="../../../../../../security/latest/sessionlog/about.html">Session Log</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Web UI (Wicket)</span>
<a class="navbar-item" href="../../../../../../vw/latest/fullcalendar/about.html">Full Calendar</a>
<a class="navbar-item" href="../../../../../../vw/latest/pdfjs/about.html">pdf.js</a>
<a class="navbar-item" href="../../../../../../vw/latest/sse/about.html">Server Side Events</a>
<a class="navbar-item" href="../../../../../../vw/latest/tabular/about.html">Tabular Download</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">REST API (Restful Objects)</span>
<a class="navbar-item" href="../../../../../../vro/latest/cors/about.html">CORS</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Support</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Contact</span>
<a class="navbar-item" href="../../../../../../docs/latest/support/slack-channel.html">Slack</a>
<a class="navbar-item" href="../../../../../../docs/latest/support/mailing-list.html">Mailing Lists</a>
<a class="navbar-item" href="https://issues.apache.org/jira/browse/CAUSEWAY">JIRA</a>
<a class="navbar-item" href="https://stackoverflow.com/questions/tagged/causeway">Stack Overflow</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Releases</span>
<a class="navbar-item" href="../../../../../../docs/latest/downloads/how-to.html">Downloads</a>
<a class="navbar-item" href="../../../../../../relnotes/latest/about.html">Release Notes</a>
<hr class="navbar-divider"/>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Framework</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Process</span>
<a class="navbar-item" href="../../../../../../comguide/latest/about.html">Committers' Guide</a>
<a class="navbar-item" href="../../../../../../tooling/latest/about.html">Tooling</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Automated Analysis</span>
<a class="navbar-item" href="https://sonarcloud.io/dashboard?id=apache_causeway">SonarCloud.io</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Interim Builds</span>
<a class="navbar-item" href="../../../../../../comguide/latest/nightly-builds.html">Nightly builds</a>
<a class="navbar-item" href="../../../../../../comguide/latest/weekly-builds.html">Weekly builds</a>
<a class="navbar-item" href="https://apache-causeway-committers.github.io/causeway-nightly">Website Preview (not ASF hosted)</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Development</span>
<a class="navbar-item" href="../../../../../../core/latest/about.html">Internal Design Docs</a>
<a class="navbar-item" href="../../../../../../regressiontests/latest/about.html">Regression Tests</a>
<a class="navbar-item" href="../../../../../../incubator/latest/about.html">Incubator</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Thanks</span>
<a class="navbar-item" href="../../../../../../more-thanks/latest/more-thanks.html">Acknowledgements</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">ASF</a>
<div class="navbar-dropdown">
<a class="navbar-item" href="http://www.apache.org/">Apache Homepage</a>
<a class="navbar-item" href="https://www.apache.org/events/current-event">Events</a>
<a class="navbar-item" href="https://www.apache.org/licenses/">License</a>
<a class="navbar-item" href="https://www.apache.org/security/">Security</a>
<a class="navbar-item" href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy</a>
<a class="navbar-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
<a class="navbar-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
<hr class="navbar-divider"/>
<a class="navbar-item" href="https://whimsy.apache.org/board/minutes/Causeway.html">PMC board minutes</a>
</div>
</div>
<a class="navbar-item" href="../../../../../../docs/latest/about.html">
<span class="icon">
<img src="../../../../../../_/img/home.png"></img>
</span>
</a>
</div>
</div>
</nav>
</header>
<div class="body ">
<div class="nav-container" data-component="refguide" data-version="3.0.0">
<aside class="nav">
<div class="panels">
<div class="nav-panel-search hide-for-print">
<input id="algolia-search-input" placeholder="Search"></span>
</div>
<div class="nav-panel-pagination">
<a class="page-previous disabled" rel="prev" href="" title=""><span></span></a>
<a class="page-next disabled" rel="next"
href="" title=""><span></span></a>
<!--
page.parent doesn't seem to be set...
<a class="page-parent disabled" rel="prev" href="" title=""><span></span></a>
-->
</div>
<div class="nav-panel-menu is-active" data-panel="menu">
<nav class="nav-menu">
<h3 class="title"><a href="../../../../about.html">Reference Guide</a></h3>
<ul class="nav-list">
<li class="nav-item" data-depth="0">
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../applib-svc/about.html">Domain Services</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/acceptheader/AcceptHeaderService.html">AcceptHeaderService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/appfeatui/ApplicationFeatureMenu.html">ApplicationFeatureMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/appfeat/ApplicationFeatureRepository.html">ApplicationFeatureRepository</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/bookmark/BookmarkService.html">BookmarkService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/bookmarkui/BookmarkUiService.html">BookmarkUiService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/clock/ClockService.html">ClockService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/commanddto/processor/spi/CommandDtoProcessorService.html">CommandDtoProcessorService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/command/CommandExecutorService.html">CommandExecutorService</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../services/publishing/spi/CommandSubscriber.html">CommandSubscriber</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../services/publishing/log/CommandLogger.html">CommandLogger</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/confview/ConfigurationMenu.html">ConfigurationMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/confview/ConfigurationViewService.html">ConfigurationViewService</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../services/conmap/ContentMappingService.html">ContentMappingService</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../services/commanddto/conmap/ContentMappingServiceForCommandDto.html">ContentMappingServiceForCommandDto</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../services/commanddto/conmap/ContentMappingServiceForCommandsDto.html">ContentMappingServiceForCommandsDto</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/linking/DeepLinkService.html">DeepLinkService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/userreg/EmailNotificationService.html">EmailNotificationService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/email/EmailService.html">EmailService</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../services/publishing/spi/EntityChangesSubscriber.html">EntityChangesSubscriber</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../services/publishing/log/EntityChangesLogger.html">EntityChangesLogger</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../services/publishing/spi/EntityPropertyChangeSubscriber.html">EntityPropertyChangeSubscriber</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../services/publishing/log/EntityPropertyChangeLogger.html">EntityPropertyChangeLogger</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../services/publishing/spi/ExecutionSubscriber.html">ExecutionSubscriber</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../services/publishing/log/ExecutionLogger.html">ExecutionLogger</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/error/ErrorReportingService.html">ErrorReportingService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/eventbus/EventBusService.html">EventBusService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/exceprecog/ExceptionRecognizerService.html">ExceptionRecognizerService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/factory/FactoryService.html">FactoryService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/grid/GridLoaderService.html">GridLoaderService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/grid/GridService.html">GridService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/grid/GridSystemService.html">GridSystemService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/health/HealthCheckService.html">HealthCheckService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/hint/HintIdProvider.html">HintIdProvider</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/hint/HintStore.html">HintStore</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/homepage/HomePageResolverService.html">HomePageResolverService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/bookmark/IdStringifier.html">IdStringifier</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/user/ImpersonateMenu.html">ImpersonateMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/user/ImpersonateMenuAdvisor.html">ImpersonateMenuAdvisor</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/iactn/InteractionProvider.html">InteractionProvider</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/iactnlayer/InteractionLayerTracker.html">InteractionLayerTracker</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/iactnlayer/InteractionService.html">InteractionService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/jaxb/JaxbService.html">JaxbService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/layout/LayoutService.html">LayoutService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/layout/LayoutServiceMenu.html">LayoutServiceMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/i18n/LanguageProvider.html">LanguageProvider</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/locale/LocaleChoiceProvider.html">LocaleChoiceProvider</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/menu/MenuBarsLoaderService.html">MenuBarsLoaderService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/menu/MenuBarsService.html">MenuBarsService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/message/MessageService.html">MessageService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/metamodel/MetaModelService.html">MetaModelService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/metamodel/MetaModelServiceMenu.html">MetaModelServiceMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/metrics/MetricsService.html">MetricsService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/queryresultscache/QueryResultsCache.html">QueryResultsCache</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/repository/RepositoryService.html">RepositoryService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/routing/RoutingService.html">RoutingService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/scratchpad/Scratchpad.html">Scratchpad</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/inject/ServiceInjector.html">ServiceInjector</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/registry/ServiceRegistry.html">ServiceRegistry</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/session/SessionSubscriber.html">SessionSubscriber</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/sitemap/SitemapService.html">SitemapService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/sitemap/SitemapServiceMenu.html">SitemapServiceMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/sudo/SudoService.html">SudoService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/swagger/SwaggerService.html">SwaggerService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/tablecol/TableColumnOrderService.html">TableColumnOrderService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/tablecol/TableColumnVisibilityService.html">TableColumnVisibilityService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/title/TitleService.html">TitleService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/i18n/TranslationService.html">TranslationService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/i18n/TranslationsResolver.html">TranslationsResolver</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/xactn/TransactionalProcessor.html">TransactionProcessor</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/xactn/TransactionService.html">TransactionService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/urlencoding/UrlEncodingService.html">UrlEncodingService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/userui/UserMenu.html">UserMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/userreg/UserRegistrationService.html">UserRegistrationService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/user/UserService.html">UserService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/wrapper/WrapperFactory.html">WrapperFactory</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/xml/XmlService.html">XmlService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../services/xmlsnapshot/XmlSnapshotService.html">XmlSnapshotService</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Viewer (Common Applib)</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../viewer/index/commons/applib/services/userprof/UserProfileUiService.html">UserProfileUiService</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../applib-ant/about.html">Annotations</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../Action.html">@Action</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../ActionLayout.html">@ActionLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../Collection.html">@Collection</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../CollectionLayout.html">@CollectionLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../DomainObject.html">@DomainObject</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../DomainObjectLayout.html">@DomainObjectLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../DomainService.html">@DomainService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../DomainServiceLayout.html">@DomainServiceLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../Parameter.html">@Parameter</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../ParameterLayout.html">@ParameterLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../Property.html">@Property</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../PropertyLayout.html">@PropertyLayout</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Other Causeway Annotations</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../HomePage.html">@HomePage</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../Title.html">@Title</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../MinLength.html">@MinLength</a>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">include/exclude</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../Domain_Include.html">@Domain.Include</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../Domain_Exclude.html">@Domain.Exclude</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../MemberSupport.html">@MemberSupport</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../ObjectSupport.html">@ObjectSupport</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../ObjectLifecycle.html">@ObjectLifecycle</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../Programmatic.html">@Programmatic</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">architecture</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../Module.html">@Module</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../InteractionScope.html">@InteractionScope</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">custom value type support</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../Value.html">@Value</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../ValueSemantics.html">@ValueSemantics</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Java EE Annotations</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/Digits.html">@Digits</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/Nullable.html">@Nullable</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/Pattern.html">@Pattern</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">JAXB</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/XmlJavaTypeAdapter.html">@XmlJavaTypeAdapter</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/XmlRootElement.html">@XmlRootElement</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">JPA</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/Entity.html">@Entity</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">JDO</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/Column.html">@Column</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/Discriminator.html">@Discriminator</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/NotPersistent.html">@NotPersistent</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/PersistenceCapable.html">@PersistenceCapable</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../applib-ant/PrimaryKey.html">@PrimaryKey</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../applib-methods/about.html">Methods</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../applib-methods/prefixes.html">Supporting Methods</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../applib-methods/ui-hints.html">UI Hint Methods</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../applib-methods/lifecycle.html">Lifecycle Methods</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../applib-classes/about.html">Classes</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../applib-classes/events.html">Events</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../applib-classes/non-persisted-objects.html">Non-persisted objects</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../ViewModel.html">ViewModel</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../applib-classes/layout.html">Layout</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../applib-classes/value-types.html">Value Types</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../value/Blob.html">Blob</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../value/Clob.html">Clob</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../value/Markup.html">Markup</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../value/LocalResourcePath.html">LocalResourcePath</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../value/Password.html">Password</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../applib-classes/utility.html">Utility Classes</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../util/Enums.html">Enums</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../util/ObjectContracts.html">ObjectContracts</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../util/Reasons.html">Reasons</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../util/ReasonBuffer.html">ReasonBuffer</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../util/ReasonBuffer2.html">ReasonBuffer2</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../util/TitleBuffer.html">TitleBuffer</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../applib-classes/mixees-and-mixins.html">Mixees and Mixins</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/layout/Object_downloadLayout.html">Object_downloadLayout</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/metamodel/Object_downloadMetamodelXml.html">Object_downloadMetamodelXml</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/metamodel/Object_rebuildMetamodel.html">Object_rebuildMetamodel</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/metamodel/Object_logicalTypeName.html">Object_logicalTypeName</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/metamodel/Object_objectIdentifier.html">Object_objectIdentifier</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../viewer/index/wicket/applib/mixins/Object_clearHints.html">Object_clearHints</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/rest/Object_openRestApi.html">Object_openRestApi</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/dto/Dto_downloadXml.html">Dto_downloadXml</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/dto/Dto_downloadXsd.html">Dto_downloadXsd</a>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">JDO</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../persistence/index/jdo/datanucleus/mixins/Persistable_downloadJdoMetadata.html">Persistable_downloadJdoMetadata</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../persistence/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.html">Persistable_datanucleusVersionLong</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../persistence/index/jdo/datanucleus/mixins/Persistable_datanucleusVersionTimestamp.html">Persistable_datanucleusVersionTimestamp</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Command Log</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../extensions/index/commandlog/applib/contributions/Object_recentCommands.html">Object_recentCommands</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../extensions/index/commandlog/applib/contributions/HasInteractionId_commandLogEntry.html">HasInteraction_commandLogEntry</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../extensions/index/commandlog/applib/contributions/HasUsername_recentCommandsByUser.html">HasUsername_recentCommandsByUser</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Execution Log</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../extensions/index/executionlog/applib/contributions/Object_recentExecutions.html">Object_recentExecutions</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../extensions/index/executionlog/applib/contributions/HasInteractionId_executionLogEntries.html">HasInteractionId_executionLogEntries</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../mixins/system/HasTarget_openTargetObject.html">HasTarget_openTargetObject</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../applib-classes/spec.html">Specification pattern</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../config/about.html">Configuration</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.applib.html">Applib</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.core.config.html">Core Configuration</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.core.meta-model.html">Core MetaModel</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.core.meta-model.introspector.html">Core MetaModel Introspection</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.core.meta-model.validator.html">MetaModel Validator</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.core.runtime.html">Core Runtime</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.core.runtime-services.html">Core Runtime Services</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.persistence.schema.html">Core Persistence Schema</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.persistence.commons.html">Core Persistence Commons</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.security.shiro.html">Shiro Security Implementation</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.security.keycloak.html">Keycloak Security Implementation</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.security.spring.html">Spring Security Implementation</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.viewer.common.html">Common Config for Viewers</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.viewer.graphql.html">GraphQL API</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.viewer.restfulobjects.html">REST API (Restful Objects Viewer)</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.viewer.wicket.html">Wicket Viewer</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/datanucleus.html">DataNucleus Configuration</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/eclipselink.html">Eclipselink Configuration</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/resteasy.html">RestEasy Configuration</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.extensions.html">Extensions</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.value-types.html">Value types</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/causeway.testing.html">Testing</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../config/sections/Other.html">Other</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../schema/about.html">Schema</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../schema/mml.html">MetaModel</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../schema/cmd.html">Command</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../schema/ixn.html">Interaction</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../schema/chg.html">Changes</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../schema/common.html">Common</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</div>
<div class="nav-panel-explore" data-panel="explore">
<div class="context">
<span class="title">Reference Guide</span>
<span class="version">3.0.0</span>
</div>
<ul class="components">
<li class="component">
<span class="title"> </span>
<ul class="versions">
<li class="version">
<a href="../../../../../../docs/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../docs/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Committers' Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../comguide/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../comguide/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Contributors' Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../conguide/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../conguide/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Design Docs</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../core/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../core/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Extensions</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../extensions/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../extensions/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">GraphQL Viewer</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../gqlv/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../gqlv/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Incubator Catalog</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../incubator/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../incubator/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">JDO/DataNucleus</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../pjdo/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../pjdo/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">JPA</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../pjpa/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../pjpa/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component is-current">
<span class="title">Reference Guide</span>
<ul class="versions">
<li class="version is-current">
<a href="../../../../about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">regressiontests</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../regressiontests/latest/index.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../regressiontests/2.0.0/index.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Release Notes</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../relnotes/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../relnotes/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">REST API (Restful Objects Viewer)</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../vro/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../vro/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Security Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../security/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../security/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Setup Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../setupguide/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../setupguide/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Testing Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../testing/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../testing/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Tooling</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../tooling/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../tooling/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Tutorials</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../tutorials/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../tutorials/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">User Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../userguide/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../userguide/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Value Types Catalog</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../valuetypes/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../valuetypes/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Web UI (Wicket Viewer)</span>
<ul class="versions">
<li class="version">
<a href="../../../../../../vw/latest/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../../vw/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</aside>
</div>
<main role="main">
<div class="toolbar" role="navigation">
<button class="nav-toggle"></button>
<a href="../../../../../../docs/latest/about.html" class="home-link"></a>
<nav class="breadcrumbs" aria-label="breadcrumbs">
</nav>
<div class="page-versions">
<button class="version-menu-toggle" title="Show other versions of page">3.0.0</button>
<div class="version-menu">
<a class="version is-current" href="Property_026-domain-events.html">3.0.0</a>
<a class="version" href="../../../../../2.0.0/applib/index/annotation/hooks/Property_026-domain-events.html">2.0.0</a>
</div>
</div>
<div class="edit-this-page"><a href="https://github.com/apache/causeway/edit/3.0.0/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Property_026-domain-events.adoc">Edit</a></div>
</div>
<article class="doc">
<a name="section-top"></a>
<div class="sect2">
<h3 id="domain-events"><a class="anchor" href="#domain-events"></a>Domain events</h3>
<div class="paragraph">
<p>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&#8217;s properties, the events that are fired are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>hide phase: to check that the property is visible (has not been hidden)</p>
</li>
<li>
<p>disable phase: to check that the property is usable (has not been disabled)</p>
</li>
<li>
<p>validate phase: to check that the property&#8217;s arguments are valid (to modify/clear its value)</p>
</li>
<li>
<p>pre-execute phase: before the modification of the property</p>
</li>
<li>
<p>post-execute: after the modification of the property</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>Subscribers subscribe through the <a href="../../services/eventbus/EventBusService.html" class="xref page">EventBusService</a> and can influence each of these phases.</p>
</div>
<div class="paragraph">
<p>By default the event raised is <code>PropertyDomainEvent.Default</code>.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">import lombok.Getter;
import lombok.Setter;
public class ToDoItem {
@Property()
@Getter @Setter
private LocalDate dueBy;
// ...
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <a href="../Property.html#domainEvent" class="xref page">domainEvent()</a> element allows a custom subclass to be emitted allowing more precise subscriptions (to those subclasses) to be defined instead.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">import lombok.Getter;
import lombok.Setter;
public class ToDoItem {
public static class DueByChangedEvent
extends PropertyDomainEvent&lt;ToDoItem, LocalDate&gt; { } <i class="conum" data-value="1"></i><b>(1)</b>
@Property(domainEvent=ToDoItem.DueByChangedEvent)
@Getter @Setter
private LocalDate dueBy;
// ...
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>inherit from <code>PropertyDomainEvent&lt;T,P&gt;</code> where <code>T</code> is the type of the domain object being interacted with, and <code>P</code> is the type of the property (<code>LocalDate</code> in this example)</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>The benefit is that subscribers can be more targeted as to the events that they subscribe to.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>The framework provides a no-arg constructor and will initialize the domain event using (non-API) setters rather than through the constructor.
This substantially reduces the boilerplate required in subclasses because no explicit constructor is required.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="sect3">
<h4 id="subscribers"><a class="anchor" href="#subscribers"></a>Subscribers</h4>
<div class="paragraph">
<p>Subscribers (which must be domain services) subscribe to events posted through the <a href="../../services/eventbus/EventBusService.html" class="xref page">EventBusService</a>.</p>
</div>
<div class="paragraph">
<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class SomeSubscriber {
@EventListener(PropertyDomainEvent.class)
public void on(PropertyDomainEvent ev) {
// ...
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class SomeSubscriber {
@EventListener(ToDoItem.DueByChangedEvent.class)
public void on(ToDoItem.DueByChangedEvent ev) {
// ...
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The subscriber&#8217;s method is called (up to) 5 times:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>whether to veto visibility (hide)</p>
</li>
<li>
<p>whether to veto usability (disable)</p>
</li>
<li>
<p>whether to veto execution (validate)</p>
</li>
<li>
<p>steps to perform prior to the property being modified</p>
</li>
<li>
<p>steps to perform after the property has been modified.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The subscriber can distinguish these by calling <code>ev.getEventPhase()</code>.
Thus the general form is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class SomeSubscriber {
public void on(PropertyDomainEvent ev) {
switch(ev.getEventPhase()) {
case HIDE: <i class="conum" data-value="1"></i><b>(1)</b>
break;
case DISABLE: <i class="conum" data-value="2"></i><b>(2)</b>
break;
case VALIDATE: <i class="conum" data-value="3"></i><b>(3)</b>
break;
case EXECUTING:
break;
case EXECUTED:
break;
}
}
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>call <code>ev.hide()</code> or <code>ev.veto("")</code> to hide the property</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>call <code>ev.disable("&#8230;&#8203;")</code> or <code>ev.veto("&#8230;&#8203;")</code> to disable the property</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>call ev.invalidate("&#8230;&#8203;") or ev.veto("&#8230;&#8203;") if proposed new value for property is invalid</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>It is also possible to abort the transaction during the executing or executed phases by throwing an exception.
If the exception is a subtype of <code>RecoverableException</code> then the exception will be rendered as a user-friendly warning (eg Growl/toast) rather than an error.</p>
</div>
</div>
<div class="sect3">
<h4 id="default-doop-and-noop-events"><a class="anchor" href="#default-doop-and-noop-events"></a>Default, Doop and Noop events</h4>
<div class="paragraph">
<p>If the <a href="../Property.html#domainEvent" class="xref page">domainEvent()</a> element is not explicitly specified (is left as its default value, <code>PropertyDomainEvent.Default</code>), then the framework will, by default, post an event.</p>
</div>
<div class="paragraph">
<p>If this is not required, then the <a href="../../../../config/sections/causeway.applib.html#causeway.applib.annotation.property.domain-event.post-for-default" class="xref page">causeway.applib.annotation.property.domain-event.post-for-default</a> configuration property can be set to "false"; this will disable posting.</p>
</div>
<div class="paragraph">
<p>On the other hand, if the <code>domainEvent</code> has been explicitly specified to some subclass, then an event will be posted.
The framework provides <code>PropertyDomainEvent.Doop</code> as such a subclass, so setting the <code>domainEvent</code> attribute to this class will ensure that the event to be posted, irrespective of the configuration property setting.</p>
</div>
<div class="paragraph">
<p>And, conversely, the framework also provides <code>PropertyDomainEvent.Noop</code>; if <code>domainEvent</code> attribute is set to this class, then no event will be posted.</p>
</div>
</div>
<div class="sect3">
<h4 id="raising-events-programmatically"><a class="anchor" href="#raising-events-programmatically"></a>Raising events programmatically</h4>
<div class="paragraph">
<p>Normally events are only raised for interactions through the UI.
However, events can be raised programmatically either by calling the <a href="../../services/eventbus/EventBusService.html" class="xref page">EventBusService</a> API directly, or by emulating the UI by wrapping the target object using the <a href="../../services/wrapper/WrapperFactory.html" class="xref page">WrapperFactory</a> domain service.</p>
</div>
</div>
</div>
</article>
<aside class="article-aside toc hide-for-print" role="navigation">
<p class="toc-title">On this page</p>
<div id="article-toc"></div>
</aside>
</main>
</div>
<footer class="footer">
<div class="content">
<div class="copyright">
<p>
Copyright © 2010~2023 The Apache Software Foundation, licensed under the Apache License, v2.0.
<br/>
Apache, the Apache feather logo, Apache Causeway, and the Apache Causeway project logo are all trademarks of The Apache Software Foundation.
</p>
</div>
<div class="revision">
<p>Revision: website.20240325-2342</p>
</div>
</div>
</footer>
<script src="../../../../../../_/js/site.js"></script>
<script async src="../../../../../../_/js/vendor/highlight.js"></script>
<script src="../../../../../../_/js/vendor/jquery-3.4.1.min.js"></script>
<script src="../../../../../../_/js/vendor/jquery-ui-1.12.1.custom.widget-only.min.js"></script>
<script src="../../../../../../_/js/vendor/jquery.tocify.min.js"></script>
<script>
$(function() {
$("#article-toc").tocify( {
showEffect: "slideDown",
hashGenerator: "pretty",
hideEffect: "slideUp",
selectors: "h2, h3",
scrollTo: 120,
smoothScroll: true,
theme: "jqueryui",
highlightOnScroll: true
} );
});
</script>
<script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js"></script>
<script>
function focusSearchInput () { document.querySelector('#algolia-search-input').focus() }
var search = docsearch({
appId: '5ISP5TFAEN',
apiKey: '0fc51c28b4ad46e7318e96d4e97fab7c',
indexName: 'causeway-apache-org',
inputSelector: '#algolia-search-input',
autocompleteOptions: { hint: false, keyboardShortcuts: ['s'] },
debug: false,
}).autocomplete
search.on('autocomplete:closed', function () { search.autocomplete.setVal() })
focusSearchInput()
window.addEventListener('load', focusSearchInput);
</script>
<!--
docsearch options:
https://docsearch.algolia.com/docs/behavior/
-->
<!--
https://www.algolia.com/doc/api-reference/api-parameters/
algoliaOptions: { hitsPerPage: 6 },
-->
</body>
</html>