diff --git a/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Action_026-command-processing.adoc b/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Action_026-command-processing.adoc index bdbdf554b19..a6edefc8e5a 100644 --- a/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Action_026-command-processing.adoc +++ b/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Action_026-command-processing.adoc @@ -12,13 +12,13 @@ The main uses cases are: * as a means to audit (persist) commands, by implementing the xref:refguide:applib:index/services/publishing/spi/CommandSubscriber.adoc[CommandSubscriber] SPI. + -The xref:userguide:command-log:about.adoc[Command Log] extension _does_ provide such an implementation. +The xref:userguide:commandlog:about.adoc[Command Log] extension _does_ provide such an implementation. + TIP: Another option to achieve this is to use the xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber] SPI. * to replay commands onto a secondary system, for regression testing. + -This is implemented by the xref:userguide:command-replay:about.adoc[Command Replay] extension, working in conjunction with the xref:userguide:command-log:about.adoc[Command Log] extension. +This is implemented by the xref:userguide:commandreplay:about.adoc[Command Replay] extension, working in conjunction with the xref:userguide:commandlog:about.adoc[Command Log] extension. The xref:refguide:applib:index/annotation/Action.adoc#commandPublishing[commandPublishing()] element can be used to explicitly enable or disable command publishing for the action invocation. diff --git a/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Action_030-see-also.adoc b/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Action_030-see-also.adoc index de4ed355372..7aef2e43098 100644 --- a/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Action_030-see-also.adoc +++ b/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Action_030-see-also.adoc @@ -8,11 +8,11 @@ + for actions where command publishing (as per xref:refguide:applib:index/annotation/Action.adoc#commandPublishing[@Action#commandPublishing()]) is enabled -** xref:userguide:command-log:about.adoc[Command Log] extension +** xref:userguide:commandlog:about.adoc[Command Log] extension + provides an implementation that simply logs actions using the logging library -** xref:userguide:command-replay:about.adoc[Command Replay] extension +** xref:userguide:commandreplay:about.adoc[Command Replay] extension + provides an implementation to replicate commands from a primary to a secondary system. + diff --git a/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Property_028-command-processing.adoc b/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Property_028-command-processing.adoc index c1eee9e3eb5..a0fc4322af7 100644 --- a/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Property_028-command-processing.adoc +++ b/antora/components/refguide-index/modules/applib/pages/index/annotation/hooks/Property_028-command-processing.adoc @@ -12,13 +12,13 @@ The main uses cases are: * as a means to audit (persist) commands, by implementing the xref:refguide:applib:index/services/publishing/spi/CommandSubscriber.adoc[CommandSubscriber] SPI. + -The xref:userguide:command-log:about.adoc[Command Log] extension _does_ provide such an implementation. +The xref:userguide:commandlog:about.adoc[Command Log] extension _does_ provide such an implementation. + TIP: Another option to achieve this is to use the xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber] SPI. * to replay commands onto a secondary system, for regression testing. + -This is implemented by the xref:userguide:command-replay:about.adoc[Command Replay] extension, working in conjunction with the xref:userguide:command-log:about.adoc[Command Log] extension. +This is implemented by the xref:userguide:commandreplay:about.adoc[Command Replay] extension, working in conjunction with the xref:userguide:commandlog:about.adoc[Command Log] extension. The xref:refguide:applib:index/annotation/Property.adoc#commandPublishing[commandPublishing()] element can be used to explicitly enable or disable command publishing for the property edit. diff --git a/antora/components/refguide-index/modules/applib/pages/index/mixins/system/hooks/HasInteractionId_see-also.adoc b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/hooks/HasInteractionId_see-also.adoc index 3a58661e6be..00deea84a6a 100644 --- a/antora/components/refguide-index/modules/applib/pages/index/mixins/system/hooks/HasInteractionId_see-also.adoc +++ b/antora/components/refguide-index/modules/applib/pages/index/mixins/system/hooks/HasInteractionId_see-also.adoc @@ -7,8 +7,8 @@ Some of the extension/mapping modules that have entities that implement this mixee are: -* xref:security:audit-trail:about.adoc[Auditer] module: `AuditEntry` entity -* xref:userguide:command-log:about.adoc[Command Log] module: `CommandJdo` entity +* xref:security:audittrail:about.adoc[Auditer] module: `AuditEntry` entity +* xref:userguide:commandlog:about.adoc[Command Log] module: `CommandJdo` entity * xref:mappings:outbox-publisher:about.adoc[Outbox Publisher] module: `OutboxEvent` entity diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/command/hooks/CommandExecutorService_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/command/hooks/CommandExecutorService_020-examples-and-usage.adoc index cc9095d143c..408e6f207c2 100644 --- a/antora/components/refguide-index/modules/applib/pages/index/services/command/hooks/CommandExecutorService_020-examples-and-usage.adoc +++ b/antora/components/refguide-index/modules/applib/pages/index/services/command/hooks/CommandExecutorService_020-examples-and-usage.adoc @@ -8,11 +8,11 @@ The `CommandExecutorService` domain service is provides the ability to execute a specified xref:refguide:applib:index/services/command/Command.adoc[Command], optionally running the command with the identity of the user captured in that xref:refguide:applib:index/services/command/Command.adoc[Command]. -// TODO - v2 this is out of date; reference the command-replay service, now part of framework. +// TODO - v2 this is out of date; reference the commandreplay service, now part of framework. //In fact, the service requires that the implementation of the xref:refguide:applib:index/services/command/Command.adoc[Command] being executed implements the `CommandWithDto` sub-interface. //This allows the xref:refguide:schema:cmd.adoc[CommandDto] memento to be extracted, from which the action can be invoked/property edited. // //The primary use case for this service is to allow the replay of commands, eg for regression testing. -//This is implemented by the (non-ASF) link:https://platform.incode.org/modules/spi/command/spi-command-replay.html[command replay module]. +//This is implemented by the (non-ASF) link:https://platform.incode.org/modules/spi/command/spi-commandreplay.html[command replay module]. //(The command replay module also provides a decorator implementation of this service that allows the command to be re-executed at the same _time_ as the original command, leveraging the `TickingClock` implementation provided by the framework). diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/commanddto/processor/hooks/CommandDtoProcessorService_020-examples-and-usage.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/commanddto/processor/hooks/CommandDtoProcessorService_020-examples-and-usage.adoc index e3d3b6784dd..f70423a4ede 100644 --- a/antora/components/refguide-index/modules/applib/pages/index/services/commanddto/processor/hooks/CommandDtoProcessorService_020-examples-and-usage.adoc +++ b/antora/components/refguide-index/modules/applib/pages/index/services/commanddto/processor/hooks/CommandDtoProcessorService_020-examples-and-usage.adoc @@ -5,12 +5,12 @@ == Usage Having a DTO representation of xref:refguide:applib:index/services/command/Command.adoc[Command]s (or more precisely, any object implementing `HasCommandDto` offers the ability to move or copy it across the network, for example to support replay scenarios. -This is used for example by xref:userguide:command-log:about.adoc[Command Log] extension to return persisted representations of commands. +This is used for example by xref:userguide:commandlog:about.adoc[Command Log] extension to return persisted representations of commands. The conversion is performed by an in-built implementation of the xref:refguide:applib:index/services/conmap/ContentMappingService.adoc[ContentMappingService] SPI. The `CommandDtoProcessorService` SPI provides a mechanism to post-process the `CommandDto` of any objects being serialized across the network. -For example, the xref:userguide:command-replay:about.adoc[Command Replay] extension provides an implementation in order to copy information about the outcome of each command on the primary system into the `userData` map of `CommandDto`. +For example, the xref:userguide:commandreplay:about.adoc[Command Replay] extension provides an implementation in order to copy information about the outcome of each command on the primary system into the `userData` map of `CommandDto`. Another use case is to strip out large blobs for performance reasons. diff --git a/antora/components/refguide-index/modules/applib/pages/index/services/conmap/hooks/ContentMappingService_010-implementation.adoc b/antora/components/refguide-index/modules/applib/pages/index/services/conmap/hooks/ContentMappingService_010-implementation.adoc index 42daf9c8b24..374e7165115 100644 --- a/antora/components/refguide-index/modules/applib/pages/index/services/conmap/hooks/ContentMappingService_010-implementation.adoc +++ b/antora/components/refguide-index/modules/applib/pages/index/services/conmap/hooks/ContentMappingService_010-implementation.adoc @@ -6,7 +6,7 @@ == Implementation The framework provides two implementations of this service, both to allow objects implementing `HasCommandDto` to be converted into serializable ``CommandDto``s, in other words XML. -This is used by the xref:userguide:command-log:about.adoc[Command Log] and xref:userguide:command-replay:about.adoc[Command Replay] extensions to allow commands to be replicated from a primary to secondary system, for regression testing. +This is used by the xref:userguide:commandlog:about.adoc[Command Log] and xref:userguide:commandreplay:about.adoc[Command Replay] extensions to allow commands to be replicated from a primary to secondary system, for regression testing. The implementations are: diff --git a/antora/components/refguide-index/modules/extensions/pages/index/commandreplay/primary/IsisModuleExtCommandReplayPrimary.adoc b/antora/components/refguide-index/modules/extensions/pages/index/commandreplay/primary/IsisModuleExtCommandReplayPrimary.adoc index 9b2bff5b0c7..d6cfd4bdc91 100644 --- a/antora/components/refguide-index/modules/extensions/pages/index/commandreplay/primary/IsisModuleExtCommandReplayPrimary.adoc +++ b/antora/components/refguide-index/modules/extensions/pages/index/commandreplay/primary/IsisModuleExtCommandReplayPrimary.adoc @@ -1,7 +1,7 @@ = IsisModuleExtCommandReplayPrimary :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -Activates with _Spring profile_ 'command-replay-primary'. +Activates with _Spring profile_ 'commandreplay-primary'. == API diff --git a/antora/components/refguide-index/modules/extensions/pages/index/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.adoc b/antora/components/refguide-index/modules/extensions/pages/index/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.adoc index 87086cd5b54..dd74dcf2f65 100644 --- a/antora/components/refguide-index/modules/extensions/pages/index/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.adoc +++ b/antora/components/refguide-index/modules/extensions/pages/index/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.adoc @@ -1,7 +1,7 @@ = IsisModuleExtCommandReplaySecondary :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -Activates with _Spring profile_ 'command-replay-secondary'. +Activates with _Spring profile_ 'commandreplay-secondary'. == API diff --git a/antora/components/refguide/modules/applib-classes/pages/mixees-and-mixins.adoc b/antora/components/refguide/modules/applib-classes/pages/mixees-and-mixins.adoc index 415f4406088..a1050befca4 100644 --- a/antora/components/refguide/modules/applib-classes/pages/mixees-and-mixins.adoc +++ b/antora/components/refguide/modules/applib-classes/pages/mixees-and-mixins.adoc @@ -89,7 +89,7 @@ Mixins that contribute to this mixee interface include: * xref:refguide:extensions:index/commandlog/impl/mixins/HasInteractionId_command.adoc[HasInteractionId_command] + -from xref:userguide:command-log:about.adoc[Comman Log] module. +from xref:userguide:commandlog:about.adoc[Comman Log] module. The closely related xref:refguide:applib:index/mixins/system/HasTransactionId.adoc[HasTransactionId] (a subtype of xref:refguide:applib:index/mixins/system/HasInteractionId.adoc[HasInteractionId]) can be implemented by any domain objects associated with a particular transaction within the outer xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction]. diff --git a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/contributee.adoc b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/contributee.adoc index b5d24fb6d3f..60478274f29 100644 --- a/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/contributee.adoc +++ b/antora/components/refguide/modules/applib-classes/pages/roles-mixins-contributees/contributee.adoc @@ -35,8 +35,8 @@ public interface HasUsername { Some of the extension/mapping modules that have domain entity/ies that implement this interface are: * xref:security:ROOT:about.adoc[SecMan extension]: `ApplicationUser` entity -* xref:security:audit-trail:about.adoc[Auditer] module: `AuditEntry` entity -* xref:userguide:command-log:about.adoc[Command Log] module: `CommandJdo` entity -* xref:security:session-log:about.adoc[Session Log] module: `SessionLogEntry` entity +* xref:security:audittrail:about.adoc[Auditer] module: `AuditEntry` entity +* xref:userguide:commandlog:about.adoc[Command Log] module: `CommandJdo` entity +* xref:security:sessionlog:about.adoc[Session Log] module: `SessionLogEntry` entity * xref:subdomains:settings:about.adoc[Settings] module: `UserSettingJdo` entity diff --git a/antora/components/refguide/modules/applib-svc/pages/about.adoc b/antora/components/refguide/modules/applib-svc/pages/about.adoc index 5698c2eb8a5..4021141afe5 100644 --- a/antora/components/refguide/modules/applib-svc/pages/about.adoc +++ b/antora/components/refguide/modules/applib-svc/pages/about.adoc @@ -179,7 +179,7 @@ Note that it's possible for there to be more than one transaction per top-level * At the end of the entire interaction footnote:[although rare, there can be multiple transactions in a single interaction], details of the top-level xref:refguide:applib:index/services/command/Command.adoc[Command] are sent to each xref:refguide:applib:index/services/publishing/spi/CommandSubscriber.adoc[CommandSubscriber]. This captures whether the command succeeded or failed. + -The xref:userguide:command-log:about.adoc[Command Log] extension uses this to persist a log of commands, for auditing or to support regression testing with the xref:userguide:command-replay:about.adoc[Command Replay] extension. +The xref:userguide:commandlog:about.adoc[Command Log] extension uses this to persist a log of commands, for auditing or to support regression testing with the xref:userguide:commandreplay:about.adoc[Command Replay] extension. Implementations of xref:refguide:applib:index/services/publishing/spi/CommandSubscriber.adoc[CommandSubscriber] can use the `Command#getMemento()` method to obtain a XML equivalent of that xref:refguide:applib:index/services/command/Command.adoc[Command], reified using the xref:refguide:schema:cmd.adoc[cmd.xsd] schema. diff --git a/antora/components/refguide/modules/applib-svc/partials/_integration-spi.adoc b/antora/components/refguide/modules/applib-svc/partials/_integration-spi.adoc index 97195941311..76e8575c4c5 100644 --- a/antora/components/refguide/modules/applib-svc/partials/_integration-spi.adoc +++ b/antora/components/refguide/modules/applib-svc/partials/_integration-spi.adoc @@ -20,13 +20,13 @@ The integration SPIs allow the framework to automate the exchange of data betwee |xref:refguide:applib:index/services/command/CommandExecutorService.adoc[CommandExecutorService] |Service used to execute commands. -One use case is to replay commands from a primary onto a secondary (see xref:userguide:command-replay:about.adoc[Command Replay] ; another is in support of async commands (using +One use case is to replay commands from a primary onto a secondary (see xref:userguide:commandreplay:about.adoc[Command Replay] ; another is in support of async commands (using xref:refguide:applib:index/services/wrapper/WrapperFactory.adoc[WrapperFactory] ). |xref:refguide:applib:index/services/publishing/spi/CommandSubscriber.adoc[CommandSubscriber] |SPI to allow commands to be processed on completion. -The xref:userguide:command-log:about.adoc[Command Log] extension implements the SPI in order to persists commands for audit or replay. +The xref:userguide:commandlog:about.adoc[Command Log] extension implements the SPI in order to persists commands for audit or replay. |xref:refguide:applib:index/services/publishing/spi/EntityChangesSubscriber.adoc[EntityChangesSubscriber] diff --git a/antora/components/refguide/modules/applib-svc/partials/_security-spi.adoc b/antora/components/refguide/modules/applib-svc/partials/_security-spi.adoc index 74232bcad57..987e188f979 100644 --- a/antora/components/refguide/modules/applib-svc/partials/_security-spi.adoc +++ b/antora/components/refguide/modules/applib-svc/partials/_security-spi.adoc @@ -26,7 +26,7 @@ TIP: see also the xref:security:ROOT:about.adoc[Security Guide]. |xref:refguide:applib:index/services/session/SessionLoggingService.adoc[SessionLoggingService] |Records each login and logout by end-users. -* xref:security:session-log:about.adoc[Session Log + +* xref:security:sessionlog:about.adoc[Session Log + (Security Guide)] |xref:refguide:applib:index/services/userreg/UserRegistrationService.adoc[UserRegistrationService] diff --git a/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc b/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc index 73fe75680d1..100e6b6ff23 100644 --- a/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc +++ b/antora/components/relnotes/modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc @@ -13,7 +13,7 @@ The release includes support for a new (additional) link:https://cwiki.apache.or On the flip side, support for contributed actions from domain services has been removed; use xref:refguide:applib-classes:mixins.adoc[Mixins]instead. This release also has a reworking/simplification of the command service and background commands. -This includes new extension modules to persist commands (xref:userguide:command-log:about.adoc[Command Log] and xref:userguide:command-replay:about.adoc[Command Replay], to assist regression testing. +This includes new extension modules to persist commands (xref:userguide:commandlog:about.adoc[Command Log] and xref:userguide:commandreplay:about.adoc[Command Replay], to assist regression testing. Also in this release, the xref:incubator:kroviz:about.adoc[Kroviz client] has been brought into the incubator. This is a single-page app that runs within the browser to provide a UI similar to that of the xref:vw:ROOT:about.adoc[Web UI (Wicket viewer)], but interacting with the domain application exclusively through the REST API provided by the xref:vro:ROOT:about.adoc[REST API (Restful Objects viewer)]. diff --git a/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M6/relnotes.adoc b/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M6/relnotes.adoc index b45d3d6207e..b97197e7be1 100644 --- a/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M6/relnotes.adoc +++ b/antora/components/relnotes/modules/ROOT/pages/2021/2.0.0-M6/relnotes.adoc @@ -290,7 +290,7 @@ No code changes were made to close these tickets: * link:https://issues.apache.org/jira/browse/ISIS-2555[ISIS-2555] - [WON'T FIX] EntityChanges (as consumed by EntityChangesSubscriber) should associate with transaction, not interaction? -* link:https://issues.apache.org/jira/browse/ISIS-2514[ISIS-2514] - [DUPLICATE] add JPA support command-log extension +* link:https://issues.apache.org/jira/browse/ISIS-2514[ISIS-2514] - [DUPLICATE] add JPA support commandlog extension * link:https://issues.apache.org/jira/browse/ISIS-2603[ISIS-2603] - [WON'T FIX] Simplify layout styles (that are available for download when prototyping) * link:https://issues.apache.org/jira/browse/ISIS-2574[ISIS-2574] - [WON'T FIX] Swagger: Harmonize dependencies of metamodel and vaadin viewer diff --git a/antora/components/userguide/modules/ROOT/partials/extensions.adoc b/antora/components/userguide/modules/ROOT/partials/extensions.adoc index 42657a95383..69c473efa75 100644 --- a/antora/components/userguide/modules/ROOT/partials/extensions.adoc +++ b/antora/components/userguide/modules/ROOT/partials/extensions.adoc @@ -1,6 +1,6 @@ include::userguide:excel:partial$module-nav.adoc[] -include::userguide:command-log:partial$module-nav.adoc[] -include::userguide:command-replay:partial$module-nav.adoc[] +include::userguide:commandlog:partial$module-nav.adoc[] +include::userguide:commandreplay:partial$module-nav.adoc[] include::userguide:flyway:partial$module-nav.adoc[] include::userguide:quartz:partial$module-nav.adoc[] diff --git a/antora/components/userguide/modules/fun/pages/concepts-patterns/architecture.adoc b/antora/components/userguide/modules/fun/pages/concepts-patterns/architecture.adoc index 36a796f9b83..2c9197e2a5c 100644 --- a/antora/components/userguide/modules/fun/pages/concepts-patterns/architecture.adoc +++ b/antora/components/userguide/modules/fun/pages/concepts-patterns/architecture.adoc @@ -72,7 +72,7 @@ Whenever an object is rendered in the UI, it is filtered with respect to the use That is, if a user is not authorized to either view or perhaps modify an object, then this is applied transparently by the framework. The xref:security:ROOT:about.adoc[SecMan extension] provides a rich user/role/permissions subdomain to use out of the box; but you can integrate with a different security mechanism if you have one already. -Another example of interceptors are the xref:userguide:command-log:about.adoc[Command Log] and xref:security:audit-trail:about.adoc[Auditer] modules. +Another example of interceptors are the xref:userguide:commandlog:about.adoc[Command Log] and xref:security:audittrail:about.adoc[Auditer] modules. The _Command Log_ module captures every user interaction that modifies the state of the system (the "cause" of a change) while the _Auditer_ module captures every change to every object (the "effect" of a change). Again, this is all transparent to the user. diff --git a/antora/playbooks/site-extensions.yml b/antora/playbooks/site-extensions.yml index 6cfc5f568c8..911d35bcc46 100644 --- a/antora/playbooks/site-extensions.yml +++ b/antora/playbooks/site-extensions.yml @@ -41,10 +41,10 @@ content: start_path: extensions/applib/excel/adoc # extensions branches: HEAD - url: . - start_path: extensions/core/command-log/adoc # extensions + start_path: extensions/core/commandlog/adoc # extensions branches: HEAD - url: . - start_path: extensions/core/command-replay/adoc # extensions + start_path: extensions/core/commandreplay/adoc # extensions branches: HEAD - url: . start_path: extensions/core/flyway/adoc # userguide diff --git a/antora/playbooks/site-security.yml b/antora/playbooks/site-security.yml index c5994c6e3e1..6917b3ea9da 100644 --- a/antora/playbooks/site-security.yml +++ b/antora/playbooks/site-security.yml @@ -40,13 +40,13 @@ content: # extensions - url: . - start_path: extensions/security/audit-trail/adoc # security + start_path: extensions/security/audittrail/adoc # security branches: HEAD - url: . start_path: extensions/security/secman/adoc # security branches: HEAD - url: . - start_path: extensions/security/session-log/adoc # security + start_path: extensions/security/sessionlog/adoc # security branches: HEAD - url: . start_path: extensions/security/shiro-realm-ldap/adoc # security diff --git a/antora/playbooks/site.yml b/antora/playbooks/site.yml index c40cf0b0aac..17ed30673b8 100644 --- a/antora/playbooks/site.yml +++ b/antora/playbooks/site.yml @@ -112,10 +112,10 @@ content: start_path: extensions/applib/excel/adoc # extensions branches: HEAD - url: . - start_path: extensions/core/command-log/adoc # extensions + start_path: extensions/core/commandlog/adoc # extensions branches: HEAD - url: . - start_path: extensions/core/command-replay/adoc # extensions + start_path: extensions/core/commandreplay/adoc # extensions branches: HEAD - url: . start_path: extensions/core/flyway/adoc # userguide @@ -125,13 +125,13 @@ content: branches: HEAD - url: . - start_path: extensions/security/audit-trail/adoc # security + start_path: extensions/security/audittrail/adoc # security branches: HEAD - url: . start_path: extensions/security/secman/adoc # security branches: HEAD - url: . - start_path: extensions/security/session-log/adoc # security + start_path: extensions/security/sessionlog/adoc # security branches: HEAD - url: . start_path: extensions/security/shiro-realm-ldap/adoc # security diff --git a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java index 1d4312cebea..9c48643117f 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java +++ b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java @@ -46,7 +46,7 @@ import org.apache.isis.applib.services.layout.LayoutServiceMenu; import org.apache.isis.applib.services.metamodel.MetaModelServiceMenu; import org.apache.isis.applib.services.queryresultscache.QueryResultsCache; -import org.apache.isis.applib.services.session.SessionLoggingServiceLogging; +import org.apache.isis.applib.services.session.SessionLogServiceLogging; import org.apache.isis.applib.services.sitemap.SitemapServiceMenu; import org.apache.isis.applib.services.sudo.SudoService; import org.apache.isis.applib.services.user.ImpersonateMenu; @@ -95,7 +95,7 @@ CommandDtoProcessorServiceIdentity.class, ContentMappingServiceForCommandDto.class, ContentMappingServiceForCommandsDto.class, - SessionLoggingServiceLogging.class, + SessionLogServiceLogging.class, SudoService.class, UserService.class, UserMemento.UiSubscriber.class, diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java index 32759711e9f..b2b5e751e12 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java +++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java @@ -66,7 +66,12 @@ @Component @Scope("prototype") public @interface DomainObject { - // ... + /** + * Alternative logical type name(s) for the annotated type. + * @see Bookmark + * @see Named + */ + String[] aliased() default {}; /** * The class of the domain service that provides an autoComplete(String) method. @@ -185,9 +190,10 @@ Nature nature() * (same concept as a URN). * Otherwise, if not specified, the fully qualified class name is used instead. *

- * + * @deprecated use {@link Named} instead * @see Named */ + @Deprecated(forRemoval = true, since = "2.0.0-RC1") String logicalTypeName() default ""; diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java index 6d2ea25e9dd..343a91fa529 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java +++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java @@ -57,6 +57,13 @@ @Service @Singleton public @interface DomainService { + /** + * Alternative logical type name(s) for the annotated type. + * @see Bookmark + * @see Named + */ + String[] aliased() default {}; + /** * The nature of this service, either in the UI or REST only * @@ -76,7 +83,6 @@ NatureOfService nature() * Otherwise, if not specified, the default Spring Bean name is used instead. *

* @deprecated use Spring semantics instead, eg. {@link Named} or equivalent - * @see DomainObject#logicalTypeName() * @see Named */ @Deprecated(forRemoval = true, since = "2.0.0-RC1") diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/LogicalTypeName.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/LogicalTypeName.java index e7d2f37db88..93d964aa5ad 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/annotation/LogicalTypeName.java +++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/LogicalTypeName.java @@ -24,11 +24,13 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.inject.Named; + /** * Introduced to allow for abstract types to be mapped to a logical-type-name, * for the security model to apply permission checks against. - * - * @since 2.0 {@index} + * @deprecated use {@link Named} instead + * @see Named */ @Inherited @Target({ @@ -36,6 +38,7 @@ ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) +@Deprecated(forRemoval = true, since = "2.0.0-RC1") public @interface LogicalTypeName { /** diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java index 1d2a0775e6e..37a6921852f 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java +++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java @@ -18,6 +18,8 @@ */ package org.apache.isis.applib.annotation; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.util.Enums; @@ -25,7 +27,8 @@ * @since 1.x {@index} * @see Reference Guide */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".annotation.SemanticsOf") +@Named(IsisModuleApplib.NAMESPACE + ".annotation.SemanticsOf") +@Value public enum SemanticsOf { /** diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Value.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Value.java index e268d2162d9..5ed5ed72a5a 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Value.java +++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Value.java @@ -48,10 +48,10 @@ *

* If not specified, the fully qualified class name is used instead. *

- * - * @see DomainObject#logicalTypeName() + * @deprecated use {@link Named} instead * @see Named */ + @Deprecated(forRemoval = true, since = "2.0.0-RC1") String logicalTypeName() default ""; diff --git a/api/applib/src/main/java/org/apache/isis/applib/client/RepresentationTypeSimplifiedV2.java b/api/applib/src/main/java/org/apache/isis/applib/client/RepresentationTypeSimplifiedV2.java index 29861a4028b..169a7055391 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/client/RepresentationTypeSimplifiedV2.java +++ b/api/applib/src/main/java/org/apache/isis/applib/client/RepresentationTypeSimplifiedV2.java @@ -47,6 +47,11 @@ public enum RepresentationTypeSimplifiedV2 { */ OBJECT_COLLECTION("object-collection"), + /** + * The media type used as content-Type header when an object property is rendered. + */ + OBJECT_PROPERTY("object-property"), + /** * The media type used as content-Type header when a standalone collection is rendered. */ @@ -76,6 +81,7 @@ public enum RepresentationTypeSimplifiedV2 { public boolean isObject() { return this == OBJECT; } public boolean isObjectCollection() { return this == OBJECT_COLLECTION; } + public boolean isObjectProperty() { return this == OBJECT_PROPERTY; } public boolean isList() { return this == LIST; } public boolean isValue() { return this == VALUE; } public boolean isValues() { return this == VALUES; } @@ -117,10 +123,12 @@ private static String trimQuotesIfAny(final String s) { } private static Optional extractReprType(final @NonNull Stream stringStream) { + return stringStream - //.peek(System.out::println)//debug + //.peek(System.err::println)//debug .map(String::trim) .filter(_Strings::isNotEmpty) + //.map(s->s.replace("profile=\"urn:org.restfulobjects:repr-types/", "repr-type=\"")) .filter(s->s.startsWith("repr-type")) .map(s->_Strings.parseKeyValuePair(s, '=').orElse(null)) .filter(Objects::nonNull) diff --git a/api/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java b/api/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java index eb9f6af9d2b..facfc85d76c 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java +++ b/api/applib/src/main/java/org/apache/isis/applib/domain/DomainObjectList.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -67,17 +68,15 @@ } ) @XmlAccessorType(XmlAccessType.FIELD) +@Named(DomainObjectList.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = DomainObjectList.LOGICAL_TYPE_NAME, editing = Editing.DISABLED, - nature = Nature.VIEW_MODEL - ) + nature = Nature.VIEW_MODEL) @DomainObjectLayout( titleUiEvent = DomainObjectList.TitleUiEvent.class, iconUiEvent = DomainObjectList.IconUiEvent.class, cssClassUiEvent = DomainObjectList.CssClassUiEvent.class, - layoutUiEvent = DomainObjectList.LayoutUiEvent.class - ) + layoutUiEvent = DomainObjectList.LayoutUiEvent.class) public class DomainObjectList { public static final String LOGICAL_TYPE_NAME = "isis.applib.DomainObjectList"; diff --git a/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelListener.java b/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelListener.java index 13af3842dc3..42e58f7b340 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelListener.java +++ b/api/applib/src/main/java/org/apache/isis/applib/events/metamodel/MetamodelListener.java @@ -26,12 +26,15 @@ /** * Convenience interface to listen on {@link MetamodelEvent}s. + * *

* Provided as an alternative to directly listening to these events. + *

+ * *

- * Using precedence {@link Order} {@link PriorityPrecedence#MIDPOINT}. - * For fine grained precedence control, - * services need to directly listen to these events instead. + * Uses a precedence {@link Order} of {@link PriorityPrecedence#MIDPOINT}. + * For fine grained precedence control, instead listen directly to these events rather than implementing this interface. + *

* * @since 2.0 */ @@ -40,12 +43,27 @@ public interface MetamodelListener { /** * Emitted by the framework, once the Metamodel is populated. + * *

- * Most common use-case is to seed database values, + * A common use-case is to seed database values, * right after the Metamodel was loaded. + *

+ * + *

+ * NOTE that this callback is called without any + * {@link org.apache.isis.applib.services.iactnlayer.InteractionLayer interaction} (aka persistence session) + * set up; use {@link org.apache.isis.applib.services.iactnlayer.InteractionService} to create one if required. + *

*/ void onMetamodelLoaded(); + /** + *

+ * NOTE that this callback is called without any + * {@link org.apache.isis.applib.services.iactnlayer.InteractionLayer interaction} (aka persistence session) + * set up; use {@link org.apache.isis.applib.services.iactnlayer.InteractionService} to create one if required. + *

+ */ default void onMetamodelAboutToBeLoaded() {} @EventListener(MetamodelEvent.class) diff --git a/api/applib/src/main/java/org/apache/isis/applib/graph/SimpleEdge.java b/api/applib/src/main/java/org/apache/isis/applib/graph/SimpleEdge.java index f2ab381d746..85eb0edbb87 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/graph/SimpleEdge.java +++ b/api/applib/src/main/java/org/apache/isis/applib/graph/SimpleEdge.java @@ -18,6 +18,8 @@ */ package org.apache.isis.applib.graph; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.Value; @@ -30,7 +32,8 @@ * @param type constraint for values contained by this edge's vertices */ @lombok.Value(staticConstructor = "of") -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".graph.SimpleEdge") +@Named(IsisModuleApplib.NAMESPACE + ".graph.SimpleEdge") +@Value public class SimpleEdge implements Edge { Vertex from; diff --git a/api/applib/src/main/java/org/apache/isis/applib/graph/tree/TreeNode.java b/api/applib/src/main/java/org/apache/isis/applib/graph/tree/TreeNode.java index 5968861012d..33ad9b1cf13 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/graph/tree/TreeNode.java +++ b/api/applib/src/main/java/org/apache/isis/applib/graph/tree/TreeNode.java @@ -27,6 +27,8 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; +import javax.inject.Named; + import org.springframework.lang.Nullable; import org.apache.isis.applib.IsisModuleApplib; @@ -48,7 +50,8 @@ * * @param type constraint for values contained by this node */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".graph.tree.TreeNode") +@Named(IsisModuleApplib.NAMESPACE + ".graph.tree.TreeNode") +@Value public class TreeNode implements Vertex { private final TreeState sharedState; diff --git a/api/applib/src/main/java/org/apache/isis/applib/id/LogicalType.java b/api/applib/src/main/java/org/apache/isis/applib/id/LogicalType.java index 154eb15b30f..58bc3d7161b 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/id/LogicalType.java +++ b/api/applib/src/main/java/org/apache/isis/applib/id/LogicalType.java @@ -21,14 +21,22 @@ import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.Serializable; +import java.util.Locale; import java.util.Objects; +import java.util.Optional; import java.util.function.Supplier; +import javax.inject.Named; +import javax.persistence.Table; + import org.springframework.lang.Nullable; import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.Value; import org.apache.isis.commons.internal.base._Strings; import org.apache.isis.commons.internal.exceptions._Exceptions; +import org.apache.isis.commons.internal.reflection._Annotations; import lombok.Getter; import lombok.NonNull; @@ -103,6 +111,80 @@ public static LogicalType fqcn( return eager(correspondingClass, correspondingClass.getName()); } + /** + * Infer from annotations. + * @apiNote Does only simple inference, not involving classifier plugins. + * Use with caution! + */ + @SuppressWarnings("removal") + public static LogicalType infer( + final @NonNull Class correspondingClass) { + + // has precedence, over any former (deprecated) naming strategies + val named = _Strings.emptyToNull( + _Annotations.synthesize(correspondingClass, Named.class) + .map(Named::value) + .orElse(null)); + if(named!=null) { + return eager(correspondingClass, named); + } + + // 3x deprecated naming strategies ... + + { + val logicalTypeName = _Strings.emptyToNull( + _Annotations.synthesize(correspondingClass, DomainObject.class) + .map(DomainObject::logicalTypeName) + .orElse(null)); + if(logicalTypeName!=null) { + return eager(correspondingClass, logicalTypeName); + } + } + + { + val logicalTypeName = _Strings.emptyToNull( + _Annotations.synthesize(correspondingClass, DomainService.class) + .map(DomainService::logicalTypeName) + .orElse(null)); + if(logicalTypeName!=null) { + return eager(correspondingClass, logicalTypeName); + } + } + + { + val logicalTypeName = _Strings.emptyToNull( + _Annotations.synthesize(correspondingClass, Value.class) + .map(Value::logicalTypeName) + .orElse(null)); + if(logicalTypeName!=null) { + return eager(correspondingClass, logicalTypeName); + } + } + + // fallback to @Table annotations + { + val logicalTypeName = + _Annotations.synthesize(correspondingClass, Table.class) + .map(table-> + _Strings.nullToEmpty(table.schema()) + .toLowerCase(Locale.ROOT) + + "." + + _Strings.nullToEmpty(table.name())) + .orElse(null); + if(logicalTypeName!=null + && !logicalTypeName.startsWith(".") + && !logicalTypeName.endsWith(".")) { + return eager(correspondingClass, logicalTypeName); + } + } + + // fallback to fqcn + return eager(correspondingClass, + Optional + .ofNullable(correspondingClass.getCanonicalName()) + .orElseGet(correspondingClass::getName)); + } + // -- HIDDEN CONSTRUTORS private LogicalType( diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/security/HasUsername.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/security/HasUsername.java index 5e0bb2c8d26..01a39a96e51 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/mixins/security/HasUsername.java +++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/security/HasUsername.java @@ -18,6 +18,16 @@ */ package org.apache.isis.applib.mixins.security; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.PropertyLayout; +import org.apache.isis.applib.annotation.Where; import org.apache.isis.applib.mixins.updates.OnUpdatedBy; /** @@ -37,10 +47,28 @@ */ public interface HasUsername { + + @Property( + editing = Editing.DISABLED, + maxLength = Username.MAX_LENGTH + ) + @Parameter( + maxLength = Username.MAX_LENGTH + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface Username { + int MAX_LENGTH = 120; + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + /** * The user that created, updated or is otherwise associated with this * object. */ + @Username String getUsername(); + } diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java index 548bd1f0e3d..c39fa60f163 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java +++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java @@ -18,15 +18,19 @@ */ package org.apache.isis.applib.mixins.system; -import java.sql.Timestamp; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.UUID; +import org.apache.isis.applib.annotation.Editing; import org.apache.isis.applib.annotation.Optionality; import org.apache.isis.applib.annotation.Property; import org.apache.isis.applib.annotation.PropertyLayout; import org.apache.isis.applib.annotation.Where; import org.apache.isis.applib.mixins.security.HasUsername; import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.bookmark.HasTarget; /** @@ -36,7 +40,9 @@ * * @since 2.0 {@index} */ -public interface DomainChangeRecord extends HasInteractionId, HasUsername { +public interface DomainChangeRecord extends HasInteractionId, HasUsername, HasTarget { + + /** * Enumerates the different types of changes recognised. @@ -53,44 +59,95 @@ public String toString() { } } - /** - * Distinguishes commands from audit entries from published events/interactions (when these are shown mixed together in a (standalone) table). - */ - @Property + + @Property( + editing = Editing.DISABLED + ) @PropertyLayout( hidden = Where.ALL_EXCEPT_STANDALONE_TABLES, fieldSetId="Identifiers", - sequence = "1") + sequence = "1" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface Type { + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + /** + * Distinguishes commands from audit entries from published events/interactions (when these are shown mixed together in a (standalone) table). + */ + @Type ChangeType getType(); + + @Property( + editing = Editing.DISABLED + ) + @PropertyLayout( + fieldSetId="Identifiers", + sequence = "50" + ) + @HasInteractionId.InteractionId + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface InteractionId { + boolean NULLABLE = HasInteractionId.InteractionId.NULLABLE; + String ALLOWS_NULL = HasInteractionId.InteractionId.ALLOWS_NULL; + } /** - * The unique identifier (a GUID) of the + * The unique identifier of the * {@link org.apache.isis.applib.services.iactn.Interaction} within which * this change occurred. */ @Override -//TODO marked @Programmatic in CommandJdo/Jpa, hence commented out, to avoid conflicting domain-include semantics -// @Property -// @PropertyLayout(fieldSetId="Identifiers",sequence = "50") + @InteractionId UUID getInteractionId(); + + @Property( + editing = Editing.DISABLED + ) + @PropertyLayout( + fieldSetId="Identifiers", + sequence = "10" + ) + @HasUsername.Username + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface Username { + int MAX_LENGTH = HasUsername.Username.MAX_LENGTH; + boolean NULLABLE = HasUsername.Username.NULLABLE; + String ALLOWS_NULL = HasUsername.Username.ALLOWS_NULL; + } /** * The user that caused the change. */ @Override - @Property - @PropertyLayout(fieldSetId="Identifiers", sequence = "10") + @Username String getUsername(); + @Property( + editing = Editing.DISABLED + ) + @PropertyLayout( + fieldSetId="Identifiers", + sequence = "20" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface Timestamp { + boolean NULLABLE = HasUsername.Username.NULLABLE; + String ALLOWS_NULL = HasUsername.Username.ALLOWS_NULL; + } /** * The time that the change occurred. */ - @Property - @PropertyLayout(fieldSetId="Identifiers", sequence = "20") - Timestamp getTimestamp(); + @Timestamp + java.sql.Timestamp getTimestamp(); /** @@ -107,17 +164,30 @@ default String getTargetObjectType() { - /** - * The {@link Bookmark} identifying the domain object that has changed. - */ - @Property + @Property( + editing = Editing.DISABLED + ) @PropertyLayout( named="Object", fieldSetId="Target", - sequence="30") + sequence="30" + ) + @HasTarget.Target + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface Target { + int MAX_LENGTH = HasTarget.Target.MAX_LENGTH; + boolean NULLABLE = HasTarget.Target.NULLABLE; + String ALLOWS_NULL = HasTarget.Target.ALLOWS_NULL; + } + /** + * The {@link Bookmark} identifying the domain object that has changed. + */ + @Target Bookmark getTarget(); + /** * The member interaction (ie action invocation or property edit) which caused the domain object to be changed. * @@ -125,11 +195,42 @@ default String getTargetObjectType() { * Populated for commands and for published events that represent action invocations or property edits. *

*/ - @Property(optionality = Optionality.OPTIONAL) - @PropertyLayout(named="Member", hidden = Where.ALL_EXCEPT_STANDALONE_TABLES, fieldSetId="Target", sequence = "20") + @Property( + optionality = Optionality.OPTIONAL + ) + @PropertyLayout( + named="Member", + hidden = Where.ALL_EXCEPT_STANDALONE_TABLES, + fieldSetId="Target", + sequence = "20" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface TargetMember { + int MAX_LENGTH = HasTarget.Target.MAX_LENGTH; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + @TargetMember String getTargetMember(); + + + @Property( + optionality = Optionality.OPTIONAL + ) + @PropertyLayout( + hidden = Where.ALL_EXCEPT_STANDALONE_TABLES, + fieldSetId = "Detail", + sequence = "6" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface PreValue { + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } /** * The value of the property prior to it being changed. * @@ -137,11 +238,26 @@ default String getTargetObjectType() { * Populated only for audit entries. *

*/ - @Property(optionality = Optionality.OPTIONAL) - @PropertyLayout(hidden = Where.ALL_EXCEPT_STANDALONE_TABLES, fieldSetId="Detail",sequence = "6") + @PreValue String getPreValue(); + + + @Property( + optionality = Optionality.OPTIONAL + ) + @PropertyLayout( + hidden = Where.ALL_EXCEPT_STANDALONE_TABLES, + fieldSetId = "Detail", + sequence = "7" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface PostValue { + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } /** * The value of the property after it has changed. * @@ -149,9 +265,7 @@ default String getTargetObjectType() { * Populated only for audit entries. *

*/ - @Property(optionality = Optionality.MANDATORY) - @PropertyLayout(hidden = Where.ALL_EXCEPT_STANDALONE_TABLES, fieldSetId="Detail", - sequence = "7") + @PostValue String getPostValue(); diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionId.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionId.java index c58acb0914b..07b61114808 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionId.java +++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasInteractionId.java @@ -18,8 +18,16 @@ */ package org.apache.isis.applib.mixins.system; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.UUID; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.Where; import org.apache.isis.applib.services.iactn.Interaction; @@ -32,9 +40,39 @@ */ public interface HasInteractionId { + @Property( + hidden = Where.EVERYWHERE, + maxLength = InteractionIdStr.MAX_LENGTH + ) + @Parameter( + maxLength = InteractionIdStr.MAX_LENGTH + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface InteractionIdStr { + int MAX_LENGTH = 36; + boolean NULLABLE = InteractionId.NULLABLE; + String ALLOWS_NULL = InteractionId.ALLOWS_NULL; + String NAME = "interactionId"; + } + + + @Property( + editing = Editing.DISABLED + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface InteractionId { + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + + /** * A unique identifier (a GUID). */ + @InteractionId UUID getInteractionId(); + } diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java index 6a9c3e4306b..8b568da87a9 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java +++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/HasTransactionId.java @@ -18,6 +18,17 @@ */ package org.apache.isis.applib.mixins.system; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.Property; + +import lombok.Setter; + /** * Extends {@link HasInteractionId} to add a strictly monotonically increasing * sequence number so that each transaction within the overall @@ -36,6 +47,14 @@ */ public interface HasTransactionId extends HasInteractionId { + @Property( + editing = Editing.DISABLED + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface Sequence { + } + /** * Holds the sequence number uniquely identifying the transaction number * within the overall @@ -43,9 +62,10 @@ public interface HasTransactionId extends HasInteractionId { * *

* The values in this sequence are ultimately obtained from the non-API - * method + * method * {@link org.apache.isis.core.metamodel.execution.InteractionInternal#getTransactionSequence}. *

*/ + @Sequence int getSequence(); } diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeature.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeature.java index aac21661c06..89f3c78f40b 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeature.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeature.java @@ -18,20 +18,23 @@ */ package org.apache.isis.applib.services.appfeat; -import org.apache.isis.applib.IsisModuleApplib; -import org.apache.isis.applib.annotation.SemanticsOf; -import org.apache.isis.applib.annotation.Value; - import java.util.Collections; import java.util.Optional; import java.util.OptionalInt; import java.util.SortedSet; +import javax.inject.Named; + +import org.apache.isis.applib.IsisModuleApplib; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.annotation.Value; + /** * * @since 1.x revised for 2.0 {@index} */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE_SUDO + ".ApplicationFeature") +@Named(IsisModuleApplib.NAMESPACE_SUDO + ".ApplicationFeature") +@Value public interface ApplicationFeature { ApplicationFeatureId getFeatureId(); diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java index bc6bea01aa8..af59ff92df6 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeat/ApplicationFeatureSort.java @@ -18,6 +18,8 @@ */ package org.apache.isis.applib.services.appfeat; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.Value; @@ -25,7 +27,8 @@ * * @since 1.x revised for 2.0 {@index} */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE_FEAT + ".ApplicationFeatureSort") +@Named(IsisModuleApplib.NAMESPACE_FEAT + ".ApplicationFeatureSort") +@Value public enum ApplicationFeatureSort { /** diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationFeatureViewModel.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationFeatureViewModel.java index 32fcb3b794e..4497c703d1c 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationFeatureViewModel.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationFeatureViewModel.java @@ -27,6 +27,7 @@ import java.util.function.Function; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.ViewModel; @@ -63,9 +64,8 @@ * * @since 2.x {@index} */ -@DomainObject( - logicalTypeName = ApplicationFeatureViewModel.LOGICAL_TYPE_NAME -) +@Named(ApplicationFeatureViewModel.LOGICAL_TYPE_NAME) +@DomainObject public abstract class ApplicationFeatureViewModel implements ViewModel { public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE_FEAT + ".ApplicationFeatureViewModel"; diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationNamespace.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationNamespace.java index dad01b67c64..f31befcdc63 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationNamespace.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationNamespace.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.SortedSet; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.CollectionLayout; @@ -37,9 +39,8 @@ /** * @since 2.x {@index} */ -@DomainObject( - logicalTypeName = ApplicationNamespace.LOGICAL_TYPE_NAME -) +@Named(ApplicationNamespace.LOGICAL_TYPE_NAME) +@DomainObject @DomainObjectLayout(paged=100) public class ApplicationNamespace extends ApplicationFeatureViewModel { diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationType.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationType.java index 97ac3860882..2aa39515623 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationType.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationType.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.SortedSet; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.BookmarkPolicy; import org.apache.isis.applib.annotation.Collection; @@ -36,9 +38,8 @@ /** * @since 2.x {@index} */ -@DomainObject( - logicalTypeName = ApplicationType.LOGICAL_TYPE_NAME -) +@Named(ApplicationType.LOGICAL_TYPE_NAME) +@DomainObject @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_ROOT, paged=100 diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeAction.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeAction.java index fbeab659666..1a47ed0562f 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeAction.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeAction.java @@ -23,6 +23,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; @@ -34,9 +36,8 @@ /** * @since 2.x {@index} */ -@DomainObject( - logicalTypeName = ApplicationTypeAction.LOGICAL_TYPE_NAME -) +@Named(ApplicationTypeAction.LOGICAL_TYPE_NAME) +@DomainObject @DomainObjectLayout( paged = 100 ) diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeCollection.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeCollection.java index 880e7b97402..9f58f3e8a96 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeCollection.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeCollection.java @@ -22,6 +22,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; @@ -32,9 +34,8 @@ /** * @since 2.x {@index} */ -@DomainObject( - logicalTypeName = ApplicationTypeCollection.LOGICAL_TYPE_NAME -) +@Named(ApplicationTypeCollection.LOGICAL_TYPE_NAME) +@DomainObject @DomainObjectLayout( paged = 100 ) diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeMember.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeMember.java index a45f0a79d94..51a3959dcbe 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeMember.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeMember.java @@ -23,6 +23,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.BookmarkPolicy; import org.apache.isis.applib.annotation.DomainObject; @@ -36,9 +38,8 @@ /** * @since 2.x {@index} */ -@DomainObject( - logicalTypeName = ApplicationTypeMember.LOGICAL_TYPE_NAME -) +@Named(ApplicationTypeMember.LOGICAL_TYPE_NAME) +@DomainObject @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_CHILD ) diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeProperty.java b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeProperty.java index 792589d981e..f40f993d3a2 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeProperty.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/appfeatui/ApplicationTypeProperty.java @@ -23,6 +23,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; @@ -37,9 +39,8 @@ /** * @since 2.x {@index} */ -@DomainObject( - logicalTypeName = ApplicationTypeProperty.LOGICAL_TYPE_NAME -) +@Named(ApplicationTypeProperty.LOGICAL_TYPE_NAME) +@DomainObject @DomainObjectLayout( paged = 100 ) diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java index dc4347d1993..118f54c8030 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java @@ -22,6 +22,8 @@ import java.util.Optional; import java.util.StringTokenizer; +import javax.inject.Named; + import org.springframework.lang.Nullable; import org.apache.isis.applib.IsisModuleApplib; @@ -42,8 +44,8 @@ * * @since 1.x revised for 2.0 {@index} */ -@org.apache.isis.applib.annotation.Value( - logicalTypeName = IsisModuleApplib.NAMESPACE + ".Bookmark") +@Named(IsisModuleApplib.NAMESPACE + ".Bookmark") +@org.apache.isis.applib.annotation.Value @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public final class Bookmark implements Oid { diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/HasTarget.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/HasTarget.java new file mode 100644 index 00000000000..eb27c6d4aa7 --- /dev/null +++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/HasTarget.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.applib.services.bookmark; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.UUID; + +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.Property; + + +/** + * @since 2.0 {@index} + */ +public interface HasTarget { + + @Property( + editing = Editing.DISABLED + ) + @Parameter( + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface Target { + int MAX_LENGTH = 2000; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + + /** + * A unique identifier (a GUID). + */ + @Target + Bookmark getTarget(); + + +} diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java index 640e57ca599..a0d36283f66 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java @@ -136,7 +136,7 @@ public Timestamp getTimestamp() { */ @ToString.Exclude @Getter - private CommandDto commandDto; + private org.apache.isis.schema.cmd.v2.CommandDto commandDto; /** * Derived from {@link #getCommandDto()}, is the {@link Bookmark} of diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/commanddto/HasCommandDto.java b/api/applib/src/main/java/org/apache/isis/applib/services/commanddto/HasCommandDto.java index 69ef2c69c9c..c6d986ac30a 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/commanddto/HasCommandDto.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/commanddto/HasCommandDto.java @@ -18,7 +18,14 @@ */ package org.apache.isis.applib.services.commanddto; -import org.apache.isis.schema.cmd.v2.CommandDto; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.PropertyLayout; /** * Objects implementing this interface will be processed automatically by @@ -27,5 +34,19 @@ */ public interface HasCommandDto { - CommandDto getCommandDto(); + @Property( + editing = Editing.DISABLED + ) + @PropertyLayout( + multiLine = 9 + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + @interface CommandDtoAnnot { + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + + @CommandDtoAnnot + org.apache.isis.schema.cmd.v2.CommandDto getCommandDto(); } diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationProperty.java b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationProperty.java index 514877abfdc..00f76c8c149 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationProperty.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationProperty.java @@ -18,6 +18,7 @@ */ package org.apache.isis.applib.services.confview; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -45,10 +46,9 @@ "value" } ) +@Named(ConfigurationProperty.LOGICAL_TYPE_NAME) @DomainObject( - editing = Editing.DISABLED, - logicalTypeName = ConfigurationProperty.LOGICAL_TYPE_NAME - ) + editing = Editing.DISABLED) @XmlAccessorType(XmlAccessType.FIELD) @DomainObjectLayout(paged = 999) @NoArgsConstructor diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.java b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.java index 06a39b01846..445542d017b 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationViewmodel.java @@ -21,6 +21,8 @@ import java.util.Collections; import java.util.Set; +import javax.inject.Named; + import org.springframework.beans.factory.annotation.Autowired; import org.apache.isis.applib.IsisModuleApplib; @@ -29,9 +31,9 @@ import org.apache.isis.applib.annotation.Nature; import org.apache.isis.applib.annotation.ObjectSupport; +@Named(ConfigurationViewmodel.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = ConfigurationViewmodel.LOGICAL_TYPE_NAME) + nature = Nature.VIEW_MODEL) public class ConfigurationViewmodel { public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE_CONF + ".ConfigurationViewmodel"; diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/jaxb/IsisSchemas.java b/api/applib/src/main/java/org/apache/isis/applib/services/jaxb/IsisSchemas.java index 38df18d34ec..cbdcd1aa895 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/jaxb/IsisSchemas.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/jaxb/IsisSchemas.java @@ -18,6 +18,8 @@ */ package org.apache.isis.applib.services.jaxb; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.Value; import org.apache.isis.applib.mixins.dto.Dto_downloadXsd; @@ -35,7 +37,8 @@ * downloaded from the Isis website. *

*/ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".services.jaxb.IsisSchemas") +@Named(IsisModuleApplib.NAMESPACE + ".services.jaxb.IsisSchemas") +@Value public enum IsisSchemas { INCLUDE, IGNORE; diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/layout/Style.java b/api/applib/src/main/java/org/apache/isis/applib/services/layout/Style.java index d76f4637901..1ebd193aef3 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/layout/Style.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/layout/Style.java @@ -18,8 +18,9 @@ */ package org.apache.isis.applib.services.layout; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; -import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Value; import org.apache.isis.applib.layout.grid.Grid; @@ -36,7 +37,8 @@ * * @since 1.x {@index} */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".services.layout.Style") +@Named(IsisModuleApplib.NAMESPACE + ".services.layout.Style") +@Value public enum Style { /** diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsService.java b/api/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsService.java index 8a2c3e38d7a..680c1b629e4 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsService.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/menu/MenuBarsService.java @@ -18,6 +18,8 @@ */ package org.apache.isis.applib.services.menu; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.Value; import org.apache.isis.applib.layout.menubars.MenuBars; @@ -37,7 +39,8 @@ */ public interface MenuBarsService { - @Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".services.menu.MenuBarsService.Type") + @Named(IsisModuleApplib.NAMESPACE + ".services.menu.MenuBarsService.Type") + @Value enum Type { /** @@ -74,7 +77,7 @@ static MenuBarsService forTesting() { return new MenuBarsService() { @Override - public MenuBars menuBars(Type type) { + public MenuBars menuBars(final Type type) { throw _Exceptions.unsupportedOperation(); } diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java b/api/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java index 0f32903ecff..3a469d6a703 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/registry/ServiceRegistry.java @@ -67,7 +67,7 @@ default Can select(final Class type){ /** * Streams all registered bean adapters implementing the requested type. */ - default Stream<_ManagedBeanAdapter> streamRegisteredBeansOfType(Class requiredType) { + default Stream<_ManagedBeanAdapter> streamRegisteredBeansOfType(final Class requiredType) { return streamRegisteredBeans() .filter(beanAdapter->beanAdapter.isCandidateFor(requiredType)); @@ -90,7 +90,7 @@ default Stream<_ManagedBeanAdapter> streamRegisteredBeansOfType(Class require * * @param id - corresponds to the ObjectSpecificationId of the bean's type */ - default _ManagedBeanAdapter lookupRegisteredBeanByIdElseFail(String id) { + default _ManagedBeanAdapter lookupRegisteredBeanByIdElseFail(final String id) { return lookupRegisteredBeanById(id).orElseThrow( ()->_Exceptions.unrecoverable( "Failed to lookup BeanAdapter by id '" + id + "'")); @@ -118,7 +118,7 @@ default Optional lookupService(final Class serviceClass) { * If this lookup is ambiguous, then the provided comparator is used. *

*/ - default Optional lookupService(Class serviceClass, Comparator comparator) { + default Optional lookupService(final Class serviceClass, final Comparator comparator) { val bin = select(serviceClass); if(bin.isEmpty()) { return Optional.empty(); @@ -149,12 +149,9 @@ default Optional lookupService(Class serviceClass, Comparator * @param */ default T lookupServiceElseFail(final Class serviceClass) { - return lookupService(serviceClass) .orElseThrow(()-> new NoSuchElementException("Could not locate service of type '" + serviceClass + "'")); - - // ... } /** @@ -164,5 +161,4 @@ default T lookupServiceElseFail(final Class serviceClass) { */ void clearRegisteredBeans(); - } diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingService.java b/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogService.java similarity index 84% rename from api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingService.java rename to api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogService.java index 1fdc88cf9ba..0a4019e8f65 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingService.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogService.java @@ -19,6 +19,7 @@ package org.apache.isis.applib.services.session; import java.util.Date; +import java.util.UUID; /** * Defines an API to track the status of the current sessions @@ -30,7 +31,7 @@ * * @since 1.x {@index} */ -public interface SessionLoggingService { +public interface SessionLogService { enum Type { LOGIN, @@ -46,24 +47,20 @@ enum CausedBy { /** * Callback to log the session. * - *

- * The sessionId is an internal identifier (for the - * Wicket viewer, its the JVM hashCode of the Wicket session). - *

- * * @param type * @param username * @param date * @param causedBy - * @param sessionId + * @param sessionGuid - guaranteed to be unique + * @param httpSessionId - generally expected to be unique, provided to correlate with other logs */ void log( Type type, String username, Date date, CausedBy causedBy, - String sessionId - ); + UUID sessionGuid, + String httpSessionId); } diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingServiceLogging.java b/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogServiceLogging.java similarity index 67% rename from api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingServiceLogging.java rename to api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogServiceLogging.java index eef5a1a98c9..667d24e1681 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLoggingServiceLogging.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogServiceLogging.java @@ -19,6 +19,7 @@ package org.apache.isis.applib.services.session; import java.util.Date; +import java.util.UUID; import javax.annotation.Priority; import javax.inject.Named; @@ -28,6 +29,7 @@ import org.apache.isis.applib.annotation.PriorityPrecedence; +import lombok.val; import lombok.extern.log4j.Log4j2; /** @@ -38,7 +40,7 @@ @Priority(PriorityPrecedence.LATE) @Qualifier("logging") @Log4j2 -public class SessionLoggingServiceLogging implements SessionLoggingService { +public class SessionLogServiceLogging implements SessionLogService { @Override public void log( @@ -46,23 +48,21 @@ public void log( final String username, final Date date, final CausedBy causedBy, - final String sessionId) { + final UUID sessionGuid, + final String httpSessionId) { if(log.isDebugEnabled()) { - final StringBuilder logMessage = new StringBuilder(); - logMessage.append("User '").append(username); - logMessage.append("' with sessionId '").append(sessionId) - .append("' has logged "); - if (type == Type.LOGIN) { - logMessage.append("in"); - } else { - logMessage.append("out"); - } - logMessage.append(" at '").append(date).append("'."); - if (causedBy == CausedBy.SESSION_EXPIRATION) { - logMessage.append("Cause: session expiration"); - } - log.debug(logMessage); + + val msg = String.format( + "User '%s' with sessionGuid '%s' (httpSessionId '%s') has logged %s at '%s'.%s", + username, + sessionGuid, + httpSessionId, + type == Type.LOGIN ? "in" : "out", + date, + causedBy == CausedBy.SESSION_EXPIRATION ? " (session expiration)" : "" + ); + log.debug(msg); } } } diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/swagger/Format.java b/api/applib/src/main/java/org/apache/isis/applib/services/swagger/Format.java index 19c90b054f5..13ef9b087c0 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/swagger/Format.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/swagger/Format.java @@ -18,6 +18,8 @@ */ package org.apache.isis.applib.services.swagger; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.Value; @@ -26,7 +28,8 @@ * * @since 1.x {@index} */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".services.swagger.Format") +@Named(IsisModuleApplib.NAMESPACE + ".services.swagger.Format") +@Value public enum Format { /** * Generate a format in JSON (text/json media type). diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/swagger/Visibility.java b/api/applib/src/main/java/org/apache/isis/applib/services/swagger/Visibility.java index 6b2b75618e2..e5904d3bbe6 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/swagger/Visibility.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/swagger/Visibility.java @@ -18,8 +18,15 @@ */ package org.apache.isis.applib.services.swagger; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; -import org.apache.isis.applib.annotation.*; +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.RestrictTo; +import org.apache.isis.applib.annotation.Value; /** * Specifies which elements of the metamodel are included within the generated @@ -27,7 +34,8 @@ * * @since 1.x {@index} */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".services.swagger.Visibility") +@Named(IsisModuleApplib.NAMESPACE + ".services.swagger.Visibility") +@Value public enum Visibility { /** diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/user/RoleMemento.java b/api/applib/src/main/java/org/apache/isis/applib/services/user/RoleMemento.java index dc8ab32513b..c3b832153ab 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/user/RoleMemento.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/user/RoleMemento.java @@ -20,6 +20,8 @@ import java.io.Serializable; +import javax.inject.Named; + import org.springframework.context.event.EventListener; import org.springframework.core.annotation.Order; @@ -40,10 +42,9 @@ * * @since 1.x revised for 2.0 {@index} */ +@Named(RoleMemento.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = RoleMemento.LOGICAL_TYPE_NAME -) + nature = Nature.VIEW_MODEL) @DomainObjectLayout( titleUiEvent = RoleMemento.TitleUiEvent.class ) diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java b/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java index e3e841206f3..76ff6ffc9b5 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java +++ b/api/applib/src/main/java/org/apache/isis/applib/services/user/UserMemento.java @@ -27,6 +27,8 @@ import java.util.Objects; import java.util.stream.Stream; +import javax.inject.Named; + import org.springframework.context.event.EventListener; import org.springframework.core.annotation.Order; import org.springframework.lang.Nullable; @@ -59,13 +61,11 @@ * * @since 1.x revised for 2.0 {@index} */ +@Named(UserMemento.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = UserMemento.LOGICAL_TYPE_NAME -) + nature = Nature.VIEW_MODEL) @DomainObjectLayout( - titleUiEvent = UserMemento.TitleUiEvent.class -) + titleUiEvent = UserMemento.TitleUiEvent.class) @lombok.Value @lombok.Builder public class UserMemento implements Serializable { diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/Blob.java b/api/applib/src/main/java/org/apache/isis/applib/value/Blob.java index 7b90adec19e..169deb762a6 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/value/Blob.java +++ b/api/applib/src/main/java/org/apache/isis/applib/value/Blob.java @@ -32,6 +32,7 @@ import javax.activation.MimeType; import javax.activation.MimeTypeParseException; +import javax.inject.Named; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @@ -72,7 +73,8 @@ * @see Clob * @since 1.x {@index} */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.Blob") +@Named(IsisModuleApplib.NAMESPACE + ".value.Blob") +@Value @XmlJavaTypeAdapter(Blob.JaxbToStringAdapter.class) // for JAXB view model support @Log4j2 public final class Blob implements NamedWithMimeType { diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/Clob.java b/api/applib/src/main/java/org/apache/isis/applib/value/Clob.java index e8f40ab83de..78642986b11 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/value/Clob.java +++ b/api/applib/src/main/java/org/apache/isis/applib/value/Clob.java @@ -26,6 +26,7 @@ import javax.activation.MimeType; import javax.activation.MimeTypeParseException; +import javax.inject.Named; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @@ -59,8 +60,8 @@ * @see Blob * @since 1.x {@index} */ -@Value( - logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.Clob") +@Named(IsisModuleApplib.NAMESPACE + ".value.Clob") +@Value @XmlJavaTypeAdapter(Clob.JaxbToStringAdapter.class) // for JAXB view model support //@Log4j2 public final class Clob implements NamedWithMimeType { diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/LocalResourcePath.java b/api/applib/src/main/java/org/apache/isis/applib/value/LocalResourcePath.java index 6aed14beb27..acea0bd3e37 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/value/LocalResourcePath.java +++ b/api/applib/src/main/java/org/apache/isis/applib/value/LocalResourcePath.java @@ -22,6 +22,7 @@ import java.net.URISyntaxException; import java.util.function.UnaryOperator; +import javax.inject.Named; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @@ -50,7 +51,8 @@ * @since 2.0 {@index} * @see OpenUrlStrategy */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.LocalResourcePath") +@Named(IsisModuleApplib.NAMESPACE + ".value.LocalResourcePath") +@Value @XmlJavaTypeAdapter(LocalResourcePath.JaxbToStringAdapter.class) // for JAXB view model support public final class LocalResourcePath implements Serializable { diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/Markup.java b/api/applib/src/main/java/org/apache/isis/applib/value/Markup.java index 40e2aef50af..0edefac4e6f 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/value/Markup.java +++ b/api/applib/src/main/java/org/apache/isis/applib/value/Markup.java @@ -22,6 +22,7 @@ import java.nio.charset.StandardCharsets; import java.util.Base64; +import javax.inject.Named; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @@ -36,7 +37,8 @@ * * @since 2.0 {@index} */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.Markup") +@Named(IsisModuleApplib.NAMESPACE + ".value.Markup") +@Value @XmlJavaTypeAdapter(Markup.JaxbToStringAdapter.class) // for JAXB view model support @EqualsAndHashCode public final class Markup implements Serializable { diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/Password.java b/api/applib/src/main/java/org/apache/isis/applib/value/Password.java index df59c03d10d..c5ab75635a6 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/value/Password.java +++ b/api/applib/src/main/java/org/apache/isis/applib/value/Password.java @@ -21,6 +21,7 @@ import java.io.Serializable; import java.util.Objects; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -33,7 +34,8 @@ * * @since 1.x {@index} */ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.Password") +@Named(IsisModuleApplib.NAMESPACE + ".value.Password") +@Value @XmlAccessorType(XmlAccessType.FIELD) // @XmlJavaTypeAdapter(Password.JaxbToStringAdapter.class) // TODO: not automatically registered because not secure enough. Instead we should set up some sort of mechanism to encrypt. @lombok.Value diff --git a/api/schema/src/main/adoc/modules/schema/pages/about.adoc b/api/schema/src/main/adoc/modules/schema/pages/about.adoc index 1853412da2d..6bc84422fec 100644 --- a/api/schema/src/main/adoc/modules/schema/pages/about.adoc +++ b/api/schema/src/main/adoc/modules/schema/pages/about.adoc @@ -18,7 +18,7 @@ To facilitate such integration scenarios, Apache Isis defines a number of standa These each use XSD types defined by the xref:refguide:schema:common.adoc[common schema] (most notably the `oidDto` complex type which identifies a domain object). NOTE: TODO mappings was removed -The xref:userguide:command-log:about.adoc[Command Log] extension and xref:mappings:outbox-publisher:about.adoc[Outbox Publisher] implementation use these schemas to reify corresponding applib objects (xref:refguide:applib:index/services/command/Command.adoc[Command], `Interaction.Execution` and `PublishedObjects`), either to persist or publishing using an link:http://activemq.apache.org[Apache ActiveMQ] message queue. +The xref:userguide:commandlog:about.adoc[Command Log] extension and xref:mappings:outbox-publisher:about.adoc[Outbox Publisher] implementation use these schemas to reify corresponding applib objects (xref:refguide:applib:index/services/command/Command.adoc[Command], `Interaction.Execution` and `PublishedObjects`), either to persist or publishing using an link:http://activemq.apache.org[Apache ActiveMQ] message queue. The sections below discuss these schemas in more detail. diff --git a/bom/pom.xml b/bom/pom.xml index 53847ad9bb4..a0b23d58d07 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -358,7 +358,7 @@ under the License. 7.3.4 - 3.5.2 + 3.5.2-jbossorg-1 0.1.0 1.0.0 @@ -375,7 +375,7 @@ under the License. 11.3.2 4.3 - 2.13.1 + 2.14.0 4.9.10 31.1-jre @@ -439,7 +439,7 @@ under the License. 3.2.0 - 23.0.9 + 23.0.10 9.10.0 6.0.0-M6 @@ -566,7 +566,7 @@ under the License. org.apache.maven.plugins maven-invoker-plugin - 3.2.2 + 3.3.0 org.apache.maven.plugins @@ -629,7 +629,7 @@ under the License. org.apache.maven.plugins maven-scm-plugin - 1.12.2 + 1.13.0 org.apache.maven.plugins diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_Refs.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_Refs.java index fd1f582828c..c68775e7fba 100644 --- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Refs.java +++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Refs.java @@ -18,8 +18,11 @@ */ package org.apache.isis.commons.internal.base; +import java.io.Serializable; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BooleanSupplier; import java.util.function.IntUnaryOperator; import java.util.function.LongUnaryOperator; import java.util.function.Supplier; @@ -57,6 +60,10 @@ public static BooleanReference booleanRef(final boolean value) { return new BooleanReference(value); } + public static BooleanAtomicReference booleanAtomicRef(final boolean value) { + return new BooleanAtomicReference(value); + } + public static IntReference intRef(final int value) { return new IntReference(value); } @@ -89,7 +96,7 @@ public static final class BooleanReference { private boolean value; public boolean update(final @NonNull BooleanUnaryOperator operator) { - return value=operator.applyAsBoolean(value); + return value = operator.applyAsBoolean(value); } public boolean isTrue() { @@ -101,6 +108,66 @@ public boolean isFalse() { } } + /** + * Serializable thread-safe boolean reference. + * @apiNote unfortunately {@link AtomicBoolean} does not quite provide + * conditional thread-safe value update + */ + @AllArgsConstructor + public static final class BooleanAtomicReference implements Serializable { + private static final long serialVersionUID = 1L; + private boolean value; + private final Object $lock = new Object[0]; // serializable lock + + public boolean compute(final @NonNull BooleanUnaryOperator operator) { + synchronized ($lock) { + return value = operator.applyAsBoolean(value); + } + } + + public boolean computeIfFalse(final @NonNull BooleanSupplier supplier) { + synchronized ($lock) { + return value==false + ? value = supplier.getAsBoolean() + : true; + } + } + + public boolean computeIfTrue(final @NonNull BooleanSupplier supplier) { + synchronized ($lock) { + return value==true + ? value = supplier.getAsBoolean() + : false; + } + } + + public boolean isTrue() { + synchronized ($lock) { + return value; + } + } + + public boolean isFalse() { + synchronized ($lock) { + return !value; + } + } + + @Override + public boolean equals(final Object obj) { + return obj instanceof BooleanAtomicReference + ? this.isTrue() == ((BooleanAtomicReference)obj).isTrue() + : false; + } + + @Override + public int hashCode() { + return isTrue() ? 1 : -1; + } + + } + + /** * Holder of a mutable primitive {@code int} value. * @since 2.0 diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer.java index 55b3279d98c..849ab62f471 100644 --- a/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer.java +++ b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer.java @@ -112,7 +112,7 @@ public interface _IocContainer { * @return IoC managed singleton * @throws NoSuchElementException - if the singleton is not resolvable */ - public default T getSingletonElseFail(final @NonNull Class type) { + default T getSingletonElseFail(final @NonNull Class type) { val candidates = select(type); if (candidates.getCardinality() == Cardinality.ZERO) { diff --git a/core/adoc/modules/_overview/pages/about.adoc b/core/adoc/modules/_overview/pages/about.adoc index 91b0b72e792..6d9510588a0 100644 --- a/core/adoc/modules/_overview/pages/about.adoc +++ b/core/adoc/modules/_overview/pages/about.adoc @@ -1024,8 +1024,8 @@ demoapp.dom.types.primitive.shorts.persistence.PrimitiveShortSeeding + .Dependencies **** com.h2database:h2:jar: + -org.apache.isis.extensions:isis-extensions-command-log-jdo:jar: + -org.apache.isis.extensions:isis-extensions-command-log-jpa:jar: + +org.apache.isis.extensions:isis-extensions-commandlog-jdo:jar: + +org.apache.isis.extensions:isis-extensions-commandlog-jpa:jar: + org.apache.isis.extensions:isis-extensions-exceldownload-ui:jar: + org.apache.isis.extensions:isis-extensions-fullcalendar-applib:jar: + org.apache.isis.extensions:isis-extensions-pdfjs-applib:jar: + @@ -1102,8 +1102,8 @@ demoapp.web._infra.utils.ThereCanBeOnlyOne + .Dependencies **** org.apache.isis.examples.apps:demo-domain:jar:${project.version} + -org.apache.isis.extensions:isis-extensions-command-replay-primary:jar: + -org.apache.isis.extensions:isis-extensions-command-replay-secondary:jar: + +org.apache.isis.extensions:isis-extensions-commandreplay-primary:jar: + +org.apache.isis.extensions:isis-extensions-commandreplay-secondary:jar: + org.apache.isis.extensions:isis-extensions-cors-impl:jar: + org.apache.isis.mavendeps:isis-mavendeps-webapp:pom: + org.springframework.boot:spring-boot-starter:jar: + @@ -4868,9 +4868,9 @@ package "Core: Command Log\n[Software System]" { [source,yaml] ---- Group: org.apache.isis.extensions -Artifact: isis-extensions-command-log +Artifact: isis-extensions-commandlog Type: pom -Directory: /extensions/core/command-log +Directory: /extensions/core/commandlog ---- |Logs commands @@ -4878,9 +4878,9 @@ Directory: /extensions/core/command-log [source,yaml] ---- Group: org.apache.isis.extensions -Artifact: isis-extensions-command-log-applib +Artifact: isis-extensions-commandlog-applib Type: jar -Directory: /extensions/core/command-log/applib +Directory: /extensions/core/commandlog/applib ---- |.Components **** @@ -4909,9 +4909,9 @@ xref:refguide:extensions:index/commandlog/applib/command/subscriber/CommandSubsc [source,yaml] ---- Group: org.apache.isis.extensions -Artifact: isis-extensions-command-log-jdo +Artifact: isis-extensions-commandlog-jdo Type: jar -Directory: /extensions/core/command-log/jdo +Directory: /extensions/core/commandlog/jdo ---- |.Components **** @@ -4920,7 +4920,7 @@ o.a.i.extensions.commandlog.jdo.entities.CommandJdoRepository + .Dependencies **** -org.apache.isis.extensions:isis-extensions-command-log-applib:jar: + +org.apache.isis.extensions:isis-extensions-commandlog-applib:jar: + org.apache.isis.mavendeps:isis-mavendeps-integtests:pom: + org.apache.isis.mavendeps:isis-mavendeps-unittests:pom: + org.apache.isis.persistence:isis-persistence-jdo-datanucleus:jar: + @@ -4935,9 +4935,9 @@ xref:refguide:extensions:index/commandlog/jdo/IsisModuleExtCommandLogJdo.adoc[Is [source,yaml] ---- Group: org.apache.isis.extensions -Artifact: isis-extensions-command-log-jpa +Artifact: isis-extensions-commandlog-jpa Type: jar -Directory: /extensions/core/command-log/jpa +Directory: /extensions/core/commandlog/jpa ---- |.Components **** @@ -4946,7 +4946,7 @@ o.a.i.extensions.commandlog.jpa.entities.CommandJpaRepository + .Dependencies **** -org.apache.isis.extensions:isis-extensions-command-log-applib:jar: + +org.apache.isis.extensions:isis-extensions-commandlog-applib:jar: + org.apache.isis.mavendeps:isis-mavendeps-integtests:pom: + org.apache.isis.mavendeps:isis-mavendeps-unittests:pom: + org.apache.isis.persistence:isis-persistence-jpa-eclipselink:jar: + @@ -5008,9 +5008,9 @@ package "Core: Command Replay\n[Software System]" { [source,yaml] ---- Group: org.apache.isis.extensions -Artifact: isis-extensions-command-replay +Artifact: isis-extensions-commandreplay Type: pom -Directory: /extensions/core/command-replay +Directory: /extensions/core/commandreplay ---- |Replays commands to secondary system @@ -5018,9 +5018,9 @@ Directory: /extensions/core/command-replay [source,yaml] ---- Group: org.apache.isis.extensions -Artifact: isis-extensions-command-replay-primary +Artifact: isis-extensions-commandreplay-primary Type: jar -Directory: /extensions/core/command-replay/primary +Directory: /extensions/core/commandreplay/primary ---- |A module for obtaining commands from a primary @@ -5035,7 +5035,7 @@ o.a.i.extensions.commandreplay.primary.spiimpl.CaptureResultOfCommand + org.apache.isis.core:isis-core-config:jar: + org.apache.isis.core:isis-core-runtime:jar: + org.apache.isis.core:isis-schema:jar: + -org.apache.isis.extensions:isis-extensions-command-log-applib:jar: + +org.apache.isis.extensions:isis-extensions-commandlog-applib:jar: + org.apache.isis.testing:isis-testing-fixtures-applib:jar: + **** @@ -5048,9 +5048,9 @@ xref:refguide:extensions:index/commandreplay/primary/IsisModuleExtCommandReplayP [source,yaml] ---- Group: org.apache.isis.extensions -Artifact: isis-extensions-command-replay-secondary +Artifact: isis-extensions-commandreplay-secondary Type: jar -Directory: /extensions/core/command-replay/secondary +Directory: /extensions/core/commandreplay/secondary ---- |A module providing a Quartz Job to run on a secondary system, for obtaining commands from a primary and saving them so that they are replayed. @@ -5070,7 +5070,7 @@ org.apache.isis.core:isis-core-config:jar: + org.apache.isis.core:isis-core-internaltestsupport:jar: + org.apache.isis.core:isis-core-runtime:jar: + org.apache.isis.core:isis-schema:jar: + -org.apache.isis.extensions:isis-extensions-command-log-applib:jar: + +org.apache.isis.extensions:isis-extensions-commandlog-applib:jar: + org.apache.isis.extensions:isis-extensions-quartz-impl:jar: + org.apache.isis.testing:isis-testing-fixtures-applib:jar: + org.apache.isis.viewer:isis-viewer-restfulobjects-client:jar: + diff --git a/core/config/src/main/adoc/modules/config/pages/sections/isis.extensions.adoc b/core/config/src/main/adoc/modules/config/pages/sections/isis.extensions.adoc index 0873b027886..8d8b7395f12 100644 --- a/core/config/src/main/adoc/modules/config/pages/sections/isis.extensions.adoc +++ b/core/config/src/main/adoc/modules/config/pages/sections/isis.extensions.adoc @@ -12,8 +12,8 @@ include::../section-hooks/isis.extensions~pre.adoc[] |Default |Description | -[[isis.extensions.command-replay.analyser.exception.enabled]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.analyser.exception.enabled]] +isis.extensions.commandreplay. + analyser.exception.enabled | true @@ -21,8 +21,8 @@ analyser.exception.enabled | -[[isis.extensions.command-replay.analyser.result.enabled]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.analyser.result.enabled]] +isis.extensions.commandreplay. + analyser.result.enabled | true @@ -30,8 +30,8 @@ analyser.result.enabled | -[[isis.extensions.command-replay.batch-size]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.batch-size]] +isis.extensions.commandreplay. + batch-size | 10 @@ -39,44 +39,44 @@ batch-size | -[[isis.extensions.command-replay.primary-access.base-url-restful]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.primary-access.base-url-restful]] +isis.extensions.commandreplay. + primary-access.base-url-restful -| +| | null | -[[isis.extensions.command-replay.primary-access.base-url-wicket]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.primary-access.base-url-wicket]] +isis.extensions.commandreplay. + primary-access.base-url-wicket -| +| | null | -[[isis.extensions.command-replay.primary-access.password]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.primary-access.password]] +isis.extensions.commandreplay. + primary-access.password -| +| | null | -[[isis.extensions.command-replay.primary-access.user]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.primary-access.user]] +isis.extensions.commandreplay. + primary-access.user -| +| | null | -[[isis.extensions.command-replay.quartz-replicate-and-replay-job.repeat-interval]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.quartz-replicate-and-replay-job.repeat-interval]] +isis.extensions.commandreplay. + quartz-replicate-and-replay-job. + repeat-interval @@ -85,8 +85,8 @@ repeat-interval | -[[isis.extensions.command-replay.quartz-replicate-and-replay-job.start-delay]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.quartz-replicate-and-replay-job.start-delay]] +isis.extensions.commandreplay. + quartz-replicate-and-replay-job. + start-delay @@ -95,8 +95,8 @@ start-delay | -[[isis.extensions.command-replay.quartz-session.roles]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.quartz-session.roles]] +isis.extensions.commandreplay. + quartz-session.roles | isisModuleExtCommandReplaySecondar + @@ -105,8 +105,8 @@ yRole | -[[isis.extensions.command-replay.quartz-session.user]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.quartz-session.user]] +isis.extensions.commandreplay. + quartz-session.user | isisModuleExtCommandReplaySecondar + @@ -115,11 +115,11 @@ yUser | -[[isis.extensions.command-replay.secondary-access.base-url-wicket]] -isis.extensions.command-replay. + +[[isis.extensions.commandreplay.secondary-access.base-url-wicket]] +isis.extensions.commandreplay. + secondary-access.base-url-wicket -| +| | null @@ -128,7 +128,7 @@ secondary-access.base-url-wicket isis.extensions.cors. + allow-credentials -| +| | TODO missing java-doc @@ -137,7 +137,7 @@ allow-credentials isis.extensions.cors. + allowed-headers -| +| | Which HTTP headers are allowed in a CORS request. For more information, check the usage of the ``headers`` init parameter for https://github.com/eBay/cors-filter[EBay CORSFilter]. @@ -148,7 +148,7 @@ For more information, check the usage of the ``headers`` init parameter for http isis.extensions.cors. + allowed-methods -| +| | Which HTTP methods are permitted in a CORS request. For more information, check the usage of the ``methods`` init parameter for https://github.com/eBay/cors-filter[EBay CORSFilter]. @@ -183,7 +183,7 @@ For more information, check the usage of the ``headers`` init parameter for http isis.extensions.secman. + delegated-users.auto-create-policy -| +| | Whether delegated users should be autocreated as locked (the default) or unlocked. BE AWARE THAT if any users are auto-created as unlocked, then the set of roles that they are given should be highly restricted !!! @@ -194,7 +194,7 @@ BE AWARE THAT if any users are auto-created as unlocked, then the set of roles t isis.extensions.secman. + permissions-evaluation-policy -| +| | If there are conflicting (allow vs veto) permissions at the same scope, then this policy determines whether to prefer to allow the permission or to veto it. This is only used if a ``PermissionsEvaluationService`` has not been declared explicitly. @@ -205,7 +205,7 @@ This is only used if a ``PermissionsEvaluationService`` has not been declared ex isis.extensions.secman.seed.admin. + namespace-permissions.additional -| +| | An (optional) additional set of namespaces that the admin role is granted. These are in addition to the main namespaces granted. @@ -218,7 +218,7 @@ These are in addition to the main namespaces granted. isis.extensions.secman.seed.admin. + namespace-permissions.sticky -| +| | The set of namespaces to which the admin role is granted. These namespaces are intended to be sufficient to allow users with this admin role to be able to administer the security module itself, for example to manage users and roles. The security user is not necessarily able to use the main business logic within the domain application itself, though. @@ -235,7 +235,7 @@ WARNING: normally these should not be overridden. Instead, specify additional na isis.extensions.secman.seed.admin. + password -| +| | The corresponding password for admin user. @see #getUserName() @@ -244,7 +244,7 @@ password isis.extensions.secman.seed.admin. + role-name -| +| | The name of security admin role. Users with this role (in particular, the default admin user are granted access to a set of namespaces (``NamespacePermissions#getSticky()`` and ``NamespacePermissions#getAdditional()``) which are intended to be sufficient to allow users with this admin role to be able to administer the security module itself, for example to manage users and roles. @@ -257,7 +257,7 @@ Users with this role (in particular, the default admin user are granted access t isis.extensions.secman.seed.admin. + user-name -| +| | The name of the security super user. This user is automatically made a member of the admin role, from which it is granted permissions to administer other users. @@ -272,7 +272,7 @@ The password for this user is set in ``Admin#getPassword()``. isis.extensions.secman.seed. + regular-user.role-name -| +| | The role name for regular users of the application, granting them access to basic security features. The exact set of permissions is hard-wired in the ``IsisExtSecmanRegularUserRoleAndPermissions`` fixture. @@ -283,7 +283,7 @@ The exact set of permissions is hard-wired in the ``IsisExtSecmanRegularUserRole isis.extensions.secman. + user-menu-me-action-policy -| +| | Whether the presence of SecMan should result in the automatic suppression of the ``UserMenu``'s me action. This is normally what is required as SecMan's ``ApplicationUser`` is a more comprehensive representation of the current user. If the default me action is not suppressed, then the end-user will see two actions with the name "me" in the tertiary menu. @@ -295,7 +295,7 @@ isis.extensions.secman. + user-registration. + initial-role-names -| +| | The set of roles that users registering with the app are granted automatically. If using the wicket viewer, also requires isis.viewer.wicket.suppress-signup to be set ``false``, along with any other of its other prereqs. diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java index 0a34429cf46..f2bddf4e2c9 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java +++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java @@ -41,6 +41,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import javax.activation.DataSource; +import javax.inject.Named; import javax.validation.Constraint; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; @@ -54,8 +55,6 @@ import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.ActionLayout; -import org.apache.isis.applib.annotation.DomainObject; -import org.apache.isis.applib.annotation.DomainService; import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy; import org.apache.isis.applib.annotation.LabelPosition; import org.apache.isis.applib.annotation.PromptStyle; @@ -1402,7 +1401,7 @@ public static class Validator { /** * Whether to ensure that the logical-type-name of all objects must be specified explicitly, using either - * {@link DomainObject#logicalTypeName()} or {@link DomainService#logicalTypeName()}. + * {@link Named}. * *

* It is highly advisable to leave this set as enabled (the default). These logical-type-names @@ -3029,6 +3028,13 @@ public enum UserMenuMeActionPolicy { */ private UserMenuMeActionPolicy userMenuMeActionPolicy = UserMenuMeActionPolicy.HIDE; } + + private final SessionLog sessionLog = new SessionLog(); + @Data + public static class SessionLog { + boolean autoLogoutOnRestart = true; + } + } private static List listOf(final String ...values) { diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanFactoryPostProcessorForSpring.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanFactoryPostProcessorForSpring.java index 340bfcb93bd..7a95ca80406 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanFactoryPostProcessorForSpring.java +++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanFactoryPostProcessorForSpring.java @@ -126,7 +126,7 @@ public IsisBeanTypeClassifier getIsisBeanTypeClassifier() { } @Bean("isis.bean-meta-data") - public Can getIsisComponentScanInterceptor() { + public Can getComponentScanResult() { return isisComponentScanInterceptor.getAndDrainIntrospectableTypes(); } diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanMetaData.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanMetaData.java index c117ddd6110..4a66bab965c 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanMetaData.java +++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanMetaData.java @@ -18,6 +18,7 @@ */ package org.apache.isis.core.config.beans; +import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.services.metamodel.BeanSort; import lombok.NonNull; @@ -26,8 +27,61 @@ @Value(staticConstructor = "of") public class IsisBeanMetaData { - private final @NonNull Class correspondingClass; + public enum ManagedBy { + UNSPECIFIED, + SPRING, + ISIS; + public boolean isUnspecified() {return this == ManagedBy.UNSPECIFIED; } + public boolean isSpring() {return this == ManagedBy.SPRING; } + public boolean isIsis() {return this == ManagedBy.ISIS; } + /** + * Whether Spring should make that underlying bean injectable. + * @implNote if not managed by Isis, let ultimately Spring decide + */ + public boolean isInjectable() { + return !isIsis(); + } + } + private final @NonNull BeanSort beanSort; - private final @NonNull String beanName; + private final @NonNull LogicalType logicalType; + private @NonNull ManagedBy managedBy; + + public Class getCorrespondingClass() { + return logicalType.getCorrespondingClass(); + } + + public String getBeanName() { + return logicalType.getLogicalTypeName(); + } + + // -- FACTORIES + + public static IsisBeanMetaData injectable( + final @NonNull BeanSort beanSort, + final @NonNull LogicalType logicalType) { + return of(beanSort, logicalType, ManagedBy.SPRING); + } + + /** + * Let Spring decide. + */ + public static IsisBeanMetaData indifferent( + final @NonNull BeanSort beanSort, + final @NonNull Class type) { + return of(beanSort, LogicalType.infer(type), ManagedBy.UNSPECIFIED); + } + + public static IsisBeanMetaData isisManaged( + final @NonNull BeanSort beanSort, + final @NonNull LogicalType logicalType) { + return of(beanSort, logicalType, ManagedBy.ISIS); + } + + public static IsisBeanMetaData isisManaged( + final @NonNull BeanSort beanSort, + final @NonNull Class type) { + return isisManaged(beanSort, LogicalType.infer(type)); + } } diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifier.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifier.java index bb90bb718ae..c06d956ed95 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifier.java +++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifier.java @@ -20,12 +20,10 @@ import org.springframework.context.ApplicationContext; -import org.apache.isis.applib.services.metamodel.BeanSort; import org.apache.isis.commons.collections.Can; import org.apache.isis.commons.internal.context._Plugin; import lombok.NonNull; -import lombok.Value; /** * ServiceLoader SPI that allows for implementing instances to have a say during bean type scanning. @@ -43,7 +41,7 @@ public interface IsisBeanTypeClassifier { * but later used by the {@code SpecificationLoader} to also * classify non-concrete types (interfaces and abstract classes). */ - BeanClassification classify(Class type); + IsisBeanMetaData classify(Class type); // -- FACTORY @@ -65,37 +63,4 @@ public static Can get() { return Can.ofCollection(_Plugin.loadAll(IsisBeanTypeClassifier.class)); } - // -- BEAN CLASSIFICATION RESULT - - @Value(staticConstructor = "of") - public static class BeanClassification { - - BeanSort beanSort; - String explicitLogicalTypeName; - boolean delegateLifecycleManagement; - - // -- FACTORIES - - public static BeanClassification delegated(final BeanSort beanSort, final String explicitLogicalTypeName) { - return of(beanSort, explicitLogicalTypeName, true); - } - - public static BeanClassification delegated(final BeanSort beanSort) { - return delegated(beanSort, null); - } - - public static BeanClassification selfManaged(final BeanSort beanSort, final String explicitLogicalTypeName) { - return of(beanSort, explicitLogicalTypeName, false); - } - - public static BeanClassification selfManaged(final BeanSort beanSort) { - return selfManaged(beanSort, null); - } - - } - - - - - } diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java index 321954c534e..e4304eff804 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java +++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java @@ -21,19 +21,17 @@ import java.io.Serializable; import java.lang.reflect.Modifier; import java.util.Collection; -import java.util.Locale; import javax.persistence.Entity; -import javax.persistence.Table; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.services.metamodel.BeanSort; import org.apache.isis.commons.collections.Can; -import org.apache.isis.commons.internal.base._Strings; import org.apache.isis.commons.internal.reflection._Annotations; import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.TypeVetoMarker; @@ -51,20 +49,20 @@ final class IsisBeanTypeClassifierDefault private final Can classifierPlugins = IsisBeanTypeClassifier.get(); @Override - public BeanClassification classify( + public IsisBeanMetaData classify( final @NonNull Class type) { // handle arbitrary types ... if(type.isPrimitive() || type.isEnum()) { - return BeanClassification.delegated(BeanSort.VALUE); + return IsisBeanMetaData.indifferent(BeanSort.VALUE, type); } if(Collection.class.isAssignableFrom(type) || Can.class.isAssignableFrom(type) || type.isArray()) { - return BeanClassification.selfManaged(BeanSort.COLLECTION); + return IsisBeanMetaData.isisManaged(BeanSort.COLLECTION, type); } if(type.isInterface() @@ -76,12 +74,12 @@ public BeanClassification classify( // and should also never be identified as ENTITY, VIEWMODEL or MIXIN // however, concrete types that inherit abstract ones with vetoes, // will effectively be vetoed through means of annotation synthesis - return BeanClassification.delegated(BeanSort.ABSTRACT); + return IsisBeanMetaData.indifferent(BeanSort.ABSTRACT, type); } // handle vetoing ... if(TypeVetoMarker.anyMatchOn(type)) { - return BeanClassification.selfManaged(BeanSort.VETOED); // reject + return IsisBeanMetaData.isisManaged(BeanSort.VETOED, type); // reject } val profiles = Can.ofArray(_Annotations.synthesize(type, Profile.class) @@ -89,7 +87,7 @@ public BeanClassification classify( .orElse(null)); if(profiles.isNotEmpty() && !profiles.stream().anyMatch(this::isProfileActive)) { - return BeanClassification.selfManaged(BeanSort.VETOED); // reject + return IsisBeanMetaData.isisManaged(BeanSort.VETOED, type); // reject } // handle value types ... @@ -97,19 +95,17 @@ public BeanClassification classify( val aValue = _Annotations.synthesize(type, org.apache.isis.applib.annotation.Value.class) .orElse(null); if(aValue!=null) { - return BeanClassification.delegated(BeanSort.VALUE); + return IsisBeanMetaData.indifferent(BeanSort.VALUE, type); } // handle actual bean types ... val aDomainService = _Annotations.synthesize(type, DomainService.class); if(aDomainService.isPresent()) { - return _Strings.isNotEmpty(aDomainService.get().logicalTypeName()) - ? BeanClassification - .delegated(BeanSort.MANAGED_BEAN_CONTRIBUTING, - aDomainService.get().logicalTypeName()) - : BeanClassification - .delegated(BeanSort.MANAGED_BEAN_CONTRIBUTING); + val logicalType = LogicalType.infer(type); + // overrides Spring naming strategy + return IsisBeanMetaData + .injectable(BeanSort.MANAGED_BEAN_CONTRIBUTING, logicalType); } // allow ServiceLoader plugins to have a say, eg. when classifying entity types @@ -121,68 +117,42 @@ public BeanClassification classify( } if(org.apache.isis.applib.ViewModel.class.isAssignableFrom(type)) { - return BeanClassification.selfManaged(BeanSort.VIEW_MODEL); + return IsisBeanMetaData.isisManaged(BeanSort.VIEW_MODEL, type); } val entityAnnotation = _Annotations.synthesize(type, Entity.class).orElse(null); if(entityAnnotation!=null) { - - String logicalTypeName = null; - - val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null); - if(aDomainObject!=null) { - logicalTypeName = aDomainObject.logicalTypeName(); - } - - // don't trample over the @DomainObject(logicalTypeName=..) if present - if(_Strings.isEmpty(logicalTypeName)) { - val aTable = _Annotations.synthesize(type, Table.class).orElse(null); - if(aTable!=null) { - val schema = aTable.schema(); - if(_Strings.isNotEmpty(schema)) { - val table = aTable.name(); - logicalTypeName = String.format("%s.%s", schema.toLowerCase(Locale.ROOT), - _Strings.isNotEmpty(table) - ? table - : type.getSimpleName()); - } - } - } - - if(_Strings.isNotEmpty(logicalTypeName)) { - BeanClassification.selfManaged( - BeanSort.ENTITY, logicalTypeName); - } - return BeanClassification.selfManaged(BeanSort.ENTITY); + return IsisBeanMetaData.isisManaged(BeanSort.ENTITY, LogicalType.infer(type)); } val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null); if(aDomainObject!=null) { switch (aDomainObject.nature()) { case BEAN: - return BeanClassification.delegated( + val logicalType = LogicalType.infer(type); + return IsisBeanMetaData.injectable( BeanSort.MANAGED_BEAN_CONTRIBUTING, - aDomainObject.logicalTypeName()); + logicalType); case MIXIN: - return BeanClassification.selfManaged(BeanSort.MIXIN); + return IsisBeanMetaData.isisManaged(BeanSort.MIXIN, type); case ENTITY: - return BeanClassification.selfManaged(BeanSort.ENTITY); + return IsisBeanMetaData.isisManaged(BeanSort.ENTITY, type); case VIEW_MODEL: case NOT_SPECIFIED: //because object is not associated with a persistence context unless discovered above - return BeanClassification.selfManaged(BeanSort.VIEW_MODEL); + return IsisBeanMetaData.isisManaged(BeanSort.VIEW_MODEL, type); } } if(_Annotations.isPresent(type, Component.class)) { - return BeanClassification.delegated(BeanSort.MANAGED_BEAN_NOT_CONTRIBUTING); + return IsisBeanMetaData.indifferent(BeanSort.MANAGED_BEAN_NOT_CONTRIBUTING, type); } if(Serializable.class.isAssignableFrom(type)) { - return BeanClassification.delegated(BeanSort.VALUE); + return IsisBeanMetaData.indifferent(BeanSort.VALUE, type); } - return BeanClassification.delegated(BeanSort.UNKNOWN); + return IsisBeanMetaData.indifferent(BeanSort.UNKNOWN, type); } // -- HELPER diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeRegistry.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeRegistry.java index 575827c26d8..752e44b1acb 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeRegistry.java +++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeRegistry.java @@ -20,7 +20,6 @@ import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.stream.Stream; import org.apache.isis.applib.value.semantics.ValueSemanticsProvider; @@ -35,11 +34,11 @@ public interface IsisBeanTypeRegistry { Stream streamIntrospectableTypes(); Map, IsisBeanMetaData> getManagedBeansContributing(); - Set> getEntityTypes(); - Set> getMixinTypes(); - Set> getViewModelTypes(); + Map, IsisBeanMetaData> getEntityTypes(); + Map, IsisBeanMetaData> getMixinTypes(); + Map, IsisBeanMetaData> getViewModelTypes(); /** discovered per {@code @Value} annotation (vs. registered using a {@link ValueSemanticsProvider})*/ - Set> getDiscoveredValueTypes(); + Map, IsisBeanMetaData> getDiscoveredValueTypes(); // -- LOOKUPS diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeRegistryDefault.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeRegistryDefault.java index c11d79ef55d..962086e093d 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeRegistryDefault.java +++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeRegistryDefault.java @@ -19,10 +19,8 @@ package org.apache.isis.core.config.beans; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.stream.Stream; import javax.annotation.Priority; @@ -45,7 +43,8 @@ @Named("isis.config.IsisBeanTypeRegistryImpl") @Priority(PriorityPrecedence.EARLY) @Qualifier("Default") -public class IsisBeanTypeRegistryDefault implements IsisBeanTypeRegistry { +public class IsisBeanTypeRegistryDefault +implements IsisBeanTypeRegistry { /** * (immutable) scan result, as used by the SpecificationLoader for introspection @@ -56,11 +55,20 @@ public class IsisBeanTypeRegistryDefault implements IsisBeanTypeRegistry { // -- DISTINCT CATEGORIES OF BEAN SORTS - @Getter(onMethod_ = {@Override}) private final Map, IsisBeanMetaData> managedBeansContributing = new HashMap<>(); - @Getter(onMethod_ = {@Override}) private final Set> entityTypes = new HashSet<>(); - @Getter(onMethod_ = {@Override}) private final Set> mixinTypes = new HashSet<>(); - @Getter(onMethod_ = {@Override}) private final Set> viewModelTypes = new HashSet<>(); - @Getter(onMethod_ = {@Override}) private final Set> discoveredValueTypes = new HashSet<>(); + @Getter(onMethod_ = {@Override}) + private final Map, IsisBeanMetaData> managedBeansContributing = new HashMap<>(); + + @Getter(onMethod_ = {@Override}) + private final Map, IsisBeanMetaData> entityTypes = new HashMap<>(); + + @Getter(onMethod_ = {@Override}) + private final Map, IsisBeanMetaData> mixinTypes = new HashMap<>(); + + @Getter(onMethod_ = {@Override}) + private final Map, IsisBeanMetaData> viewModelTypes = new HashMap<>(); + + @Getter(onMethod_ = {@Override}) + private final Map, IsisBeanMetaData> discoveredValueTypes = new HashMap<>(); // -- LOOKUPS @@ -82,27 +90,27 @@ public Stream streamIntrospectableTypes() { public IsisBeanTypeRegistryDefault(final @NonNull Can introspectableTypes) { this.introspectableTypes = introspectableTypes; - introspectableTypes.forEach(type->{ + introspectableTypes.forEach(typeMeta->{ - val cls = type.getCorrespondingClass(); + val cls = typeMeta.getCorrespondingClass(); - introspectableTypesByClass.put(type.getCorrespondingClass(), type); + introspectableTypesByClass.put(typeMeta.getCorrespondingClass(), typeMeta); - switch (type.getBeanSort()) { + switch (typeMeta.getBeanSort()) { case MANAGED_BEAN_CONTRIBUTING: - managedBeansContributing.put(cls, type); + managedBeansContributing.put(cls, typeMeta); return; case MIXIN: - mixinTypes.add(cls); + mixinTypes.put(cls, typeMeta); return; case ENTITY: - entityTypes.add(cls); + entityTypes.put(cls, typeMeta); return; case VIEW_MODEL: - viewModelTypes.add(cls); + viewModelTypes.put(cls, typeMeta); return; case VALUE: - discoveredValueTypes.add(cls); + discoveredValueTypes.put(cls, typeMeta); return; // skip introspection for these diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisComponentScanInterceptorImpl.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisComponentScanInterceptorImpl.java index d881c49e909..88270cf300e 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisComponentScanInterceptorImpl.java +++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisComponentScanInterceptorImpl.java @@ -20,7 +20,6 @@ import java.util.Map; -import org.apache.isis.applib.services.metamodel.BeanSort; import org.apache.isis.commons.collections.Can; import org.apache.isis.commons.internal.collections._Maps; import org.apache.isis.commons.internal.exceptions._Exceptions; @@ -70,43 +69,34 @@ public Can getAndDrainIntrospectableTypes() { // -- FILTER @Override - public void intercept(final ScannedTypeMetaData typeMeta) { + public void intercept(final ScannedTypeMetaData scanMeta) { - val classOrFailure = typeMeta.getUnderlyingClassOrFailure(); + val classOrFailure = scanMeta.getUnderlyingClass(); if(classOrFailure.isFailure()) { log.warn(classOrFailure.getFailure()); return; } - val type = classOrFailure.getUnderlyingClass(); - val classification = isisBeanTypeClassifier.classify(type); + val correspondingClass = classOrFailure.getValue().get(); + val typeMeta = isisBeanTypeClassifier.classify(correspondingClass); - val delegated = classification.isDelegateLifecycleManagement(); - typeMeta.setInjectable(delegated); - if(delegated) { - typeMeta.setBeanNameOverride(classification.getExplicitLogicalTypeName()); + scanMeta.setInjectable(typeMeta.getManagedBy().isInjectable()); + if(typeMeta.getManagedBy().isIsis()) { + // otherwise we don't interfere with naming strategies + scanMeta.setBeanNameOverride(typeMeta.getLogicalType().getLogicalTypeName()); } - val beanSort = classification.getBeanSort(); - + val beanSort = typeMeta.getBeanSort(); if(beanSort.isToBeIntrospected()) { - addIntrospectableType(beanSort, typeMeta); - + introspectableTypes.put(correspondingClass, typeMeta); if(log.isDebugEnabled()) { log.debug("to-be-introspected: {} [{}]", - type, + correspondingClass, beanSort.name()); } } } - // -- HELPER - - private void addIntrospectableType(final BeanSort sort, final ScannedTypeMetaData typeMeta) { - val correspondingClass = typeMeta.getUnderlyingClassOrFailure().getUnderlyingClass(); - val type = IsisBeanMetaData.of(correspondingClass, sort, typeMeta.getEffectiveBeanName()); - introspectableTypes.put(correspondingClass, type); - } } \ No newline at end of file diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/ScannedTypeMetaData.java b/core/config/src/main/java/org/apache/isis/core/config/beans/ScannedTypeMetaData.java index 7fa7a8ad7c1..acd4b249d8e 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/beans/ScannedTypeMetaData.java +++ b/core/config/src/main/java/org/apache/isis/core/config/beans/ScannedTypeMetaData.java @@ -18,13 +18,13 @@ */ package org.apache.isis.core.config.beans; +import org.apache.isis.commons.functional.Try; import org.apache.isis.commons.internal.base._Strings; import org.apache.isis.commons.internal.context._Context; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; -import lombok.Value; import lombok.val; @RequiredArgsConstructor(staticName = "of") @@ -51,7 +51,7 @@ final class ScannedTypeMetaData { @Getter @Setter private boolean injectable = true; @Getter(lazy=true) - private final ClassOrFailure underlyingClassOrFailure = resolveClass(); + private final Try> underlyingClass = resolveClass(); // -- UTILITY @@ -63,28 +63,15 @@ public String getEffectiveBeanName() { // -- HELPER - /** - * Holds either the class or the failure string when attempting to load by name. - */ - @Value(staticConstructor = "of") - static final class ClassOrFailure { - Class underlyingClass; - String failure; - public boolean isFailure() { - return underlyingClass==null; - } - } - /** * @return the underlying class of this TypeMetaData */ - private ClassOrFailure resolveClass() { - try { - return ClassOrFailure.of(_Context.loadClass(className), null); - } catch (ClassNotFoundException e) { - val msg = String.format("Failed to load class for name '%s', throwing %s", className, e); - return ClassOrFailure.of(null, msg); - } + private Try> resolveClass() { + return Try.>call(()->_Context.loadClass(className)) + .mapFailure(ex->{ + val msg = String.format("Failed to load class for name '%s'", className); + return new RuntimeException(msg, ex); + }); } diff --git a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java index 8dc2ca1b077..d93d294b241 100644 --- a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java +++ b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java @@ -447,8 +447,8 @@ public static enum Validation { + "(for de-serialization from memento string)."), DOMAIN_OBJECT_MISSING_A_NAMESPACE("${type}: the object type must declare a namespace, " + "yet there was none found in '${logicalTypeName}'; " - + "eg. @DomainObject(logicalTypeName=\"Customer\") is considered invalid, " - + "whereas @DomainObject(logicalTypeName=\"sales.Customer\") is valid."), + + "eg. @Named(\"Customer\") is considered invalid, " + + "whereas @Named(\"sales.Customer\") is valid."), DOMAIN_SERVICE_MISSING_A_NAMESPACE("${type}: the service type must declare a namespace, " + "yet there was none found in '${logicalTypeName}'; " + "Spring supports various naming strategies @Named(...) being one of them, " @@ -464,6 +464,9 @@ public static enum Validation { + "Consider importing type ${type} with Spring's @Import annotation. " + "Types of sort VALUE should instead register a ValueSemanticsProvider with Spring, " + "to be properly understood by the framework."), + NON_UNIQUE_LOGICAL_TYPE_NAME_OR_ALIAS("Logical type name (or alias) ${logicalTypeName} " + + "mapped to multiple non-abstract classes:\n" + + "${csv}"), ; private final String template; public String getMessage(final Identifier featureIdentifier) { diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java index c71aff30c7f..876701df0da 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java @@ -190,11 +190,6 @@ public ManagedObject lookupServiceAdapterById(final String serviceId) { // -- LOOKUP - @Override - public T getSingletonElseFail(final Class type) { - return getSystemEnvironment().ioc().getSingletonElseFail(type); - } - private Stream streamSingletons() { val fields = Stream.of( diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/HasMetaModelContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/HasMetaModelContext.java index 8b402fb258f..6917a53c084 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/HasMetaModelContext.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/HasMetaModelContext.java @@ -136,10 +136,6 @@ default ManagedObject lookupServiceAdapterById(final String serviceId) { return getMetaModelContext().lookupServiceAdapterById(serviceId); } - default T getSingletonElseFail(final Class type) { - return getMetaModelContext().getSingletonElseFail(type); - } - default Stream streamServiceAdapters() { return getMetaModelContext().streamServiceAdapters(); } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext.java index 60031413456..3bf2024b061 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext.java @@ -75,11 +75,11 @@ public interface MetaModelContext { SpecificationLoader getSpecificationLoader(); - public default Optional specForType(final @Nullable Class type) { + default Optional specForType(final @Nullable Class type) { return getSpecificationLoader().specForType(type); } - public default ObjectSpecification specForTypeElseFail(final @Nullable Class type) { + default ObjectSpecification specForTypeElseFail(final @Nullable Class type) { return getSpecificationLoader().specForTypeElseFail(type); } @@ -105,28 +105,18 @@ public default ObjectSpecification specForTypeElseFail(final @Nullable Class ManagedObject getHomePageAdapter(); + // cannot move to ServiceRegistry, because applib does not know ManagedObject Stream streamServiceAdapters(); + // cannot move to ServiceRegistry, because applib does not know ManagedObject ManagedObject lookupServiceAdapterById(String serviceId); - /** - * Requires that there is AT LEAST one implementation of the service, and returns it. - * - *

- * If there is more than one implementation, then the one with the "highest" - * priority (either annotated with {@link org.springframework.context.annotation.Primary}, - * else with encountered with earliest {@link org.apache.isis.applib.annotation.PriorityPrecedence precedence}) - * is used instead. - *

- * - * @param type - * @param - */ - T getSingletonElseFail(Class type); - /** * Recovers an object (graph) from given {@code bookmark}. - * Also resolves injection-points for the result. + *

+ * Resolves injection-points for the result. + *

+ * Supports alias lookup. */ default Optional loadObject(final @Nullable Bookmark bookmark) { if(bookmark==null) { diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java index 01c0cd56a2a..cce36b1edcb 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java @@ -132,11 +132,6 @@ public MetaModelContext_usingIoc(final _IocContainer iocContainer) { getSingletonElseFail(MemberExecutorService.class); -// @Override -// public final TransactionState getTransactionState() { -// return getTransactionService().currentTransactionState(); -// } - @Override public final ManagedObject getHomePageAdapter() { final Object pojo = getHomePageResolverService().getHomePage(); @@ -155,16 +150,12 @@ public ManagedObject lookupServiceAdapterById(final String serviceId) { return objectAdaptersForBeansOfKnownSort.get().get(serviceId); } - // -- LOOKUP + // -- HELPER - @Override - public T getSingletonElseFail(final Class type) { + private T getSingletonElseFail(final Class type) { return iocContainer.getSingletonElseFail(type); } - - // -- HELPER - private final _Lazy> objectAdaptersForBeansOfKnownSort = _Lazy.threadSafe(this::collectBeansOfKnownSort); @@ -177,15 +168,12 @@ private Map collectBeansOfKnownSort() { } private ManagedObject toManagedObject(final _ManagedBeanAdapter managedBeanAdapter) { - val servicePojo = managedBeanAdapter.getInstance().getFirst() .orElseThrow(()->_Exceptions.unrecoverableFormatted( "Cannot get service instance of type '%s'", managedBeanAdapter.getBeanClass())); return ManagedObject.lazy(getSpecificationLoader(), servicePojo); - } - } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetAbstract.java index 9e4bab52976..92dfe361998 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetAbstract.java @@ -30,7 +30,7 @@ private static final Class type() { return TypeOfFacet.class; } - public TypeOfFacetAbstract(final Class type, final FacetHolder holder) { + protected TypeOfFacetAbstract(final Class type, final FacetHolder holder) { super(type(), holder, type); } diff --git a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java similarity index 72% rename from persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java index 92899efb6a5..7b414cbb51f 100644 --- a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java @@ -16,10 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.persistence.jdo.provider.metamodel.facets.object.discriminator; +package org.apache.isis.core.metamodel.facets.actcoll.typeof; -import org.apache.isis.core.metamodel.facets.SingleValueFacet; +import org.apache.isis.core.metamodel.facetapi.FacetHolder; -public interface JdoDiscriminatorFacet extends SingleValueFacet { +public class TypeOfFacetFromActionReturn +extends TypeOfFacetAbstract { + + public TypeOfFacetFromActionReturn(final Class type, final FacetHolder holder) { + super(type, holder); + } } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java index 5c4bca5edfb..2fd7fd93766 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/homepage/annotation/HomePageFacetAnnotationFactory.java @@ -84,7 +84,7 @@ private MetaModelValidator newValidatorVisitor(final MetaModelContext mmc) { @Override public void validate(final @NonNull ObjectSpecification spec) { - if(spec.isManagedBean()) { + if(spec.isInjectable()) { return; } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/AliasedFacetForDomainObjectAnnotation.java similarity index 60% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/AliasedFacetForDomainObjectAnnotation.java index fba65794148..975d7999ed9 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/AliasedFacetForDomainObjectAnnotation.java @@ -16,36 +16,45 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype; +package org.apache.isis.core.metamodel.facets.object.domainobject; import java.util.Optional; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.commons.internal.base._Strings; +import org.apache.isis.commons.collections.Can; import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; +import org.apache.isis.core.metamodel.facets.object.domainservice.annotation.AliasedFacetForDomainServiceAnnotation; +import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacet; +import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacetAbstract; -public class LogicalTypeFacetForDomainObjectAnnotation -extends LogicalTypeFacetAbstract { +/** + * AliasedFacet based on presence of {@link DomainObject#aliased()}. + *

+ * Analogous to {@link AliasedFacetForDomainServiceAnnotation}. + * @see AliasedFacetForDomainServiceAnnotation + */ +public class AliasedFacetForDomainObjectAnnotation +extends AliasedFacetAbstract { - public static Optional create( + public static Optional create( final Optional domainObjectIfAny, final Class correspondingClass, final FacetHolder holder) { return domainObjectIfAny - .map(annot->annot.logicalTypeName()) - .filter(_Strings::isNotEmpty) - .map(logicalTypeName -> new LogicalTypeFacetForDomainObjectAnnotation( - LogicalType.eager(correspondingClass, logicalTypeName), + .map(annot->annot.aliased()) + .map(Can::ofArray) + .filter(Can::isNotEmpty) + .map(aliasNames -> new AliasedFacetForDomainObjectAnnotation( + aliasNames + .map(aliasName->LogicalType.eager(correspondingClass, aliasName)), holder)); } - private LogicalTypeFacetForDomainObjectAnnotation( - final LogicalType logicalType, + private AliasedFacetForDomainObjectAnnotation( + final Can aliases, final FacetHolder holder) { - super(logicalType, holder); + super(aliases, holder); } } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java index b32698b0434..d3cca69c493 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java @@ -21,10 +21,12 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.Identifier; import org.apache.isis.applib.annotation.Action; @@ -47,6 +49,7 @@ import org.apache.isis.applib.mixins.system.HasInteractionId; import org.apache.isis.commons.internal.base._Strings; import org.apache.isis.commons.internal.collections._Multimaps; +import org.apache.isis.core.config.progmodel.ProgrammingModelConstants; import org.apache.isis.core.metamodel.context.MetaModelContext; import org.apache.isis.core.metamodel.facetapi.FacetHolder; import org.apache.isis.core.metamodel.facetapi.FacetUtil; @@ -71,7 +74,6 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.editing.ImmutableFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.object.domainobject.entitychangepublishing.EntityChangePublishingFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.object.domainobject.introspection.IntrospectionPolicyFacetForDomainObjectAnnotation; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.object.mixin.MetaModelValidatorForMixinTypes; import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacetForDomainObjectAnnotation; @@ -112,7 +114,8 @@ public DomainObjectAnnotationFacetFactory( public void process(final ProcessObjectTypeContext processClassContext) { val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class); - processLogicalTypeName(domainObjectIfAny, processClassContext); + processAliased(domainObjectIfAny, processClassContext); + processIntrospecion(domainObjectIfAny, processClassContext); // conflicting type semantics validation ... validateConflictingTypeSemantics(domainObjectIfAny, processClassContext); @@ -166,7 +169,8 @@ private void validateConflictingTypeSemantics( } if(domainObject.nature().isMixin() - && _Strings.isNotEmpty(domainObject.logicalTypeName())) { + && (_Strings.isNotEmpty(domainObject.logicalTypeName()) + || processClassContext.synthesizeOnType(Named.class).isPresent())) { // just a console warning, not decided yet whether we should be strict and fail MM validation log.warn("Mixins don't need a logicalTypeName, as was declared with {}.", cls.getName()); } @@ -311,8 +315,8 @@ void processEditing( .create(domainObjectIfAny, getConfiguration(), facetHolder)); } - // check from @DomainObject(logicalTypeName=...) - void processLogicalTypeName( + // check from @DomainObject(aliased=...) + void processAliased( final Optional domainObjectIfAny, final ProcessObjectTypeContext processClassContext) { @@ -320,16 +324,25 @@ void processLogicalTypeName( val facetHolder = processClassContext.getFacetHolder(); FacetUtil.addFacetIfPresent( - LogicalTypeFacetForDomainObjectAnnotation + AliasedFacetForDomainObjectAnnotation .create(domainObjectIfAny, cls, facetHolder)); + } + + // check from @DomainObject(introspection=...) + void processIntrospecion( + final Optional domainObjectIfAny, + final ProcessObjectTypeContext processClassContext) { + + val cls = processClassContext.getCls(); + val facetHolder = processClassContext.getFacetHolder(); FacetUtil.addFacetIfPresent( IntrospectionPolicyFacetForDomainObjectAnnotation .create(domainObjectIfAny, cls, facetHolder)); - } + void processNature( final Optional domainObjectIfAny, final ProcessClassContext processClassContext) { @@ -574,68 +587,70 @@ public void refineProgrammingModel(final ProgrammingModel programmingModel) { addValidatorToEnsureUniqueLogicalTypeNames(programmingModel); } - private void addValidatorToEnsureUniqueLogicalTypeNames(final ProgrammingModel pm) { + private void addValidatorToEnsureUniqueLogicalTypeNames(final ProgrammingModel programmingModel) { - final _Multimaps.ListMultimap collidingSpecsByLogicalTypeName = - _Multimaps.newConcurrentListMultimap(); + programmingModel + .addValidator( + new MetaModelVisitingValidatorAbstract(programmingModel.getMetaModelContext()){ - final MetaModelVisitingValidatorAbstract ensureUniqueObjectIds = - new MetaModelVisitingValidatorAbstract(pm.getMetaModelContext()){ + final _Multimaps.ListMultimap specsByLogicalTypeName = + _Multimaps.newConcurrentListMultimap(); - @Override - public void validate(final ObjectSpecification objSpec) { + @Override + public void validate(final ObjectSpecification objSpec) { - // @DomainObject(logicalTypeName=...) must be unique among non-abstract types - // Eg. having an ApplicationUser interface and a concrete ApplicationUser (JDO) - // that have the same @DomainObject(logicalTypeName=...) should be allowed. - // A hard constraint that applies, is that there cannot be multiple bookmark-able - // types that share the same @DomainObject(logicalTypeName=...). - // This must be guaranteed by MM validation. - // - see also LogicalTypeResolver.register(...) + // @DomainObject(logicalTypeName=...) must be unique among non-abstract types + // Eg. having an ApplicationUser interface and a concrete ApplicationUser (JDO) + // that have the same @DomainObject(logicalTypeName=...) should be allowed. + // A hard constraint that applies, is that there cannot be multiple bookmark-able + // types that share the same @DomainObject(logicalTypeName=...). + // This must be guaranteed by MM validation. + // - see also LogicalTypeResolver.register(...) - if(objSpec.isAbstract()) { - return; - } - collidingSpecsByLogicalTypeName.putElement(objSpec.getLogicalTypeName(), objSpec); + if(objSpec.isAbstract()) { + return; } - - @Override - public void summarize() { - for (val logicalTypeName : collidingSpecsByLogicalTypeName.keySet()) { - val collidingSpecs = collidingSpecsByLogicalTypeName.get(logicalTypeName); - if(isObjectTypeCollision(collidingSpecs)) { - val csv = asCsv(collidingSpecs); - - collidingSpecs.forEach(spec->{ - ValidationFailure.raiseFormatted( - spec, - "Logical type name '%s' mapped to multiple non-abstract classes:\n" - + "%s", - logicalTypeName, - csv); - }); - - - } + specsByLogicalTypeName.putElement(objSpec.getLogicalTypeName(), objSpec); + + // also adding aliases to the multi-map + objSpec.getAliases() + .forEach(alias-> + specsByLogicalTypeName.putElement(alias.getLogicalTypeName(), objSpec)); + } + + @Override + public void summarize() { + + specsByLogicalTypeName.forEach((logicalTypeName, collidingSpecs)->{ + if(isObjectTypeCollision(collidingSpecs)) { + val csv = asCsv(collidingSpecs); + collidingSpecs.forEach(spec->{ + ValidationFailure.raiseFormatted(spec, + ProgrammingModelConstants.Validation + .NON_UNIQUE_LOGICAL_TYPE_NAME_OR_ALIAS + .getMessage(Map.of( + "logicalTypeName", spec.getLogicalTypeName(), + "csv", csv))); + }); } - // so can be revalidated again if necessary. - collidingSpecsByLogicalTypeName.clear(); - } + }); - private boolean isObjectTypeCollision(final List specs) { - return specs.size()>1; - } + // clean-up + specsByLogicalTypeName.clear(); + } - private String asCsv(final List specList) { - return stream(specList) - .map(ObjectSpecification::getFullIdentifier) - .sorted() - .collect(Collectors.joining(", ")); - } + private boolean isObjectTypeCollision(final List specs) { + return specs.size()>1; + } - }; + private String asCsv(final List specList) { + return stream(specList) + .map(ObjectSpecification::getFullIdentifier) + .sorted() + .collect(Collectors.joining(", ")); + } - pm.addValidator(ensureUniqueObjectIds); + }); } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java deleted file mode 100644 index 3f8929172ab..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype; - -import javax.inject.Inject; - -import org.apache.isis.applib.annotation.LogicalTypeName; -import org.apache.isis.core.metamodel.commons.ClassExtensions; -import org.apache.isis.core.metamodel.context.MetaModelContext; -import org.apache.isis.core.metamodel.facetapi.FacetUtil; -import org.apache.isis.core.metamodel.facetapi.FeatureType; -import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; -import org.apache.isis.core.metamodel.methods.MethodByClassMap; - -import lombok.val; - -public class LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory -extends FacetFactoryAbstract { - - @Inject - public LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory( - final MetaModelContext mmc, - final MethodByClassMap postConstructMethodsCache) { - super(mmc, FeatureType.OBJECTS_ONLY); - } - - @Override - public void process(final ProcessClassContext processClassContext) { - val logicalTypeNameIfAny = processClassContext.synthesizeOnType(LogicalTypeName.class); - val cls = processClassContext.getCls(); - - if(cls.isInterface() - || ClassExtensions.isAbstract(cls)) { - - val facetHolder = processClassContext.getFacetHolder(); - - FacetUtil.addFacetIfPresent( - LogicalTypeFacetForLogicalTypeNameAnnotation - .create(logicalTypeNameIfAny, cls, facetHolder)); - - } - - } - -} diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/AliasedFacetForDomainServiceAnnotation.java similarity index 51% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/AliasedFacetForDomainServiceAnnotation.java index 602abab0597..1f9e28c84c2 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/AliasedFacetForDomainServiceAnnotation.java @@ -16,37 +16,45 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype; +package org.apache.isis.core.metamodel.facets.object.domainservice.annotation; import java.util.Optional; -import org.apache.isis.applib.annotation.LogicalTypeName; +import org.apache.isis.applib.annotation.DomainService; import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.commons.internal.base._Strings; +import org.apache.isis.commons.collections.Can; import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; +import org.apache.isis.core.metamodel.facets.object.domainobject.AliasedFacetForDomainObjectAnnotation; +import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacet; +import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacetAbstract; -public class LogicalTypeFacetForLogicalTypeNameAnnotation -extends LogicalTypeFacetAbstract { +/** + * AliasedFacet based on presence of {@link DomainService#aliased()}. + *

+ * Analogous to {@link AliasedFacetForDomainServiceAnnotation}. + * @see AliasedFacetForDomainObjectAnnotation + */ +public class AliasedFacetForDomainServiceAnnotation +extends AliasedFacetAbstract { - public static Optional create( - final Optional logicalTypeIfAny, + public static Optional create( + final Optional domainServiceIfAny, final Class correspondingClass, final FacetHolder holder) { - return logicalTypeIfAny - .map(annot->annot.value()) - .filter(_Strings::isNotEmpty) - .map(logicalTypeName -> new LogicalTypeFacetForLogicalTypeNameAnnotation( - LogicalType.eager(correspondingClass, logicalTypeName), + return domainServiceIfAny + .map(annot->annot.aliased()) + .map(Can::ofArray) + .filter(Can::isNotEmpty) + .map(aliasNames -> new AliasedFacetForDomainServiceAnnotation( + aliasNames + .map(aliasName->LogicalType.eager(correspondingClass, aliasName)), holder)); } - private LogicalTypeFacetForLogicalTypeNameAnnotation( - final LogicalType logicalType, + private AliasedFacetForDomainServiceAnnotation( + final Can aliases, final FacetHolder holder) { - // Precedence.LOW ensures, to get overruled by @DomainObject(logicalTypeName=...) - super(logicalType, holder, Precedence.LOW); + super(aliases, holder); } } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java index 2043d127e4e..6226116076d 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java @@ -52,9 +52,13 @@ public void process(final ProcessClassContext processClassContext) { } val facetHolder = processClassContext.getFacetHolder(); addFacet( - new DomainServiceFacetAnnotation( + new DomainServiceFacetForAnnotation( facetHolder, domainServiceIfAny.get().nature())); + + addFacetIfPresent( + AliasedFacetForDomainServiceAnnotation + .create(domainServiceIfAny, processClassContext.getCls(), facetHolder)); } @Override diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java similarity index 90% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java index 46370483250..982f7628804 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetForAnnotation.java @@ -18,15 +18,14 @@ */ package org.apache.isis.core.metamodel.facets.object.domainservice.annotation; - import org.apache.isis.applib.annotation.NatureOfService; import org.apache.isis.core.metamodel.facetapi.FacetHolder; import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacetAbstract; +public class DomainServiceFacetForAnnotation +extends DomainServiceFacetAbstract { -public class DomainServiceFacetAnnotation extends DomainServiceFacetAbstract { - - public DomainServiceFacetAnnotation( + public DomainServiceFacetForAnnotation( final FacetHolder facetHolder, final NatureOfService natureOfService) { super(facetHolder, natureOfService); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacet.java similarity index 77% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacet.java rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacet.java index 3c615f49c52..1ec8aa8baab 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacet.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacet.java @@ -18,15 +18,16 @@ */ package org.apache.isis.core.metamodel.facets.object.logicaltype; -import org.apache.isis.applib.annotation.DomainObject; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.id.LogicalType; +import org.apache.isis.commons.collections.Can; import org.apache.isis.core.metamodel.facetapi.Facet; /** - * Corresponds to the value of {@link DomainObject#logicalTypeName()} or - * {@link LogicalTypeName#value()}, that specifies the logical type name - * of a domain object. + * Corresponds to the value of {@link Named#value()}, + * that specifies the logical type name + * of a domain object or interface or abstract type. *

* The logical type name must be unique, among non-abstract classes, but * is allowed to be shared with interfaces and abstract classes. @@ -44,12 +45,8 @@ * in principle allowed to share the same logical type-name. In which case reverse * lookup from logical-type-name to type must always resolve the most specific one (B). */ -public interface LogicalTypeFacet extends Facet { - - LogicalType getLogicalType(); +public interface AliasedFacet extends Facet { - default String value() { - return getLogicalType().getLogicalTypeName(); - } + Can getAliases(); } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacetAbstract.java similarity index 69% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacetAbstract.java index 29ab26e3b5d..a79bcf4a00f 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacetAbstract.java @@ -21,6 +21,7 @@ import java.util.function.BiConsumer; import org.apache.isis.applib.id.LogicalType; +import org.apache.isis.commons.collections.Can; import org.apache.isis.core.metamodel.facetapi.Facet; import org.apache.isis.core.metamodel.facetapi.FacetAbstract; import org.apache.isis.core.metamodel.facetapi.FacetHolder; @@ -28,36 +29,35 @@ import lombok.Getter; import lombok.NonNull; -public abstract class LogicalTypeFacetAbstract +public abstract class AliasedFacetAbstract extends FacetAbstract -implements LogicalTypeFacet { +implements AliasedFacet { private static final Class type() { - return LogicalTypeFacet.class; + return AliasedFacet.class; } @Getter(onMethod_ = {@Override}) - private final @NonNull LogicalType logicalType; + private final @NonNull Can aliases; - protected LogicalTypeFacetAbstract( - final LogicalType logicalType, + protected AliasedFacetAbstract( + final Can aliases, final FacetHolder holder) { - super(LogicalTypeFacetAbstract.type(), holder); - this.logicalType = logicalType; + super(AliasedFacetAbstract.type(), holder); + this.aliases = aliases; } - protected LogicalTypeFacetAbstract( - final LogicalType logicalType, + protected AliasedFacetAbstract( + final Can aliases, final FacetHolder holder, final Facet.Precedence precedence) { - super(LogicalTypeFacetAbstract.type(), holder, precedence); - this.logicalType = logicalType; + super(AliasedFacetAbstract.type(), holder, precedence); + this.aliases = aliases; } @Override public void visitAttributes(final BiConsumer visitor) { super.visitAttributes(visitor); - visitor.accept("logicalTypeName", logicalType.getLogicalTypeName()); - visitor.accept("logicalTypeCorrespondingClass", logicalType.getCorrespondingClass().getName()); + visitor.accept("aliases", aliases); } } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java index e33fb6c7f53..bcb1facecec 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java @@ -45,16 +45,12 @@ public void refineProgrammingModel(final ProgrammingModel programmingModel) { programmingModel.addVisitingValidator(spec->{ if(!spec.isEntityOrViewModel() - && !spec.isManagedBean() ) { + && !spec.isInjectable() ) { return; } - val logicalTypeFacet = spec.getFacet(LogicalTypeFacet.class); - if(logicalTypeFacet == null) { - return; - } - - val logicalTypeName = logicalTypeFacet.value(); + val logicalType = spec.getLogicalType(); + val logicalTypeName = logicalType.getLogicalTypeName(); val nameParts = _Strings.splitThenStream(logicalTypeName, ".") .collect(Can.toCan()); @@ -63,7 +59,7 @@ public void refineProgrammingModel(final ProgrammingModel programmingModel) { || nameParts.stream() .anyMatch(String::isEmpty)) { - val validationResponse = spec.isManagedBean() + val validationResponse = spec.isInjectable() ? ProgrammingModelConstants.Validation.DOMAIN_SERVICE_MISSING_A_NAMESPACE : ProgrammingModelConstants.Validation.DOMAIN_OBJECT_MISSING_A_NAMESPACE; diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassName.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassName.java deleted file mode 100644 index 030d913fda8..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassName.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.core.metamodel.facets.object.logicaltype.classname; - -import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.core.metamodel.commons.ClassUtil; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; - -public class LogicalTypeFacetFromClassName -extends LogicalTypeFacetAbstract { - - public LogicalTypeFacetFromClassName(final Class cls, final FacetHolder holder) { - this(LogicalType.eager(cls, ClassUtil.getCanonicalName_friendlyToInnerClasses(cls)), holder); - } - - public LogicalTypeFacetFromClassName(final LogicalType logicalType, final FacetHolder holder) { - super(logicalType, holder, Precedence.INFERRED); - } - -} diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java index bc205064660..b31573b37bf 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java @@ -23,16 +23,12 @@ import javax.inject.Inject; import javax.xml.bind.annotation.XmlType; -import org.apache.isis.applib.id.LogicalType; import org.apache.isis.core.metamodel.context.MetaModelContext; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facetapi.FacetUtil; import org.apache.isis.core.metamodel.facetapi.FeatureType; import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner; import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory; import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; import org.apache.isis.core.metamodel.progmodel.ProgrammingModel; import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorDefault; import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorRegistry; @@ -69,49 +65,14 @@ public static LogicalTypeFacetFromClassNameFactory forTesting( @Override public void process(final ProcessObjectTypeContext processClassContext) { - final FacetHolder facetHolder = processClassContext.getFacetHolder(); - // don't trash existing facet - if(facetHolder.containsNonFallbackFacet(LogicalTypeFacet.class)) { - return; - } - val cls = processClassContext.getCls(); - val substitute = classSubstitutorRegistry.getSubstitution(cls); - if(substitute.isNeverIntrospect()) { - return; - } - FacetUtil.addFacet( - createLogicalTypeFacet(facetHolder, substitute.apply(cls))); + // no-op. } @Override public void process(final ProcessClassContext processClassContext) { - // now a no-op. - } - - private static LogicalTypeFacet createLogicalTypeFacet( - final FacetHolder facetHolder, - final Class substitutedClass) { - - val serviceId = getServiceId(facetHolder); - val isService = serviceId!=null; - - return isService - ? new LogicalTypeFacetFromIoCNamingStrategy( - LogicalType - .eager(substitutedClass, serviceId), - facetHolder) - : new LogicalTypeFacetFromClassName(substitutedClass, facetHolder); + // no-op. } - private static String getServiceId(final FacetHolder facetHolder) { - if(facetHolder instanceof ObjectSpecification) { - ObjectSpecification objectSpecification = (ObjectSpecification) facetHolder; - if(objectSpecification.isManagedBean()) { - return objectSpecification.getManagedBeanName(); - } - } - return null; - } @Override public void refineProgrammingModel(final ProgrammingModel programmingModel) { @@ -127,8 +88,10 @@ public void refineProgrammingModel(final ProgrammingModel programmingModel) { return; } - val logicalTypeFacet = objectSpec.getFacet(LogicalTypeFacet.class); - if(logicalTypeFacet instanceof LogicalTypeFacetFromClassName) { + val logicalType = objectSpec.getLogicalType(); + + //XXX has a slight chance to be a false positive; would need to check whether annotated with @Named + if(logicalType.getClassName().equals(logicalType.getLogicalTypeName())) { ValidationFailure.raiseFormatted( objectSpec, "%s: the object type must be specified explicitly ('%s' config property). " @@ -168,7 +131,7 @@ public static boolean check(final ObjectSpecification objectSpec) { if(objectSpec.isMixin()) { return false; //skip validation } - if (objectSpec.isManagedBean()) { + if (objectSpec.isInjectable()) { // only check if domain service is contributing to the public API (UI/REST) if(!DomainServiceFacet.getNatureOfService(objectSpec).isPresent()) { return false; //skip validation diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java index e54a230f801..90492a9dc9a 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java @@ -42,7 +42,6 @@ import org.apache.isis.core.metamodel.facets.object.value.TypicalLengthFacetFromValueFacet; import org.apache.isis.core.metamodel.facets.object.value.ValueFacet; import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProvider; -import org.apache.isis.core.metamodel.facets.value.annotation.LogicalTypeFacetForValueAnnotation; import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault; import lombok.AccessLevel; @@ -87,14 +86,7 @@ public void process(final ProcessClassContext processClassContext) { val facetHolder = processClassContext.getFacetHolder(); val valueIfAny = processClassContext.synthesizeOnType(Value.class); - val logicalTypeFacetIfAny = addFacetIfPresent( - LogicalTypeFacetForValueAnnotation - .create(valueIfAny, valueClass, facetHolder)); - - val logicalType = logicalTypeFacetIfAny - .map(logicalTypeFacet->logicalTypeFacet.getLogicalType()) - .orElseGet(()->LogicalType.fqcn(valueClass)); - + val logicalType = LogicalType.infer(valueClass); val identifier = Identifier.classIdentifier(logicalType); val valueFacetIfAny = addAllFacetsForValueSemantics(identifier, valueClass, facetHolder, valueIfAny); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/propcoll/memserexcl/SnapshotExcludeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/propcoll/memserexcl/SnapshotExcludeFacetAbstract.java index 79080fdb98a..7674078a758 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/propcoll/memserexcl/SnapshotExcludeFacetAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/propcoll/memserexcl/SnapshotExcludeFacetAbstract.java @@ -22,7 +22,9 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract; import org.apache.isis.core.metamodel.facetapi.FacetHolder; -public abstract class SnapshotExcludeFacetAbstract extends FacetAbstract implements SnapshotExcludeFacet { +public abstract class SnapshotExcludeFacetAbstract +extends FacetAbstract +implements SnapshotExcludeFacet { private static final Class type() { return SnapshotExcludeFacet.class; diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java index 40b304b5ce1..01971f48c1d 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java @@ -40,7 +40,7 @@ /** * Sets up the {@link PropertySetterFacetViaSetterMethod} to invoke the * property's setter if available, but if none then marks the property as - * {@link SnapshotExcludeFacetInferred not-persistable}. + * {@link SnapshotExcludeFacetFromImmutableMember not-persistable}. */ public class PropertySetterFacetFactory extends MethodPrefixBasedFacetFactoryAbstract { @@ -79,7 +79,7 @@ public void process(final ProcessMethodContext processMethodContext) { }); } else { - addFacet(new SnapshotExcludeFacetInferred(property)); + addFacet(new SnapshotExcludeFacetFromImmutableMember(property)); // previously we also added the DisabledFacetAlwaysEverywhere facet here. // however, the PropertyModifyFacetFactory (which comes next) might install a PropertySetterFacet instead. diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/SnapshotExcludeFacetInferred.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/SnapshotExcludeFacetFromImmutableMember.java similarity index 86% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/SnapshotExcludeFacetInferred.java rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/SnapshotExcludeFacetFromImmutableMember.java index c452a6691dc..9242a8e6f78 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/SnapshotExcludeFacetInferred.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/SnapshotExcludeFacetFromImmutableMember.java @@ -21,9 +21,10 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder; import org.apache.isis.core.metamodel.facets.propcoll.memserexcl.SnapshotExcludeFacetAbstract; -public class SnapshotExcludeFacetInferred extends SnapshotExcludeFacetAbstract { +public class SnapshotExcludeFacetFromImmutableMember +extends SnapshotExcludeFacetAbstract { - public SnapshotExcludeFacetInferred(final FacetHolder holder) { + public SnapshotExcludeFacetFromImmutableMember(final FacetHolder holder) { super(holder); } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/LogicalTypeFacetForValueAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/LogicalTypeFacetForValueAnnotation.java deleted file mode 100644 index a67f36564cc..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/LogicalTypeFacetForValueAnnotation.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.core.metamodel.facets.value.annotation; - -import java.util.Optional; - -import org.apache.isis.applib.annotation.Value; -import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.commons.internal.base._Strings; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; - -public class LogicalTypeFacetForValueAnnotation -extends LogicalTypeFacetAbstract { - - public static Optional create( - final Optional valueIfAny, - final Class correspondingClass, - final FacetHolder holder) { - - return valueIfAny - .map(annot->annot.logicalTypeName()) - .filter(_Strings::isNotEmpty) - .map(logicalTypeName -> new LogicalTypeFacetForValueAnnotation( - LogicalType.eager(correspondingClass, logicalTypeName), - holder)); - } - - private LogicalTypeFacetForValueAnnotation( - final LogicalType logicalType, - final FacetHolder holder) { - super(logicalType, holder); - } - -} \ No newline at end of file diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java deleted file mode 100644 index fc0a85704f7..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.core.metamodel.facets.value.annotation; - -import javax.inject.Inject; - -import org.apache.isis.core.metamodel.context.MetaModelContext; -import org.apache.isis.core.metamodel.facetapi.FeatureType; -import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; -import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory; - -import lombok.val; - -public class ValueAnnotationFacetFactory -extends FacetFactoryAbstract -implements - ObjectTypeFacetFactory { - - @Inject - public ValueAnnotationFacetFactory(final MetaModelContext mmc) { - super(mmc, FeatureType.OBJECTS_ONLY); - } - - @Override - public void process(final ProcessObjectTypeContext processClassContext) { - val cls = processClassContext.getCls(); - val facetHolder = processClassContext.getFacetHolder(); - - // @Value(logicalTypeName=...) - val valueIfAny = processClassContext.synthesizeOnType(org.apache.isis.applib.annotation.Value.class); - addFacetIfPresent(LogicalTypeFacetForValueAnnotation.create(valueIfAny, cls, facetHolder)); - - } - - -} diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.java index 56e9649866d..94162ac5d6f 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ActionNode.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -37,9 +38,9 @@ import lombok.Setter; import lombok.ToString; +@Named(ActionNode.LOGICAL_TYPE_NAME) @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = ActionNode.LOGICAL_TYPE_NAME, introspection = Introspection.ANNOTATION_REQUIRED ) @XmlRootElement diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.java index 937188c1b2a..671df68fe3d 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/CollectionNode.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -37,9 +38,9 @@ import lombok.Setter; import lombok.ToString; +@Named(CollectionNode.LOGICAL_TYPE_NAME) @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = CollectionNode.LOGICAL_TYPE_NAME, introspection = Introspection.ANNOTATION_REQUIRED ) @XmlRootElement diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java index fedfd1eaec0..04f0f4634b3 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -37,9 +38,9 @@ import lombok.Setter; import lombok.ToString; +@Named(FacetAttrNode.LOGICAL_TYPE_NAME) @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = FacetAttrNode.LOGICAL_TYPE_NAME, introspection = Introspection.ANNOTATION_REQUIRED ) @XmlRootElement @@ -72,6 +73,5 @@ public Stream streamChildNodes() { return Stream.empty(); } - } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetGroupNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetGroupNode.java index 8f4d28ae01a..ac229221f21 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetGroupNode.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetGroupNode.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -38,9 +39,9 @@ import lombok.Setter; import lombok.ToString; +@Named(FacetGroupNode.LOGICAL_TYPE_NAME) @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = FacetGroupNode.LOGICAL_TYPE_NAME, introspection = Introspection.ANNOTATION_REQUIRED ) @XmlRootElement diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.java index 5b1fae93471..a7f19b36e77 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetNode.java @@ -21,6 +21,7 @@ import java.util.Optional; import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -41,9 +42,9 @@ import lombok.ToString; import lombok.val; +@Named(FacetNode.LOGICAL_TYPE_NAME) @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = FacetNode.LOGICAL_TYPE_NAME, introspection = Introspection.ANNOTATION_REQUIRED ) @XmlRootElement diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.java index 168105ccea9..0c2baa00e53 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/ParameterNode.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -37,9 +38,9 @@ import lombok.Setter; import lombok.ToString; +@Named(ParameterNode.LOGICAL_TYPE_NAME) @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = ParameterNode.LOGICAL_TYPE_NAME, introspection = Introspection.ANNOTATION_REQUIRED ) @XmlRootElement diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.java index b8e1f4a26fc..35ff89aa7e6 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/PropertyNode.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -36,11 +37,10 @@ import lombok.Setter; import lombok.ToString; +@Named(PropertyNode.LOGICAL_TYPE_NAME) @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = PropertyNode.LOGICAL_TYPE_NAME, - introspection = Introspection.ANNOTATION_REQUIRED -) + introspection = Introspection.ANNOTATION_REQUIRED) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @ToString diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.java index 8bccc1b0950..7e9e81dd763 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/TypeNode.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -38,11 +39,10 @@ import lombok.Setter; import lombok.ToString; +@Named(TypeNode.LOGICAL_TYPE_NAME) @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = TypeNode.LOGICAL_TYPE_NAME, - introspection = Introspection.ANNOTATION_REQUIRED -) + introspection = Introspection.ANNOTATION_REQUIRED) @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @ToString diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodPrefixBasedFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodPrefixBasedFacetFactoryAbstract.java index 521f2d9a694..c5f62963567 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodPrefixBasedFacetFactoryAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodPrefixBasedFacetFactoryAbstract.java @@ -82,7 +82,7 @@ public String toString() { @Override public void validate(final ObjectSpecification spec) { - if(spec.isManagedBean()) { + if(spec.isInjectable()) { return; } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java index 7236fb567f3..4d65939d6ad 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java @@ -63,7 +63,7 @@ static class BookmarkForServices implements Handler { @Override public boolean isHandling(final ManagedObject managedObject) { - return managedObject.getSpecification().isManagedBean(); + return managedObject.getSpecification().isInjectable(); } @Override diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java index 64d9f38aaa0..57e9879dd08 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java @@ -82,7 +82,7 @@ public static class LoadService implements ObjectLoader.Handler { public boolean isHandling(final ObjectLoader.Request objectLoadRequest) { val spec = objectLoadRequest.getObjectSpecification(); - return spec.isManagedBean(); + return spec.isInjectable(); } @Override diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java index 4e2a3a0614b..d1d54efb217 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/SynthesizeObjectNamingPostProcessor.java @@ -46,7 +46,7 @@ public SynthesizeObjectNamingPostProcessor(final MetaModelContext metaModelConte protected void doPostProcess(final ObjectSpecification objectSpecification) { if(!(objectSpecification.isEntityOrViewModelOrAbstract() - || objectSpecification.isManagedBean())) { + || objectSpecification.isInjectable())) { return; } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java index a25bca5079d..98704382912 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java @@ -162,7 +162,7 @@ default void addVisitingValidatorSkipManagedBeans( addValidator(new MetaModelVisitingValidatorAbstract(getMetaModelContext()) { @Override public void validate(final @NonNull ObjectSpecification spec) { - if(spec.isManagedBean()) { + if(spec.isInjectable()) { return; } validator.accept(spec); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java index a8dc92b7eb8..ae0a2e4b51a 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java @@ -45,7 +45,6 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.CallbackFacetFactory; import org.apache.isis.core.metamodel.facets.object.choices.enums.ChoicesFacetFromEnumFactory; import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory; import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.DomainObjectLayoutFacetFactory; import org.apache.isis.core.metamodel.facets.object.domainservice.annotation.DomainServiceFacetAnnotationFactory; import org.apache.isis.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacetFactory; @@ -191,8 +190,6 @@ private void addFacetFactories() { addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ViewModelFacetFactory(mmc, postConstructMethodsCache)); addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new JaxbFacetFactory(mmc)); - addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory(mmc, postConstructMethodsCache)); - // must come after RecreatableObjectFacetFactory addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new DomainObjectAnnotationFacetFactory(mmc, postConstructMethodsCache)); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java index 836a6b2f8ea..a660f6db86e 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java @@ -18,7 +18,6 @@ */ package org.apache.isis.core.metamodel.services; -import org.apache.isis.commons.internal.assertions._Assert; import org.apache.isis.core.metamodel.spec.ManagedObject; import org.apache.isis.core.metamodel.spec.ObjectSpecification; @@ -28,10 +27,7 @@ private ServiceUtil() { } public static String idOfSpec(final ObjectSpecification serviceSpec) { - _Assert.assertEquals( - serviceSpec.getManagedBeanName(), - serviceSpec.getLogicalTypeName()); - return serviceSpec.getManagedBeanName(); + return serviceSpec.getLogicalTypeName(); } public static String idOfAdapter(final ManagedObject serviceAdapter) { diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureDefault.java index 98de5d91f99..2444d3240ce 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/appfeat/ApplicationFeatureDefault.java @@ -23,6 +23,8 @@ import java.util.OptionalInt; import java.util.SortedSet; +import javax.inject.Named; + import org.apache.isis.applib.IsisModuleApplib; import org.apache.isis.applib.annotation.SemanticsOf; import org.apache.isis.applib.annotation.Value; @@ -50,7 +52,8 @@ * {@link ApplicationFeatureRepository}. *

*/ -@Value(logicalTypeName = IsisModuleApplib.NAMESPACE + ".services.appfeat.ApplicationFeature") +@Named(IsisModuleApplib.NAMESPACE + ".services.appfeat.ApplicationFeature") +@Value public class ApplicationFeatureDefault implements ApplicationFeature, diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java index 61f37ab387c..74b221713c7 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java @@ -95,7 +95,7 @@ public String getClassType() { val isService = Stream.concat( Stream.of(spec), spec.subclasses(Hierarchical.Depth.DIRECT).stream()) - .anyMatch(ObjectSpecification::isManagedBean); + .anyMatch(ObjectSpecification::isInjectable); return isService ? "2 Service" diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java index 1b7c4b062f8..914357250c3 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java @@ -181,7 +181,7 @@ private DomainClassDto asXsdType( domainClass.setId(specification.getFullIdentifier()); - if(specification.isManagedBean()) { + if(specification.isInjectable()) { domainClass.setService(true); } @@ -203,7 +203,7 @@ private void addFacetsAndMembersTo( return; } - if (specification.isManagedBean()) { + if (specification.isInjectable()) { if(DomainServiceFacet.getNatureOfService(specification).isPresent()) { addActions(specification, domainClassByObjectSpec, config); } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java index c6f75c2eb90..9f6df535260 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/registry/ServiceRegistryDefault.java @@ -53,7 +53,7 @@ public final class ServiceRegistryDefault implements ServiceRegistry { @Inject private IsisBeanTypeRegistry isisBeanTypeRegistry; @Override - public Optional<_ManagedBeanAdapter> lookupRegisteredBeanById(String id) { + public Optional<_ManagedBeanAdapter> lookupRegisteredBeanById(final String id) { return Optional.ofNullable(managedBeansById.get().get(id)); } @@ -68,37 +68,33 @@ public Stream<_ManagedBeanAdapter> streamRegisteredBeans() { } @Override - public Can select(Class type, Annotation[] qualifiers) { + public Can select(final Class type, final Annotation[] qualifiers) { return isisSystemEnvironment.getIocContainer() .select(type, qualifiers); } + @Override + public void clearRegisteredBeans() { + managedBeansById.clear(); + } + // -- HELPER private final _Lazy> managedBeansById = _Lazy.threadSafe(this::enumerateManagedBeans); private Map enumerateManagedBeans() { - val managedBeanAdapterByName = _Maps.newHashMap(); val managedBeansContributing = isisBeanTypeRegistry.getManagedBeansContributing().keySet(); - isisSystemEnvironment.getIocContainer().streamAllBeans() + isisSystemEnvironment.getIocContainer() + .streamAllBeans() .filter(_NullSafe::isPresent) .filter(bean->managedBeansContributing.contains(bean.getBeanClass())) // do not register unknown sort - .forEach(bean->{ - val id = bean.getId(); - managedBeanAdapterByName.put(id, bean); - }); + .forEach(bean-> + managedBeanAdapterByName.put(bean.getId(), bean)); return managedBeanAdapterByName; } - @Override - public void clearRegisteredBeans() { - managedBeansById.clear(); - } - - - } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java index c2e5025c411..a2eb418e427 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java @@ -699,12 +699,27 @@ public static ManagedObject refetch(final @Nullable ManagedObject managedObject) val objectManager = managedObject.getObjectManager(); val reattached = bookmark(managedObject) - .map(bookmark->objectManager.loadObject( + .map(bookmark-> ObjectLoader.Request.of( spec, - bookmark))) + bookmark)) + .map(loadRequest->Try.call( + ()->objectManager.loadObject(loadRequest))) + .map(loadResult-> + // a valid scenario for entities: not found eg. after deletion, + // which will fail the load request + loadResult.isFailure() + ? ManagedObject.empty(managedObject.getSpecification()) + : loadResult.getValue().get() + ) .orElse(managedObject); + // handles deleted entities + if(isNullOrUnspecifiedOrEmpty(reattached)) { + // returns the 'emptied' ManagedObject from above + return reattached; + } + val newState = EntityUtil.getEntityState(reattached); _Assert.assertTrue(newState.isAttached()); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java index 109cccd6dd2..0a7c6714871 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java @@ -29,9 +29,13 @@ import org.springframework.lang.Nullable; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainService; import org.apache.isis.applib.exceptions.UnrecoverableException; import org.apache.isis.applib.id.HasLogicalType; +import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.services.metamodel.BeanSort; +import org.apache.isis.commons.collections.Can; import org.apache.isis.commons.internal.base._NullSafe; import org.apache.isis.commons.internal.collections._Streams; import org.apache.isis.commons.internal.exceptions._Exceptions; @@ -169,7 +173,6 @@ public default Optional lookupMixedInAction(final ObjectSpe /** * Returns an (immutable) "full" identifier for this specification. - * *

* This will be the fully qualified name of the Class object that this * object represents (i.e. it includes the package name). @@ -178,13 +181,21 @@ public default Optional lookupMixedInAction(final ObjectSpe /** * Returns an (immutable) "short" identifier for this specification. - * *

* This will be the class name without the package; any text up to and * including the last period is removed. */ String getShortIdentifier(); + /** + * Immutable set of {@link LogicalType} aliases for corresponding + * domain object or service. + *

+ * Corresponds to {@link DomainService#aliased()} and + * {@link DomainObject#aliased()}. + */ + Can getAliases(); + /** * Returns the (singular) name for objects of this specification. *

@@ -385,16 +396,7 @@ default boolean isValueOrIsParented() { * Whether this specification represents a bean, that is a managed bean * with scoped life-cycle, available for dependency injection. */ - default boolean isManagedBean() { - return getManagedBeanName()!=null; - } - - /** - * If this specification represents a bean, that is a managed bean, then - * returns the bean's name/id as recognized by the IoC container. - *

Otherwise returns {@code null}. - */ - String getManagedBeanName(); + boolean isInjectable(); default boolean isMixin() { return getBeanSort().isMixin(); @@ -481,7 +483,7 @@ default Stream streamFacetHolders(){ * @since 2.0 */ default boolean isIdentifiable() { - return isManagedBean() || isViewModel() || isEntity(); + return isInjectable() || isViewModel() || isEntity(); } /** diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java index d71a089f122..905d19d5d6a 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java @@ -263,7 +263,7 @@ default ActionMemento getMemento() { default PromptStyle getPromptStyle() { val promptStyle = lookupFacet(PromptStyleFacet.class) .map(PromptStyleFacet::value); - if(getDeclaringType().isManagedBean() // <-- menu actions + if(getDeclaringType().isInjectable() // <-- menu actions // no-arg DIALOG is correctly handled, // whereas for INLINE it would render a form with no fields || getParameterCount() == 0) { diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolver.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolver.java index eea39ba3484..720c70c20bd 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolver.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolver.java @@ -47,13 +47,23 @@ interface LogicalTypeResolver { /** * Collects concrete types, ignores abstract types and interfaces. * Allows types to override their concrete super types. + *

+ * Acts as an identity operator with side-effects. * @param spec - type's ObjectSpecification */ - void register(@NonNull ObjectSpecification spec); + ObjectSpecification register(@NonNull ObjectSpecification spec); /** * Removes all entries from the lookup table. */ void clear(); + /** + * Collects aliases for concrete types, ignores abstract types and interfaces. + *

+ * Acts as an identity operator with side-effects. + * @param spec - type's ObjectSpecification + */ + ObjectSpecification registerAliases(@NonNull ObjectSpecification spec); + } \ No newline at end of file diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java index ce7a271a8b6..8336b837bd7 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java @@ -23,7 +23,6 @@ import org.apache.isis.applib.id.LogicalType; import org.apache.isis.commons.internal.collections._Maps; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import lombok.NonNull; @@ -46,38 +45,62 @@ public Optional lookup(final @NonNull String logicalTypeName) { } @Override - public void register(final @NonNull ObjectSpecification spec) { + public ObjectSpecification register(final @NonNull ObjectSpecification spec) { - // collect concrete classes (do not collect abstract or anonymous types or interfaces) - if(!spec.isAbstract() - && hasUsableObjectTypeFacet(spec)) { + val logicalTypeName = spec.getLogicalTypeName(); - val key = spec.getLogicalTypeName(); + if(logicalTypeByName.containsKey(logicalTypeName)) { + return spec; + } - val previousMapping = logicalTypeByName.put(key, spec.getLogicalType()); + // collect concrete classes (do not collect abstract or anonymous types or interfaces) + if(!spec.isAbstract() + && hasTypeIdentity(spec)) { - if(previousMapping!=null) { + putWithWarnOnOverride(logicalTypeName, spec); + } + return spec; + } - val msg = String.format("Overriding existing mapping\n" - + "%s -> %s,\n" - + "with\n " - + "%s -> %s\n " - + "This will result in the meta-model validation to fail.", - key, previousMapping.getCorrespondingClass(), - key, spec.getCorrespondingClass()); + @Override + public ObjectSpecification registerAliases(final @NonNull ObjectSpecification spec) { - log.warn(msg); + // adding aliases to the lookup map + spec.getAliases() + .forEach(alias->{ + putWithWarnOnOverride(alias.getLogicalTypeName(), spec); + }); - } - } + return spec; } // -- HELPER - private boolean hasUsableObjectTypeFacet(ObjectSpecification spec) { + private boolean hasTypeIdentity(final ObjectSpecification spec) { // anonymous inner classes (eg org.estatio.dom.WithTitleGetter$ToString$1) - // don't have an ObjectType; hence the guard. - return spec.containsNonFallbackFacet(LogicalTypeFacet.class); + // don't have type identity; hence the guard. + return spec.getCorrespondingClass().getCanonicalName()!=null; + } + + private void putWithWarnOnOverride( + final String logicalTypeName, + final ObjectSpecification spec) { + + final LogicalType previousMapping = + logicalTypeByName.put(logicalTypeName, spec.getLogicalType()); + + if(previousMapping!=null + && !spec.getLogicalType().equals(previousMapping)) { + val msg = String.format("Overriding existing mapping\n" + + "%s -> %s,\n" + + "with\n " + + "%s -> %s\n " + + "This will result in the meta-model validation to fail.", + logicalTypeName, previousMapping.getCorrespondingClass(), + logicalTypeName, spec.getCorrespondingClass()); + log.warn(msg); + } + } } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java index fe2f4c7e9e8..78a784d09c7 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java @@ -21,10 +21,11 @@ import java.util.Optional; import java.util.function.Consumer; +import javax.inject.Named; + import org.springframework.lang.Nullable; import org.apache.isis.applib.Identifier; -import org.apache.isis.applib.annotation.LogicalTypeName; import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.services.bookmark.Bookmark; import org.apache.isis.commons.collections.Can; @@ -150,7 +151,7 @@ default LogicalType lookupLogicalTypeElseFail(@NonNull final String logicalTypeN /** * The lookup may also fail (result with null), when there is no concrete or abstract resolvable type, - * that matches given {@code logicalTypeName}. Eg. when using {@link LogicalTypeName} on an interface, + * that matches given {@code logicalTypeName}. Eg. when using {@link Named} on an interface, * while overriding with a different logical-type-name on the concrete or abstract type. */ @Nullable diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java index 0b4dc8a6a86..57c4aafee19 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java @@ -239,7 +239,7 @@ public void createMetaModel() { Stream .concat( - isisBeanTypeRegistry.getDiscoveredValueTypes().stream(), + isisBeanTypeRegistry.getDiscoveredValueTypes().keySet().stream(), valueSemanticsResolver.get().streamClassesWithValueSemantics()) .forEach(valueType -> { val valueSpec = loadSpecification(valueType, IntrospectionState.NOT_INTROSPECTED); @@ -255,12 +255,9 @@ public void createMetaModel() { val mixinSpecs = _Lists.newArrayList(); isisBeanTypeRegistry.streamIntrospectableTypes() - .forEach(type->{ + .forEach(typeMeta->{ - val cls = type.getCorrespondingClass(); - val sort = type.getBeanSort(); - - val spec = primeSpecification(cls, sort); + val spec = primeSpecification(typeMeta); if(spec==null) { //XXX only ever happens when the class substitutor vetoes return; @@ -268,6 +265,8 @@ public void createMetaModel() { knownSpecs.add(spec); + val sort = typeMeta.getBeanSort(); + if(sort.isManagedBean() || sort.isEntity() || sort.isViewModel() ) { domainObjectSpecs.add(spec); } else if(sort.isMixin()) { @@ -451,7 +450,7 @@ public Optional lookupLogicalType(final @NonNull String logicalType return logicalType; } - //TODO[2533] if the logicalTypeName is not available and instead a fqcn was passed in, that should also be supported + //XXX[2533] if the logicalTypeName is not available and instead a fqcn was passed in, that should also be supported // falling back assuming the logicalTypeName equals the fqn of the corresponding class // which might not always be true, @@ -524,30 +523,28 @@ private ValidationFailures collectFailuresFromMetaModel() { * however as a fallback we might need to classify types that escaped eager introspection * here. */ - private BeanSort classify(final @Nullable Class type) { + private IsisBeanMetaData classify(final @Nullable Class type) { return isisBeanTypeRegistry .lookupIntrospectableType(type) - .map(IsisBeanMetaData::getBeanSort) .orElseGet(()-> valueSemanticsResolver.get().hasValueSemantics(type) - ? BeanSort.VALUE + ? IsisBeanMetaData.isisManaged(BeanSort.VALUE, LogicalType.infer(type)) : isisBeanTypeClassifier.classify(type) - .getBeanSort() ); } @Nullable private ObjectSpecification primeSpecification( - final @Nullable Class type, - final @NonNull BeanSort sort) { - return _loadSpecification(type, __->sort, IntrospectionState.NOT_INTROSPECTED); + final @NonNull IsisBeanMetaData typeMeta) { + return _loadSpecification( + typeMeta.getCorrespondingClass(), type->typeMeta, IntrospectionState.NOT_INTROSPECTED); } @Nullable private ObjectSpecification _loadSpecification( final @Nullable Class type, - final @NonNull Function, BeanSort> beanClassifier, + final @NonNull Function, IsisBeanMetaData> beanClassifier, final @NonNull IntrospectionState upTo) { if(type==null) { @@ -561,14 +558,29 @@ private ObjectSpecification _loadSpecification( val substitutedType = substitute.apply(type); - final ObjectSpecification spec = cache.computeIfAbsent(substitutedType, __->{ - val newSpec = createSpecification(substitutedType, beanClassifier.apply(substitutedType)); - logicalTypeResolver.register(newSpec); - return newSpec; - }); + val spec = cache.computeIfAbsent(substitutedType, _spec-> + logicalTypeResolver + .register( + createSpecification(beanClassifier.apply(substitutedType)))); spec.introspectUpTo(upTo); + if(spec.getAliases().isNotEmpty() + // this bool. expr. is an optimization, not strictly required ... a bit of hack though + && upTo == IntrospectionState.TYPE_INTROSPECTED) { + + //XXX[3063] hitting this a couple of times + //(~5 see org.apache.isis.testdomain.domainmodel.DomainModelTest_usingGoodDomain.aliasesOnDomainServices_shouldBeHonored()) + // per spec (with aliases), even though already registered; + // room for performance optimizations, but at the time of writing + // don't want to add a ObjectSpecification flag to keep track of alias registered state; + // as an alternative purge the aliased facets and introspect aliased attributes from annotations + // much earlier in the bootstrap process, same as we do with @Named processing + + logicalTypeResolver + .registerAliases(spec); + } + return spec; } @@ -591,18 +603,16 @@ private void guardAgainstMetamodelLockedAfterFullIntrospection(final Class cl /** * Creates the appropriate type of {@link ObjectSpecification}. */ - private ObjectSpecification createSpecification(final Class cls, final BeanSort beanSort) { + private ObjectSpecification createSpecification(final IsisBeanMetaData typeMeta) { - guardAgainstMetamodelLockedAfterFullIntrospection(cls); + guardAgainstMetamodelLockedAfterFullIntrospection(typeMeta.getCorrespondingClass()); // ... and create the specs val objectSpec = new ObjectSpecificationDefault( - cls, - beanSort, + typeMeta, metaModelContext, facetProcessor, - isisBeanTypeRegistry.lookupManagedBeanNameForType(cls).orElse(null), postProcessor, classSubstitutorRegistry); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/IntrospectionState.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/IntrospectionState.java index add420ac7be..9163ef62dc1 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/IntrospectionState.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/IntrospectionState.java @@ -18,7 +18,7 @@ */ package org.apache.isis.core.metamodel.specloader.specimpl; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; +import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacet; public enum IntrospectionState implements Comparable { /** diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java index 47f729141d8..ca46991de12 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java @@ -64,7 +64,7 @@ import org.apache.isis.core.metamodel.facets.object.icon.IconFacet; import org.apache.isis.core.metamodel.facets.object.icon.ObjectIcon; import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; +import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacet; import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet; import org.apache.isis.core.metamodel.facets.object.navparent.NavigableParentFacet; import org.apache.isis.core.metamodel.facets.object.parented.ParentedCollectionFacet; @@ -177,22 +177,23 @@ public Can snapshot() { private final String shortName; private final boolean isAbstract; - // derived lazily, cached since immutable - private _Lazy logicalTypeLazy = _Lazy.threadSafe(this::lookupLogicalType); + private final LogicalType logicalType; private ObjectSpecification superclassSpec; private TitleFacet titleFacet; private IconFacet iconFacet; private NavigableParentFacet navigableParentFacet; + private AliasedFacet aliasedFacet; private CssClassFacet cssClassFacet; private IntrospectionState introspectionState = IntrospectionState.NOT_INTROSPECTED; // -- Constructor - public ObjectSpecificationAbstract( + protected ObjectSpecificationAbstract( final Class introspectedClass, + final LogicalType logicalType, final String shortName, final BeanSort beanSort, final FacetProcessor facetProcessor, @@ -201,16 +202,13 @@ public ObjectSpecificationAbstract( super(facetProcessor.getMetaModelContext()); this.correspondingClass = introspectedClass; + this.logicalType = logicalType; this.fullName = introspectedClass.getName(); this.shortName = shortName; this.beanSort = beanSort; this.isAbstract = ClassExtensions.isAbstract(introspectedClass); - - super.featureIdentifier = Identifier.classIdentifier( - LogicalType.lazy( - introspectedClass, - ()->logicalTypeLazy.get().getLogicalTypeName())); + super.featureIdentifier = Identifier.classIdentifier(logicalType); this.facetProcessor = facetProcessor; this.postProcessor = postProcessor; @@ -224,15 +222,7 @@ public final FeatureType getFeatureType() { @Override public final LogicalType getLogicalType() { - return logicalTypeLazy.get(); - } - - private LogicalType lookupLogicalType() { - val logicalTypeFacet = getFacet(LogicalTypeFacet.class); - if(logicalTypeFacet == null) { - throw new IllegalStateException("could not find an LogicalTypeFacet for " + this.getFullIdentifier()); - } - return logicalTypeFacet.getLogicalType(); + return logicalType; } @Override @@ -393,6 +383,7 @@ private void updateFromFacetValues() { iconFacet = getFacet(IconFacet.class); navigableParentFacet = getFacet(NavigableParentFacet.class); cssClassFacet = getFacet(CssClassFacet.class); + aliasedFacet = getFacet(AliasedFacet.class); } protected void postProcess() { @@ -408,7 +399,7 @@ public String getTitle(final TitleRenderRequest titleRenderRequest) { return titleString; } } - val prefix = this.isManagedBean() + val prefix = this.isInjectable() ? "" : "Untitled "; return prefix + getSingularName(); @@ -416,12 +407,12 @@ public String getTitle(final TitleRenderRequest titleRenderRequest) { @Override public String getIconName(final ManagedObject domainObject) { - if(ManagedObjects.isSpecified(domainObject)) { _Assert.assertEquals(domainObject.getSpecification(), this); } - - return iconFacet == null ? null : iconFacet.iconName(domainObject); + return iconFacet != null + ? iconFacet.iconName(domainObject) + : null; } @Override @@ -432,14 +423,23 @@ public ObjectIcon getIcon(final ManagedObject domainObject) { @Override public Object getNavigableParent(final Object object) { - return navigableParentFacet == null - ? null - : navigableParentFacet.navigableParent(object); + return navigableParentFacet != null + ? navigableParentFacet.navigableParent(object) + : null; } @Override public String getCssClass(final ManagedObject reference) { - return cssClassFacet == null ? null : cssClassFacet.cssClass(reference); + return cssClassFacet != null + ? cssClassFacet.cssClass(reference) + : null; + } + + @Override + public Can getAliases() { + return aliasedFacet != null + ? aliasedFacet.getAliases() + : Can.empty(); } @Override @@ -695,14 +695,14 @@ public Stream streamDeclaredActions( // -- mixin associations (properties and collections) private void createMixedInAssociations(final Consumer onNewMixedInAssociation) { - if (isManagedBean() || isValue()) { + if (isInjectable() || isValue()) { return; } val mixinTypes = getIsisBeanTypeRegistry().getMixinTypes(); if(_NullSafe.isEmpty(mixinTypes)) { return; } - for (val mixinType : mixinTypes) { + for (val mixinType : mixinTypes.keySet()) { forEachMixedInAssociation(mixinType, onNewMixedInAssociation); } } @@ -745,7 +745,7 @@ private void createMixedInActions(final Consumer onNewMixedInActio if(_NullSafe.isEmpty(mixinTypes)) { return; } - for (val mixinType : mixinTypes) { + for (val mixinType : mixinTypes.keySet()) { forEachMixedInAction(mixinType, onNewMixedInAction); } } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java index 2b33d494ecf..fae5884b828 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java @@ -28,12 +28,12 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract; import org.apache.isis.core.metamodel.facetapi.FacetUtil; import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet; -import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetAbstract; +import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetFromActionReturn; import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet; import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetForStaticMemberName; import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet; import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetForContributee; -import org.apache.isis.core.metamodel.facets.propcoll.memserexcl.SnapshotExcludeFacetAbstract; +import org.apache.isis.core.metamodel.facets.properties.update.SnapshotExcludeFacetFromImmutableMember; import org.apache.isis.core.metamodel.interactions.InteractionHead; import org.apache.isis.core.metamodel.services.publishing.ExecutionPublisher; import org.apache.isis.core.metamodel.spec.ManagedObject; @@ -108,9 +108,9 @@ public OneToManyAssociationMixedIn( // // ensure the mixedIn collection cannot be modified, and derive its TypeOfFaccet // - FacetUtil.addFacet(new SnapshotExcludeFacetAbstract(this) {}); + FacetUtil.addFacet(new SnapshotExcludeFacetFromImmutableMember(this)); FacetUtil.addFacet(disabledFacet()); - FacetUtil.addFacet(new TypeOfFacetAbstract(getElementType().getCorrespondingClass(), this) {}); + FacetUtil.addFacet(new TypeOfFacetFromActionReturn(getElementType().getCorrespondingClass(), this)); // adjust name if necessary val isExplicitlyNamed = lookupNonFallbackFacet(MemberNamedFacet.class) diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java index dff41e973db..656a32e4f36 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java @@ -30,13 +30,13 @@ import org.apache.isis.applib.Identifier; import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy; -import org.apache.isis.applib.services.metamodel.BeanSort; import org.apache.isis.commons.collections.Can; import org.apache.isis.commons.collections.ImmutableEnumSet; import org.apache.isis.commons.internal.base._Lazy; import org.apache.isis.commons.internal.collections._Lists; import org.apache.isis.commons.internal.collections._Maps; import org.apache.isis.commons.internal.reflection._Reflect; +import org.apache.isis.core.config.beans.IsisBeanMetaData; import org.apache.isis.core.metamodel.commons.StringExtensions; import org.apache.isis.core.metamodel.commons.ToString; import org.apache.isis.core.metamodel.context.MetaModelContext; @@ -76,11 +76,6 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract implements FacetHolder { - private static String determineShortName(final Class introspectedClass) { - final String name = introspectedClass.getName(); - return name.substring(name.lastIndexOf('.') + 1); - } - // -- constructor, fields /** @@ -95,27 +90,24 @@ private static String determineShortName(final Class introspectedClass) { @Getter(onMethod_ = {@Override}) private final IntrospectionPolicy introspectionPolicy; - /** - * available only for managed-beans - */ - private final String nameIfIsManagedBean; - public ObjectSpecificationDefault( - final Class correspondingClass, - final BeanSort beanSort, + final IsisBeanMetaData typeMeta, final MetaModelContext mmc, final FacetProcessor facetProcessor, - final String nameIfIsManagedBean, + final PostProcessor postProcessor, final ClassSubstitutorRegistry classSubstitutorRegistry) { - super(correspondingClass, determineShortName(correspondingClass), beanSort, facetProcessor, postProcessor); + super(typeMeta.getCorrespondingClass(), + typeMeta.getLogicalType(), + typeMeta.getLogicalType().getLogicalTypeSimpleName(), + typeMeta.getBeanSort(), facetProcessor, postProcessor); - this.nameIfIsManagedBean = nameIfIsManagedBean; + this.injectable = typeMeta.getManagedBy().isSpring(); this.classSubstitutorRegistry = classSubstitutorRegistry; // must install EncapsulationFacet (if any) and MemberAnnotationPolicyFacet (if any) - facetProcessor.processObjectType(correspondingClass, this); + facetProcessor.processObjectType(typeMeta.getCorrespondingClass(), this); // naturally supports attribute inheritance from the type's hierarchy final IntrospectionPolicy introspectionPolicy = @@ -129,9 +121,11 @@ public ObjectSpecificationDefault( this.facetedMethodsBuilder = new FacetedMethodsBuilder(this, facetProcessor, classSubstitutorRegistry); - } + @Getter(onMethod_ = {@Override}) + private final boolean injectable; + @Override protected void introspectTypeHierarchy() { @@ -252,13 +246,6 @@ private ObjectAction createAction(final FacetedMethod facetedMethod) { } } - // -- PREDICATES - - @Override - public String getManagedBeanName() { - return nameIfIsManagedBean; - } - // -- getObjectAction @Override @@ -397,6 +384,4 @@ public Optional valueFacet() { : lookupFacet(ValueFacet.class); } - // -- - } diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java index 35d4386e1dc..f6c649657a1 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java @@ -20,6 +20,8 @@ import java.util.UUID; +import javax.inject.Named; + import org.jmock.Expectations; import org.junit.After; import org.junit.Assert; @@ -33,6 +35,7 @@ import org.apache.isis.applib.annotation.Bounding; import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.mixins.system.HasInteractionId; import org.apache.isis.core.config.IsisConfiguration; import org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration; @@ -40,7 +43,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet; import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase; import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext; -import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory.ProcessObjectTypeContext; import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet; import org.apache.isis.core.metamodel.facets.object.domainobject.autocomplete.AutoCompleteFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.object.domainobject.choices.ChoicesFacetForDomainObjectAnnotation; @@ -50,12 +52,11 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.entitychangepublishing.EntityChangePublishingFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.object.domainobject.entitychangepublishing.EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured; import org.apache.isis.core.metamodel.facets.object.domainobject.entitychangepublishing.EntityChangePublishingFacetFromConfiguration; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; +import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacet; import org.apache.isis.core.metamodel.facets.object.publish.entitychange.EntityChangePublishingFacet; -import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet; +import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacetForDomainObjectAnnotation; import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet; import org.apache.isis.core.metamodel.methods.MethodByClassMap; @@ -556,7 +557,8 @@ public void irrespective_of_configured_value() { public static class LogicalTypeName extends DomainObjectAnnotationFacetFactoryTest { - @DomainObject(logicalTypeName = "CUS") + @Named("CUS") + @DomainObject class CustomerWithDomainObjectAndObjectTypeSet { } @@ -573,18 +575,8 @@ public void setUp() throws Exception { @Test public void whenDomainObjectAndObjectTypeSetToTrue() { - - facetFactory.process(new ProcessObjectTypeContext(CustomerWithDomainObjectAndObjectTypeSet.class, facetHolder)); - - final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class); - Assert.assertNotNull(facet); - - Assert.assertTrue(facet instanceof LogicalTypeFacetForDomainObjectAnnotation); - final LogicalTypeFacetForDomainObjectAnnotation facetForDomainObjectAnnotation = - (LogicalTypeFacetForDomainObjectAnnotation) facet; - - assertThat(facetForDomainObjectAnnotation.value(), is("CUS")); - + assertThat(LogicalType.infer(CustomerWithDomainObjectAndObjectTypeSet.class).getLogicalTypeName(), + is("CUS")); expectNoMethodsRemoved(); } @@ -594,7 +586,7 @@ public void whenDomainObjectAndObjectTypeNotSet() { facetFactory.process(ProcessClassContext .forTesting(CustomerWithDomainObjectButNoObjectType.class, mockMethodRemover, facetHolder)); - final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class); + final Facet facet = facetHolder.getFacet(AliasedFacet.class); Assert.assertNull(facet); expectNoMethodsRemoved(); @@ -606,7 +598,7 @@ public void whenNoDomainObjectAnnotation() { facetFactory.process(ProcessClassContext .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder)); - final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class); + final Facet facet = facetHolder.getFacet(AliasedFacet.class); Assert.assertNull(facet); expectNoMethodsRemoved(); diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java similarity index 56% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java rename to core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java index bbf822df1c5..a5f2592ee0f 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java @@ -16,15 +16,32 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.core.metamodel.facets.object.logicaltype.classname; +package org.apache.isis.core.metamodel.facets.object.domainobject; +import javax.inject.Named; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; +import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase; + +public class NamedAnnotationFacetFactoryTest +extends AbstractFacetFactoryJUnit4TestCase { -public class LogicalTypeFacetOnStandaloneList extends LogicalTypeFacetAbstract { + @Test + public void logicalTypeNameAnnotationPickedUpOnClass() { + + @Named("CUS") + @DomainObject + class Customer { + } + + assertThat(LogicalType.infer(Customer.class).getLogicalTypeName(), is("CUS")); - public LogicalTypeFacetOnStandaloneList(final LogicalType logicalType, final FacetHolder holder) { - super(logicalType, holder); } + } diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java deleted file mode 100644 index 68d85ff7246..00000000000 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.core.metamodel.facets.object.domainobject; - -import org.junit.Before; -import org.junit.Test; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import org.apache.isis.applib.annotation.DomainObject; -import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase; -import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory.ProcessObjectTypeContext; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForDomainObjectAnnotation; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; -import org.apache.isis.core.metamodel.methods.MethodByClassMap; - -import lombok.val; - -public class ObjectTypeAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase { - - private DomainObjectAnnotationFacetFactory facetFactory; - - @Before - public void setUp() throws Exception { - facetFactory = new DomainObjectAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); - } - - @Test - public void logicalTypeNameAnnotationPickedUpOnClass() { - - @DomainObject(logicalTypeName = "CUS") - class Customer { - } - - expectNoMethodsRemoved(); - - val context = new ProcessObjectTypeContext(Customer.class, facetHolder); - facetFactory.processLogicalTypeName(context.synthesizeOnType(DomainObject.class), context); - - final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class); - - assertThat(facet, is(not(nullValue()))); - assertThat(facet instanceof LogicalTypeFacetForDomainObjectAnnotation, is(true)); - assertThat(facet.value(), is("CUS")); - - } - -} diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java index dc9473e045f..bd4a9ec5fd5 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactoryTest.java @@ -53,8 +53,8 @@ class Customers { final Facet facet = facetHolder.getFacet(DomainServiceFacet.class); assertNotNull(facet); - assertTrue(facet instanceof DomainServiceFacetAnnotation); - DomainServiceFacetAnnotation domainServiceFacet = (DomainServiceFacetAnnotation) facet; + assertTrue(facet instanceof DomainServiceFacetForAnnotation); + DomainServiceFacetForAnnotation domainServiceFacet = (DomainServiceFacetForAnnotation) facet; assertNotNull(domainServiceFacet); assertNoMethodsRemoved(); diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetFromClassNameFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetFromClassNameFactoryTest.java deleted file mode 100644 index 5af24c1b562..00000000000 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetFromClassNameFactoryTest.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.core.metamodel.facets.object.logicaltype; - -import org.datanucleus.testing.dom.CustomerAsProxiedByDataNucleus; -import org.junit.Test; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.MatcherAssert.assertThat; - -import org.apache.isis.applib.annotation.Value; -import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase; -import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory; -import org.apache.isis.core.metamodel.facets.object.logicaltype.classname.LogicalTypeFacetFromClassName; -import org.apache.isis.core.metamodel.facets.object.logicaltype.classname.LogicalTypeFacetFromClassNameFactory; -import org.apache.isis.core.metamodel.facets.value.annotation.LogicalTypeFacetForValueAnnotation; -import org.apache.isis.core.metamodel.facets.value.annotation.ValueAnnotationFacetFactory; - -public class LogicalTypeFacetFromClassNameFactoryTest -extends AbstractFacetFactoryJUnit4TestCase { - - private ObjectTypeFacetFactory facetFactory; - - public static class Customer { - } - - @Test - public void installsFacet_passedThroughClassSubstitutor() { - - facetFactory = LogicalTypeFacetFromClassNameFactory.forTesting(metaModelContext); - - expectNoMethodsRemoved(); - - facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(CustomerAsProxiedByDataNucleus.class, facetHolder)); - - final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class); - - assertThat(facet, is(not(nullValue()))); - assertThat(facet instanceof LogicalTypeFacetFromClassName, is(true)); - assertThat(facet.value(), is(Customer.class.getCanonicalName())); - } - - @Value - public static class ValueExample1 { - } - - @Test - public void installsFacet_onValues() { - - facetFactory = LogicalTypeFacetFromClassNameFactory.forTesting(metaModelContext); - - expectNoMethodsRemoved(); - - facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(ValueExample1.class, facetHolder)); - - final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class); - - assertThat(facet, is(not(nullValue()))); - assertThat(facet instanceof LogicalTypeFacetFromClassName, is(true)); - assertThat(facet.value(), is(ValueExample1.class.getCanonicalName())); - } - - @Value(logicalTypeName = "xxx.ValueExample") - public static class ValueExample2 { - } - - @Test - public void installsFacet_onValuesUsingLogicalTypeName() { - - facetFactory = new ValueAnnotationFacetFactory(metaModelContext); - - expectNoMethodsRemoved(); - - facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(ValueExample2.class, facetHolder)); - - final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class); - - assertThat(facet, is(not(nullValue()))); - assertThat(facet instanceof LogicalTypeFacetForValueAnnotation, is(true)); - assertThat(facet.value(), is("xxx.ValueExample")); - } - - - -} - diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java new file mode 100644 index 00000000000..dabd9d8af44 --- /dev/null +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.core.metamodel.facets.object.logicaltype; + +import javax.inject.Named; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.apache.isis.applib.annotation.Value; +import org.apache.isis.applib.id.LogicalType; +import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase; + +public class LogicalTypeInferenceTest +extends AbstractFacetFactoryJUnit4TestCase { + + public static class Customer { + } + + @Test + public void installsFacet_passedThroughClassSubstitutor() { + assertThat(LogicalType.infer(Customer.class).getLogicalTypeName(), + is(Customer.class.getCanonicalName())); + } + + @Value + public static class ValueExample1 { + } + + @Test + public void installsFacet_onValues() { + assertThat(LogicalType.infer(ValueExample1.class).getLogicalTypeName(), + is(ValueExample1.class.getCanonicalName())); + } + + @Named("xxx.ValueExample") + @Value + public static class ValueExample2 { + } + + @Test + public void installsFacet_onValuesUsingLogicalTypeName() { + assertThat(LogicalType.infer(ValueExample2.class).getLogicalTypeName(), + is("xxx.ValueExample")); + } + +} + diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java index 4b84f805c3f..c24dc764f20 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java @@ -27,8 +27,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import org.apache.isis.applib.annotation.ParameterLayout; import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy; +import org.apache.isis.applib.annotation.ParameterLayout; import org.apache.isis.commons.internal.reflection._Reflect; import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting; import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase; @@ -67,7 +67,7 @@ public void tearDown() throws Exception { @Test public void verifyProgrammingModelNumberOfFactories() { - assertEquals(63, programmingModel.streamFactories().count()); + assertEquals(62, programmingModel.streamFactories().count()); } @Test //verify we have the javac -parameter flag set when compiling this class diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/Bar.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/Bar.java index c3df28aa77c..c92b2773d67 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/Bar.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/grid/Bar.java @@ -18,14 +18,15 @@ */ package org.apache.isis.core.metamodel.services.grid; +import javax.inject.Named; + import org.apache.isis.applib.annotation.Action; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; +@Named("simple.Bar") @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = "simple.Bar" - ) + nature = Nature.VIEW_MODEL) public class Bar { @Action diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java index 14e83a3cb2d..2a52bc263b4 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefaultTest.java @@ -106,7 +106,7 @@ void setUp() throws Exception { allowing(mockSpec).subclasses(Hierarchical.Depth.DIRECT); will(returnValue(Can.empty())); - allowing(mockSpec).isManagedBean(); + allowing(mockSpec).isInjectable(); will(returnValue(true)); } }); diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java index 0de46cd2827..68c1a435332 100644 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java @@ -43,7 +43,6 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFactory; import org.apache.isis.core.metamodel.facets.object.icon.ObjectIcon; import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest; import org.apache.isis.core.metamodel.facets.object.value.ValueFacet; import org.apache.isis.core.metamodel.interactions.ObjectTitleContext; @@ -58,7 +57,6 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation; import org.apache.isis.core.metamodel.specloader.specimpl.IntrospectionState; -import lombok.Synchronized; import lombok.val; public class ObjectSpecificationStub @@ -71,7 +69,7 @@ public class ObjectSpecificationStub /** * lazily derived, see {@link #getLogicalType()} */ - private LogicalType logicalType; + private final LogicalType logicalType; private ObjectSpecification elementSpecification; private final Class correspondingClass; @@ -90,6 +88,12 @@ public Optional getMember(final String memberId) { return Optional.empty(); } + @Override + public boolean isInjectable() { + // XXX not implemented + return false; + } + @Override public Class getCorrespondingClass() { return correspondingClass; @@ -98,8 +102,9 @@ public Class getCorrespondingClass() { public ObjectSpecificationStub(final MetaModelContext mmc, final Class correspondingClass) { super(mmc); this.correspondingClass = correspondingClass; - title = ""; - name = correspondingClass.getCanonicalName(); + this.logicalType = LogicalType.infer(correspondingClass); + this.title = ""; + this.name = correspondingClass.getCanonicalName(); } @Override @@ -137,15 +142,16 @@ public String getFullIdentifier() { return name; } - @Synchronized @Override public LogicalType getLogicalType() { - if(logicalType == null) { - logicalType = getFacet(LogicalTypeFacet.class).getLogicalType(); - } return logicalType; } + @Override + public Can getAliases() { + return Can.empty(); + } + @Override public String getIconName(final ManagedObject reference) { return null; @@ -327,12 +333,6 @@ public void introspectUpTo(final IntrospectionState upTo) { // [2158] not implemented yet } - @Override - public String getManagedBeanName() { - // [2158] not implemented yet - return null; - } - @Override public Optional getMember(final Method method) { return Optional.empty(); diff --git a/core/metamodel/src/test/java/org/datanucleus/testing/dom/CustomerAsProxiedByDataNucleus.java b/core/metamodel/src/test/java/org/datanucleus/testing/dom/CustomerAsProxiedByDataNucleus.java index a0143368c60..b86727d797b 100644 --- a/core/metamodel/src/test/java/org/datanucleus/testing/dom/CustomerAsProxiedByDataNucleus.java +++ b/core/metamodel/src/test/java/org/datanucleus/testing/dom/CustomerAsProxiedByDataNucleus.java @@ -18,8 +18,8 @@ */ package org.datanucleus.testing.dom; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetFromClassNameFactoryTest; +import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeInferenceTest; public class CustomerAsProxiedByDataNucleus -extends LogicalTypeFacetFromClassNameFactoryTest.Customer { +extends LogicalTypeInferenceTest.Customer { } diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java index c1b88e7c9f6..6b703317d8c 100644 --- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java +++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/IsisModuleCoreRuntimeServices.java @@ -58,6 +58,7 @@ import org.apache.isis.core.runtimeservices.repository.RepositoryServiceDefault; import org.apache.isis.core.runtimeservices.routing.RoutingServiceDefault; import org.apache.isis.core.runtimeservices.scratchpad.ScratchpadDefault; +import org.apache.isis.core.runtimeservices.session.InteractionIdGenerator; import org.apache.isis.core.runtimeservices.session.InteractionServiceDefault; import org.apache.isis.core.runtimeservices.sitemap.SitemapServiceDefault; import org.apache.isis.core.runtimeservices.spring.SpringBeansService; @@ -94,6 +95,7 @@ ImpersonateMenuAdvisorDefault.class, InteractionDtoFactoryDefault.class, InteractionServiceDefault.class, + InteractionIdGenerator.class, JaxbServiceDefault.class, LocaleChoiceProviderDefault.class, LanguageProviderDefault.class, diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/factory/FactoryServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/factory/FactoryServiceDefault.java index 045235b95df..aa12b1d4f0d 100644 --- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/factory/FactoryServiceDefault.java +++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/factory/FactoryServiceDefault.java @@ -61,7 +61,7 @@ public class FactoryServiceDefault implements FactoryService { @Override public T getOrCreate(final @NonNull Class requiredType) { val spec = loadSpec(requiredType); - if(spec.isManagedBean()) { + if(spec.isInjectable()) { return get(requiredType); } return create(requiredType); @@ -142,7 +142,7 @@ public T viewModel(final @NonNull Class viewModelClass, final @Nullable B public T create(final @NonNull Class domainClass) { val spec = loadSpec(domainClass); - if(spec.isManagedBean()) { + if(spec.isInjectable()) { throw _Exceptions.illegalArgument( "Class '%s' is managed by IoC container, use get() instead", domainClass.getName()); } diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/homepage/HomePageResolverServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/homepage/HomePageResolverServiceDefault.java index 18f1b12b175..5ed009a0c82 100644 --- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/homepage/HomePageResolverServiceDefault.java +++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/homepage/HomePageResolverServiceDefault.java @@ -58,7 +58,7 @@ public HomePageResolverServiceDefault( @PostConstruct public void init() { val viewModelTypes = isisBeanTypeRegistry.getViewModelTypes(); - viewModelTypeForHomepage = viewModelTypes.stream() + viewModelTypeForHomepage = viewModelTypes.keySet().stream() .filter(viewModelType -> _Annotations.isPresent(viewModelType, HomePage.class)) .findFirst(); } diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionIdGenerator.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionIdGenerator.java new file mode 100644 index 00000000000..797bac4c7ac --- /dev/null +++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionIdGenerator.java @@ -0,0 +1,14 @@ +package org.apache.isis.core.runtimeservices.session; + +import java.util.UUID; + +import org.springframework.stereotype.Component; + +@Component +public class InteractionIdGenerator { + + public UUID interactionId() { + return UUID.randomUUID(); + } + +} diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionServiceDefault.java index d5b6594f3ca..c46723e71d4 100644 --- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionServiceDefault.java +++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionServiceDefault.java @@ -100,6 +100,7 @@ public class InteractionServiceDefault final ConfigurableBeanFactory beanFactory; final InteractionScopeLifecycleHandler interactionScopeLifecycleHandler; + final InteractionIdGenerator interactionIdGenerator; // to allow implementations to have dependencies back on this service. @Inject @Lazy List transactionBoundaryAwareBeans; @@ -112,7 +113,8 @@ public InteractionServiceDefault( final InteractionAwareTransactionalBoundaryHandler txBoundaryHandler, final ClockService clockService, final Provider commandPublisherProvider, - final ConfigurableBeanFactory beanFactory) { + final ConfigurableBeanFactory beanFactory, + final InteractionIdGenerator interactionIdGenerator) { this.runtimeEventService = runtimeEventService; this.specificationLoader = specificationLoader; this.serviceInjector = serviceInjector; @@ -120,6 +122,7 @@ public InteractionServiceDefault( this.clockService = clockService; this.commandPublisherProvider = commandPublisherProvider; this.beanFactory = beanFactory; + this.interactionIdGenerator = interactionIdGenerator; this.interactionScopeLifecycleHandler = InteractionScopeBeanFactoryPostProcessor.lookupScope(beanFactory); } @@ -216,10 +219,12 @@ private IsisInteraction getOrCreateIsisInteraction() { final Stack interactionLayers = interactionLayerStack.get(); return interactionLayers.isEmpty() - ? new IsisInteraction(UUID.randomUUID()) + ? new IsisInteraction(interactionIdGenerator.interactionId()) : _Casts.uncheckedCast(interactionLayers.firstElement().getInteraction()); } + + @Override public void closeInteractionLayers() { log.debug("about to close the interaction stack (conversation-id={}, total-layers-on-stack={}, {})", diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/logout/LogoutMenu.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/logout/LogoutMenu.java index 7366a7409d4..398558d3131 100644 --- a/core/security/src/main/java/org/apache/isis/core/security/authentication/logout/LogoutMenu.java +++ b/core/security/src/main/java/org/apache/isis/core/security/authentication/logout/LogoutMenu.java @@ -94,9 +94,9 @@ private Object getRedirect() { } /** A pseudo model used to redirect to the login page.*/ + @Named(LoginRedirect.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = LoginRedirect.LOGICAL_TYPE_NAME) + nature = Nature.VIEW_MODEL) public static class LoginRedirect { public final static String LOGICAL_TYPE_NAME = "isis.security.LoginRedirect"; } diff --git a/examples/demo/domain/pom.xml b/examples/demo/domain/pom.xml index cb535db03f8..2405ff9707a 100644 --- a/examples/demo/domain/pom.xml +++ b/examples/demo/domain/pom.xml @@ -115,11 +115,11 @@ org.apache.isis.extensions - isis-extensions-command-log-jdo + isis-extensions-commandlog-jdo org.apache.isis.extensions - isis-extensions-command-log-jpa + isis-extensions-commandlog-jpa diff --git a/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java index 78341ec0b4b..dfc653ed06c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/_infra/values/ValueHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom._infra.values; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.ValueHolder") +@Named("demo.ValueHolder") public interface ValueHolder { T value(); diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands.java index e0a2c4084b6..e03d28a0d3b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands.java @@ -25,7 +25,7 @@ import org.apache.isis.applib.annotation.PriorityPrecedence; import org.apache.isis.applib.services.tablecol.TableColumnOrderForCollectionTypeAbstract; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; /** * Marker interface for mixins to contribute to. @@ -35,9 +35,9 @@ public interface ExposePersistedCommands { @Service @javax.annotation.Priority(PriorityPrecedence.EARLY) - public static class TableColumnOrderDefault extends TableColumnOrderForCollectionTypeAbstract { + public static class TableColumnOrderDefault extends TableColumnOrderForCollectionTypeAbstract { - public TableColumnOrderDefault() { super(ICommandLog.class); } + public TableColumnOrderDefault() { super(CommandLogEntry.class); } @Override protected List orderParented(Object parent, String collectionId, List propertyIds) { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands_commands.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands_commands.java index eb6bbdb1257..5162a45856c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands_commands.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/_commands/ExposePersistedCommands_commands.java @@ -24,8 +24,8 @@ import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.CollectionLayout; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import lombok.RequiredArgsConstructor; @@ -39,10 +39,10 @@ public class ExposePersistedCommands_commands { private final ExposePersistedCommands exposePersistedCommands; //tag::class[] - public List coll() { + public List coll() { return commandModelRepository.findCompleted(); } - @Inject ICommandLogRepository commandModelRepository; + @Inject CommandLogEntryRepository commandModelRepository; } //end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/_interactions/InteractionDtoVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/_interactions/InteractionDtoVm.java index 2f727df1430..5773e539de1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/_interactions/InteractionDtoVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/_interactions/InteractionDtoVm.java @@ -21,6 +21,8 @@ import java.text.SimpleDateFormat; import java.util.Date; +import javax.inject.Named; + import org.apache.isis.applib.ViewModel; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.LabelPosition; @@ -41,10 +43,9 @@ import lombok.val; //tag::class[] +@Named("demo.InteractionDtoVm") @DomainObject( - logicalTypeName = "demo.InteractionDtoVm" - , nature = Nature.VIEW_MODEL -) + nature = Nature.VIEW_MODEL) @NoArgsConstructor @AllArgsConstructor public class InteractionDtoVm implements ViewModel { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/associateWith/ActionAssociateWithVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/associateWith/ActionAssociateWithVm.java index 487e5727388..83945a954bc 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/associateWith/ActionAssociateWithVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/associateWith/ActionAssociateWithVm.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Objects; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -51,9 +52,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionAssociateWithVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionAssociateWithVm" + nature=Nature.VIEW_MODEL ) @NoArgsConstructor //tag::class-properties[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/associateWith/child/ActionAssociateWithChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/associateWith/child/ActionAssociateWithChildVm.java index 3b5da28508a..e37a2776833 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/associateWith/child/ActionAssociateWithChildVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/associateWith/child/ActionAssociateWithChildVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.associateWith.child; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,9 +41,9 @@ @XmlRootElement(name = "child") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionAssociateWithChildVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionAssociateWithChildVm" + nature=Nature.VIEW_MODEL ) @NoArgsConstructor public class ActionAssociateWithChildVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/ActionCommandPublishingEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/ActionCommandPublishingEntity.java index 5b69c3c2aab..aead71d4a4f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/ActionCommandPublishingEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/ActionCommandPublishingEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.domain.actions.Action.commandPublishing; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.domain._commands.ExposePersistedCommands; -@DomainObject( - logicalTypeName = "demo.ActionCommandPublishingEntity" // shared permissions with concrete sub class -) +@Named("demo.ActionCommandPublishingEntity") // shared permissions with concrete sub class +@DomainObject public abstract class ActionCommandPublishingEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jdo/ActionCommandPublishingJdo-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jdo/ActionCommandPublishingJdo-description.adoc index fdb04e2a92d..6944571d924 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jdo/ActionCommandPublishingJdo-description.adoc +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jdo/ActionCommandPublishingJdo-description.adoc @@ -111,7 +111,7 @@ include::../ActionCommandPublishingEntity_mixinUpdatePropertyMetaAnnotationOverr == CommandServiceListener -The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension, so every command is persisted. +The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/commandlog/about.html[Command Log] extension, so every command is persisted. These can be viewed in the collection at the left bottom of the page. xref:refguide:applib:index/services/command/Command.adoc[Command]s are persisted after the page rendering phase, so to view a just-persisted command, refresh the page. @@ -137,9 +137,9 @@ In other words actions are reified to commands except for those that don't chang == Command Replay -The link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension provides an implementation of `CommandServiceListener` to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be persisted. +The link:https://isis.apache.org/extensions/2.0.0-M3/commandlog/about.html[Command Log] extension provides an implementation of `CommandServiceListener` to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be persisted. It also provides a RESTful endpoint to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be queried. -This is used by the link:https://isis.apache.org/extensions/2.0.0-M3/command-replay/about.html[Command Replay] extension to allow commands to be replayed on a secondary system, for regression testing. +This is used by the link:https://isis.apache.org/extensions/2.0.0-M3/commandreplay/about.html[Command Replay] extension to allow commands to be replayed on a secondary system, for regression testing. The associated `commandDtoProcessor()` element allows the xref:refguide:applib:index/services/command/Command.adoc[Command] XML representation (as a `CommandDto`) to be processed before being surfaced through the REST endpoint. One use case is to allow data to be obfuscated for security, or to replace large payloads (such as Blobs) with a smaller dummy payload. @@ -154,10 +154,10 @@ This activates the `application-secondary.properties` configuration file: [source,properties] ---- -isis.extensions.command-replay.primary-access.base-url-restful=http://localhost:8080/restful/ -isis.extensions.command-replay.primary-access.user=sven -isis.extensions.command-replay.primary-access.password=pass -isis.extensions.command-replay.primary-access.base-url-wicket=http://localhost:8080/wicket/ +isis.extensions.commandreplay.primary-access.base-url-restful=http://localhost:8080/restful/ +isis.extensions.commandreplay.primary-access.user=sven +isis.extensions.commandreplay.primary-access.password=pass +isis.extensions.commandreplay.primary-access.base-url-wicket=http://localhost:8080/wicket/ server.port=9090 ---- diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jdo/ActionCommandPublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jdo/ActionCommandPublishingJdo.java index 2d855cc1f4e..3fa0666c93e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jdo/ActionCommandPublishingJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jdo/ActionCommandPublishingJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.commandPublishing.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -48,9 +49,9 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.ActionCommandPublishingEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.ActionCommandPublishingEntity" , editing = Editing.DISABLED ) public class ActionCommandPublishingJdo diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jpa/ActionCommandPublishingJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jpa/ActionCommandPublishingJpa-description.adoc index 88dc52a201a..051c8d8eee7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jpa/ActionCommandPublishingJpa-description.adoc +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jpa/ActionCommandPublishingJpa-description.adoc @@ -111,7 +111,7 @@ include::../ActionCommandPublishingEntity_mixinUpdatePropertyMetaAnnotationOverr == CommandServiceListener -The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension, so every command is persisted. +The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/commandlog/about.html[Command Log] extension, so every command is persisted. These can be viewed in the collection at the left bottom of the page. xref:refguide:applib:index/services/command/Command.adoc[Command]s are persisted after the page rendering phase, so to view a just-persisted command, refresh the page. @@ -137,9 +137,9 @@ In other words actions are reified to commands except for those that don't chang == Command Replay -The link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension provides an implementation of `CommandServiceListener` to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be persisted. +The link:https://isis.apache.org/extensions/2.0.0-M3/commandlog/about.html[Command Log] extension provides an implementation of `CommandServiceListener` to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be persisted. It also provides a RESTful endpoint to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be queried. -This is used by the link:https://isis.apache.org/extensions/2.0.0-M3/command-replay/about.html[Command Replay] extension to allow commands to be replayed on a secondary system, for regression testing. +This is used by the link:https://isis.apache.org/extensions/2.0.0-M3/commandreplay/about.html[Command Replay] extension to allow commands to be replayed on a secondary system, for regression testing. The associated `commandDtoProcessor()` element allows the xref:refguide:applib:index/services/command/Command.adoc[Command] XML representation (as a `CommandDto`) to be processed before being surfaced through the REST endpoint. One use case is to allow data to be obfuscated for security, or to replace large payloads (such as Blobs) with a smaller dummy payload. @@ -154,10 +154,10 @@ This activates the `application-secondary.properties` configuration file: [source,properties] ---- -isis.extensions.command-replay.primary-access.base-url-restful=http://localhost:8080/restful/ -isis.extensions.command-replay.primary-access.user=sven -isis.extensions.command-replay.primary-access.password=pass -isis.extensions.command-replay.primary-access.base-url-wicket=http://localhost:8080/wicket/ +isis.extensions.commandreplay.primary-access.base-url-restful=http://localhost:8080/restful/ +isis.extensions.commandreplay.primary-access.user=sven +isis.extensions.commandreplay.primary-access.password=pass +isis.extensions.commandreplay.primary-access.base-url-wicket=http://localhost:8080/wicket/ server.port=9090 ---- diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jpa/ActionCommandPublishingJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jpa/ActionCommandPublishingJpa.java index 463418c1ec1..e71353e4533 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jpa/ActionCommandPublishingJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/commandPublishing/jpa/ActionCommandPublishingJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.commandPublishing.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -54,10 +55,9 @@ name = "ActionCommandPublishingJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.ActionCommandPublishingEntity") @DomainObject( - logicalTypeName = "demo.ActionCommandPublishingEntity" - , editing = Editing.DISABLED -) + editing = Editing.DISABLED) @NoArgsConstructor public class ActionCommandPublishingJpa extends ActionCommandPublishingEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.java index a1ed8e0ba84..4a6c3fce73a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/domainEvent/ActionDomainEventVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.domainEvent; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,10 +45,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionDomainEventVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionDomainEventVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor //tag::class[] public class ActionDomainEventVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/ActionExecutionPublishingEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/ActionExecutionPublishingEntity.java index 9b5db11432b..e544ffa195c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/ActionExecutionPublishingEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/ActionExecutionPublishingEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.domain.actions.Action.executionPublishing; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.domain._interactions.ExposeCapturedInteractions; -@DomainObject( - logicalTypeName = "demo.ActionExecutionPublishingEntity" // shared permissions with concrete sub class -) +@Named("demo.ActionExecutionPublishingEntity") // shared permissions with concrete sub class +@DomainObject public abstract class ActionExecutionPublishingEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/jdo/ActionExecutionPublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/jdo/ActionExecutionPublishingJdo.java index 922fb94350d..99a247040fc 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/jdo/ActionExecutionPublishingJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/jdo/ActionExecutionPublishingJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.executionPublishing.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -48,9 +49,9 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.ActionExecutionPublishingEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.ActionExecutionPublishingEntity" , editing = Editing.DISABLED ) public class ActionExecutionPublishingJdo diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/jpa/ActionExecutionPublishingJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/jpa/ActionExecutionPublishingJpa.java index be8ea3a5e33..1483a3772e5 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/jpa/ActionExecutionPublishingJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/executionPublishing/jpa/ActionExecutionPublishingJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.executionPublishing.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -54,10 +55,9 @@ name = "ActionExecutionPublishingJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.ActionExecutionPublishingEntity") @DomainObject( - logicalTypeName = "demo.ActionExecutionPublishingEntity" - , editing = Editing.DISABLED -) + editing = Editing.DISABLED) @NoArgsConstructor public class ActionExecutionPublishingJpa extends ActionExecutionPublishingEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHiddenVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHiddenVm.java index 0b8beca3732..afa09b1aab8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHiddenVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/hidden/ActionHiddenVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.hidden; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,10 +45,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionHiddenVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionHiddenVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor //tag::class[] public class ActionHiddenVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/restrictTo/ActionRestrictToVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/restrictTo/ActionRestrictToVm.java index 420967a7f1b..221b27deced 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/restrictTo/ActionRestrictToVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/restrictTo/ActionRestrictToVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.restrictTo; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,10 +45,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionRestrictToVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionRestrictToVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor //tag::class[] public class ActionRestrictToVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/semantics/ActionSemanticsVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/semantics/ActionSemanticsVm.java index d16d6b9c16b..afb3a35a0b6 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/semantics/ActionSemanticsVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/semantics/ActionSemanticsVm.java @@ -19,6 +19,7 @@ package demoapp.dom.domain.actions.Action.semantics; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -50,10 +51,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionSemanticsVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionSemanticsVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor //tag::class[] public class ActionSemanticsVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/typeOf/ActionTypeOfVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/typeOf/ActionTypeOfVm.java index 672169bcaf0..10e8aef4f9f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/typeOf/ActionTypeOfVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/typeOf/ActionTypeOfVm.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.stream.Collectors; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -45,10 +46,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionTypeOfVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionTypeOfVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor //tag::class-collections-children[] public class ActionTypeOfVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/typeOf/child/ActionTypeOfChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/typeOf/child/ActionTypeOfChildVm.java index 2fcf1a97b1d..8501a77ce87 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/typeOf/child/ActionTypeOfChildVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/Action/typeOf/child/ActionTypeOfChildVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.Action.typeOf.child; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,10 +41,9 @@ @XmlRootElement(name = "child") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionTypeOfChildVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionTypeOfChildVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class ActionTypeOfChildVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/position/ActionLayoutPositionVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/position/ActionLayoutPositionVm.java index 594fd7808f9..6cf501a2b63 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/position/ActionLayoutPositionVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/position/ActionLayoutPositionVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.ActionLayout.position; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,9 +41,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionLayoutPositionVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionLayoutPositionVm" + nature=Nature.VIEW_MODEL ) public class ActionLayoutPositionVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.java index e0ffbb913a9..f15eef2e434 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/ActionLayout/promptStyle/ActionLayoutPromptStyleVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.actions.ActionLayout.promptStyle; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,10 +42,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.ActionLayoutPromptStyleVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.ActionLayoutPromptStyleVm" -) + nature=Nature.VIEW_MODEL) public class ActionLayoutPromptStyleVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/AssociatedActionDemo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/AssociatedActionDemo.java index 7fbd54497aa..f496cd0e260 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/AssociatedActionDemo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/AssociatedActionDemo.java @@ -22,6 +22,7 @@ import java.util.Set; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.AssociatedAction", editing=Editing.ENABLED) +@Named("demo.AssociatedAction") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) @NoArgsConstructor public class AssociatedActionDemo implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/DemoItem.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/DemoItem.java index edf8f0097d2..3e0ef07b6c3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/DemoItem.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/assoc/DemoItem.java @@ -32,9 +32,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; - -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.AssociatedActionDemoTask") -@Named("assoc.DemoItem") +@Named("demo.AssociatedActionDemoTask") +@DomainObject(nature=Nature.VIEW_MODEL) @NoArgsConstructor @AllArgsConstructor(staticName="of") public class DemoItem { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DemoItem.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DemoItem.java index e8dc3d4bc68..d7a13e7ecd0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DemoItem.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DemoItem.java @@ -33,8 +33,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.DependentArgsDemoItem") -@Named("depargs.DemoItem") +@Named("demo.DependentArgsDemoItem") +@DomainObject(nature=Nature.VIEW_MODEL) @NoArgsConstructor @AllArgsConstructor(staticName="of") @EqualsAndHashCode // required for the Dependent Arguments demo to work properly diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DependentArgsActionDemo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DependentArgsActionDemo.java index 8470ba625ae..54322c4f47d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DependentArgsActionDemo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/actions/progmodel/depargs/DependentArgsActionDemo.java @@ -21,6 +21,7 @@ import java.util.LinkedHashSet; import java.util.Set; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -44,7 +45,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.DependentArgs", editing=Editing.ENABLED) +@Named("demo.DependentArgs") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) public class DependentArgsActionDemo implements HasAsciiDocDescription { public String title() { @@ -86,7 +88,5 @@ public Markup getIndependentText() { @Getter private final Set items = new LinkedHashSet<>(); - - } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/CollectionDomainEventVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/CollectionDomainEventVm.java index 1577ea87275..8590a918ea2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/CollectionDomainEventVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/CollectionDomainEventVm.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -45,9 +46,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.CollectionDomainEventVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.CollectionDomainEventVm", editing = Editing.ENABLED ) //tag::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/child/CollectionDomainEventChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/child/CollectionDomainEventChildVm.java index fe95326311b..3ef33cee2f4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/child/CollectionDomainEventChildVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/collections/Collection/domainEvent/child/CollectionDomainEventChildVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.collections.Collection.domainEvent.child; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,10 +41,9 @@ @XmlRootElement(name = "child") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.CollectionDomainEventChildVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.CollectionDomainEventChildVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class CollectionDomainEventChildVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingEntity.java index 1942098fa39..5a1cb2ea9bf 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.domain._changes.ExposeCapturedChanges; -@DomainObject( - logicalTypeName = "demo.DomainObjectEntityChangePublishingEntity" -) +@Named("demo.DomainObjectEntityChangePublishingEntity") +@DomainObject //tag::class[] public abstract class DomainObjectEntityChangePublishingEntity implements diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingVm.java index 9c03412259f..f464737e36f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/DomainObjectEntityChangePublishingVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -33,16 +34,14 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.DomainObjectEntityChangePublishingVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.DomainObjectEntityChangePublishingVm" -) + nature=Nature.VIEW_MODEL) public class DomainObjectEntityChangePublishingVm implements HasAsciiDocDescription { @ObjectSupport public String title() { return "DomainObject#entityChangePublishing"; } - } //end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/DomainObjectEntityChangePublishingDisabledEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/DomainObjectEntityChangePublishingDisabledEntity.java index c8399726ae8..3fe223f70ff 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/DomainObjectEntityChangePublishingDisabledEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/DomainObjectEntityChangePublishingDisabledEntity.java @@ -18,13 +18,14 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.annotated.disabled; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom.domain.objects.DomainObject.entityChangePublishing.DomainObjectEntityChangePublishingEntity; -@DomainObject( - logicalTypeName = "demo.DomainObjectEntityChangePublishingDisabledEntity" // shared permissions with concrete sub class -) +@Named("demo.DomainObjectEntityChangePublishingDisabledEntity") // shared permissions with concrete sub class +@DomainObject public abstract class DomainObjectEntityChangePublishingDisabledEntity extends DomainObjectEntityChangePublishingEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/jdo/DomainObjectEntityChangePublishingDisabledJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/jdo/DomainObjectEntityChangePublishingDisabledJdo.java index f7f36518915..b4240ca8ddd 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/jdo/DomainObjectEntityChangePublishingDisabledJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/jdo/DomainObjectEntityChangePublishingDisabledJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.annotated.disabled.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -41,9 +42,9 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.DomainObjectEntityChangePublishingDisabledEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.DomainObjectEntityChangePublishingDisabledEntity" , entityChangePublishing = Publishing.DISABLED // <.> , bounding = Bounding.BOUNDED ) @@ -55,7 +56,7 @@ public class DomainObjectEntityChangePublishingDisabledJdo // ... //end::class[] - public DomainObjectEntityChangePublishingDisabledJdo(String initialValue) { + public DomainObjectEntityChangePublishingDisabledJdo(final String initialValue) { this.property = initialValue; this.propertyUpdatedByAction = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/jpa/DomainObjectEntityChangePublishingDisabledJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/jpa/DomainObjectEntityChangePublishingDisabledJpa.java index a881863ea4b..7caa93c4a4f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/jpa/DomainObjectEntityChangePublishingDisabledJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/disabled/jpa/DomainObjectEntityChangePublishingDisabledJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.annotated.disabled.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -48,9 +49,9 @@ name = "DomainObjectEntityChangePublishingDisabledJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.DomainObjectEntityChangePublishingDisabledEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.DomainObjectEntityChangePublishingDisabledEntity" , entityChangePublishing = Publishing.DISABLED // <.> , bounding = Bounding.BOUNDED ) diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/DomainObjectEntityChangePublishingEnabledEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/DomainObjectEntityChangePublishingEnabledEntity.java index 95ff50a1eab..9e7d2b5416a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/DomainObjectEntityChangePublishingEnabledEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/DomainObjectEntityChangePublishingEnabledEntity.java @@ -18,13 +18,14 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.annotated.enabled; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom.domain.objects.DomainObject.entityChangePublishing.DomainObjectEntityChangePublishingEntity; -@DomainObject( - logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledEntity" // shared permissions with concrete sub class -) +@Named("demo.DomainObjectEntityChangePublishingEnabledEntity") // shared permissions with concrete sub class +@DomainObject public abstract class DomainObjectEntityChangePublishingEnabledEntity extends DomainObjectEntityChangePublishingEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/jdo/DomainObjectEntityChangePublishingEnabledJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/jdo/DomainObjectEntityChangePublishingEnabledJdo.java index 6bea4268ea2..f58493470df 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/jdo/DomainObjectEntityChangePublishingEnabledJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/jdo/DomainObjectEntityChangePublishingEnabledJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.annotated.enabled.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -41,9 +42,9 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.DomainObjectEntityChangePublishingEnabledEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledEntity" , entityChangePublishing = Publishing.ENABLED // <.> , bounding = Bounding.BOUNDED ) @@ -55,7 +56,7 @@ public class DomainObjectEntityChangePublishingEnabledJdo // ... //end::class[] - public DomainObjectEntityChangePublishingEnabledJdo(String initialValue) { + public DomainObjectEntityChangePublishingEnabledJdo(final String initialValue) { this.property = initialValue; this.propertyUpdatedByAction = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/jpa/DomainObjectEntityChangePublishingEnabledJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/jpa/DomainObjectEntityChangePublishingEnabledJpa.java index a93b32c84fb..61a89c9cbea 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/jpa/DomainObjectEntityChangePublishingEnabledJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/annotated/enabled/jpa/DomainObjectEntityChangePublishingEnabledJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.annotated.enabled.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -48,9 +49,9 @@ name = "DomainObjectEntityChangePublishingEnabledJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.DomainObjectEntityChangePublishingEnabledEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledEntity" , entityChangePublishing = Publishing.ENABLED // <.> , bounding = Bounding.BOUNDED ) diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity.java index c904d5ab4ee..4f4b8e9d761 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity.java @@ -18,13 +18,14 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.metaAnnot.enabled; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom.domain.objects.DomainObject.entityChangePublishing.DomainObjectEntityChangePublishingEntity; -@DomainObject( - logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity" // shared permissions with concrete sub class -) +@Named("demo.DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity") // shared permissions with concrete sub class +@DomainObject public abstract class DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity extends DomainObjectEntityChangePublishingEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/jdo/DomainObjectEntityChangePublishingEnabledMetaAnnotatedJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/jdo/DomainObjectEntityChangePublishingEnabledMetaAnnotatedJdo.java index ea2e070962e..e033e291f8e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/jdo/DomainObjectEntityChangePublishingEnabledMetaAnnotatedJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/jdo/DomainObjectEntityChangePublishingEnabledMetaAnnotatedJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.metaAnnot.enabled.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -42,9 +43,9 @@ @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") @DomainObjectEntityChangePublishingEnabledMetaAnnotation // <.> +@Named("demo.DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity" , bounding = Bounding.BOUNDED ) @DomainObjectLayout( @@ -55,7 +56,7 @@ public class DomainObjectEntityChangePublishingEnabledMetaAnnotatedJdo // ... //end::class[] - public DomainObjectEntityChangePublishingEnabledMetaAnnotatedJdo(String initialValue) { + public DomainObjectEntityChangePublishingEnabledMetaAnnotatedJdo(final String initialValue) { this.property = initialValue; this.propertyUpdatedByAction = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/jpa/DomainObjectEntityChangePublishingEnabledMetaAnnotatedJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/jpa/DomainObjectEntityChangePublishingEnabledMetaAnnotatedJpa.java index d891e15e80c..e3c63e07cf2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/jpa/DomainObjectEntityChangePublishingEnabledMetaAnnotatedJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnot/enabled/jpa/DomainObjectEntityChangePublishingEnabledMetaAnnotatedJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.metaAnnot.enabled.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -49,9 +50,9 @@ ) @EntityListeners(IsisEntityListener.class) @DomainObjectEntityChangePublishingEnabledMetaAnnotation // <.> +@Named("demo.DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledMetaAnnotatedEntity" , bounding = Bounding.BOUNDED ) @DomainObjectLayout( diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity.java index 37c6c4c1ade..d2c8ab2e5cf 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity.java @@ -18,13 +18,14 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.metaAnnotOverridden.enabled; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom.domain.objects.DomainObject.entityChangePublishing.DomainObjectEntityChangePublishingEntity; -@DomainObject( - logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity" // shared permissions with concrete sub class -) +@Named("demo.DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity") // shared permissions with concrete sub class +@DomainObject public abstract class DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity extends DomainObjectEntityChangePublishingEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/jdo/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/jdo/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJdo.java index ae57266885d..2d8749de47c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/jdo/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/jdo/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.metaAnnotOverridden.enabled.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -43,9 +44,9 @@ @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") @DomainObjectEntityChangePublishingDisabledMetaAnnotation // <.> +@Named("demo.DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity" , entityChangePublishing = Publishing.ENABLED // <.> , bounding = Bounding.BOUNDED ) @@ -59,7 +60,7 @@ public class DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJdo // ... //end::class[] - public DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJdo(String initialValue) { + public DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJdo(final String initialValue) { this.property = initialValue; this.propertyUpdatedByAction = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/jpa/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/jpa/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJpa.java index 22c87ec0330..4e6c6355d35 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/jpa/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/entityChangePublishing/metaAnnotOverridden/enabled/jpa/DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.entityChangePublishing.metaAnnotOverridden.enabled.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -50,9 +51,9 @@ ) @EntityListeners(IsisEntityListener.class) @DomainObjectEntityChangePublishingDisabledMetaAnnotation // <.> +@Named("demo.DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.DomainObjectEntityChangePublishingEnabledMetaAnnotOverriddenEntity" , entityChangePublishing = Publishing.ENABLED // <.> , bounding = Bounding.BOUNDED ) diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/JaxbRefEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/JaxbRefEntity.java index 03925e85d46..bcfc59a447e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/JaxbRefEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/JaxbRefEntity.java @@ -20,15 +20,16 @@ import java.util.Objects; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.ObjectSupport; import org.apache.isis.applib.annotation.Property; import demoapp.dom._infra.values.ValueHolder; -@DomainObject( - logicalTypeName = "demo.JaxbRefEntity" // shared permissions with concrete sub class -) +@Named("demo.JaxbRefEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JaxbRefEntity implements ValueHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/StatefulVmJaxbRefsEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/StatefulVmJaxbRefsEntity.java index dedc492ef0b..4abe07736b4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/StatefulVmJaxbRefsEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/StatefulVmJaxbRefsEntity.java @@ -23,6 +23,7 @@ import java.util.Objects; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -58,10 +59,9 @@ propOrder = {"message", "favoriteChild", "children"} ) @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.StatefulViewModelJaxbRefsEntity") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "demo.StatefulViewModelJaxbRefsEntity" -) + nature=Nature.VIEW_MODEL) public class StatefulVmJaxbRefsEntity implements HasAsciiDocDescription { @XmlTransient @Inject diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/jdo/JaxbRefJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/jdo/JaxbRefJdo.java index 56661c1c54b..a78686d865d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/jdo/JaxbRefJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/jdo/JaxbRefJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.nature.viewmodels.jaxbrefentity.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -38,9 +39,9 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo" ) @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.JaxbRefEntity") @DomainObject( - bounding = Bounding.BOUNDED - , logicalTypeName = "demo.JaxbRefEntity") + bounding = Bounding.BOUNDED) public class JaxbRefJdo extends JaxbRefEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/jpa/JaxbRefJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/jpa/JaxbRefJpa.java index b28b9ad7c4b..d00533530a0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/jpa/JaxbRefJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/jaxbrefentity/jpa/JaxbRefJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.DomainObject.nature.viewmodels.jaxbrefentity.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -45,9 +46,9 @@ name = "JaxbRefJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.JaxbRefEntity") @DomainObject( - bounding = Bounding.BOUNDED - , logicalTypeName = "demo.JaxbRefEntity") + bounding = Bounding.BOUNDED) @NoArgsConstructor public class JaxbRefJpa extends JaxbRefEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/usingjaxb/StatefulVmUsingJaxb.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/usingjaxb/StatefulVmUsingJaxb.java index 07b027087d7..3c981fe81ca 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/usingjaxb/StatefulVmUsingJaxb.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/DomainObject/nature/viewmodels/usingjaxb/StatefulVmUsingJaxb.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -51,10 +52,9 @@ @XmlRootElement(name = "root") // <.> @XmlType // <.> @XmlAccessorType(XmlAccessType.FIELD) // <.> +@Named("demo.StatefulVmUsingJaxb") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "demo.StatefulVmUsingJaxb" -) + nature=Nature.VIEW_MODEL) public class StatefulVmUsingJaxb implements HasAsciiDocDescription { @ObjectSupport public String title() { @@ -71,9 +71,9 @@ public class StatefulVmUsingJaxb implements HasAsciiDocDescription { @XmlRootElement @XmlType @XmlAccessorType(XmlAccessType.FIELD) + @Named("demo.StatefulViewModelUsingJaxb.Child") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "demo.StatefulVmUsingJaxb.Child") + nature=Nature.VIEW_MODEL) @Data public static class Child { @Title diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeVm.java index d35025ec93d..9557031c48b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeVm.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.DomainObject; @@ -32,7 +33,8 @@ import demoapp.dom.domain.objects.other.embedded.persistence.NumberConstantEntity; // tag::class[] -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.EmbeddedTypeVm") +@Named("demo.EmbeddedTypeVm") +@DomainObject(nature=Nature.VIEW_MODEL) public class EmbeddedTypeVm implements HasAsciiDocDescription { // ... diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jdo/NumberConstantJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jdo/NumberConstantJdo.java index a57ef430419..2e8c0bab3c1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jdo/NumberConstantJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jdo/NumberConstantJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.other.embedded.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,7 +43,8 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo" ) @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject(logicalTypeName = "demo.NumberConstantEntity") +@Named("demo.NumberConstantEntity") +@DomainObject public class NumberConstantJdo extends NumberConstantEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jpa/NumberConstantJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jpa/NumberConstantJpa.java index d0b7e7f0193..fc7af7e6965 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jpa/NumberConstantJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jpa/NumberConstantJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.other.embedded.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,7 +48,8 @@ name = "NumberConstantJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject(logicalTypeName = "demo.NumberConstantEntity") +@Named("demo.NumberConstantEntity") +@DomainObject @NoArgsConstructor public class NumberConstantJpa extends NumberConstantEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/persistence/NumberConstantEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/persistence/NumberConstantEntity.java index 9352ec82695..0a48f4f8987 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/persistence/NumberConstantEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/persistence/NumberConstantEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.domain.objects.other.embedded.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.domain.objects.other.embedded.ComplexNumber; -@DomainObject( - logicalTypeName = "demo.NumberConstantEntity" // shared permissions with concrete sub class -) +@Named("demo.NumberConstantEntity") // shared permissions with concrete sub class +@DomainObject public abstract class NumberConstantEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/CountHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/CountHolder.java index 08df39ec6e0..19eac8b43dc 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/CountHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/CountHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.domain.objects.other.mixins; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.CountHolder") +@Named("demo.CountHolder") //tag::class[] public interface CountHolder { int getCount(); diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/FibonacciNumberVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/FibonacciNumberVm.java index 37f3acc3d3d..2cad9d5f56e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/FibonacciNumberVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/FibonacciNumberVm.java @@ -18,6 +18,8 @@ */ package demoapp.dom.domain.objects.other.mixins; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Editing; import org.apache.isis.applib.annotation.Nature; @@ -30,12 +32,10 @@ import lombok.NoArgsConstructor; import lombok.Setter; - +@Named("demo.FibonacciNumberVm") @DomainObject( nature=Nature.VIEW_MODEL, - editing = Editing.DISABLED, - logicalTypeName = "demo.FibonacciNumberVm" -) + editing = Editing.DISABLED) @NoArgsConstructor @AllArgsConstructor(staticName = "of") public class FibonacciNumberVm { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/MixinVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/MixinVm.java index c314ceb7a55..2e6680a6a1c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/MixinVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/mixins/MixinVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.objects.other.mixins; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -38,7 +39,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.MixinVm") +@Named("demo.MixinVm") +@DomainObject(nature=Nature.VIEW_MODEL) public class MixinVm implements HasAsciiDocDescription, CountHolder { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/PropertyCommandPublishingEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/PropertyCommandPublishingEntity.java index 80a17f83621..8346b70275c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/PropertyCommandPublishingEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/PropertyCommandPublishingEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.domain.properties.Property.commandPublishing; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.domain._commands.ExposePersistedCommands; -@DomainObject( - logicalTypeName = "demo.PropertyCommandPublishingEntity" // shared permissions with concrete sub class -) +@Named("demo.PropertyCommandPublishingEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PropertyCommandPublishingEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jdo/PropertyCommandPublishingJdo-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jdo/PropertyCommandPublishingJdo-description.adoc index a334239cfab..33c6d803b7a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jdo/PropertyCommandPublishingJdo-description.adoc +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jdo/PropertyCommandPublishingJdo-description.adoc @@ -73,7 +73,7 @@ include::PropertyCommandPublishingJdo.java[tags=meta-annotation-overridden] == CommandSubscriber -The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension, so every command is persisted. +The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/commandlog/about.html[Command Log] extension, so every command is persisted. These can be viewed in the collection at the bottom of the left page. xref:refguide:applib:index/services/command/Command.adoc[Command]s are persisted after the page rendering phase, so to view a just-persisted command, refresh the page. @@ -99,9 +99,9 @@ In other words actions are reified to commands except for those that don't chang == Command Replay -The link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension provides an implementation of `CommandServiceListener` to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be persisted. +The link:https://isis.apache.org/extensions/2.0.0-M3/commandlog/about.html[Command Log] extension provides an implementation of `CommandServiceListener` to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be persisted. It also provides a RESTful endpoint to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be queried. -This is used by the link:https://isis.apache.org/extensions/2.0.0-M3/command-replay/about.html[Command Replay] extension to allow commands to be replayed on a secondary system, for regression testing. +This is used by the link:https://isis.apache.org/extensions/2.0.0-M3/commandreplay/about.html[Command Replay] extension to allow commands to be replayed on a secondary system, for regression testing. The associated `commandDtoProcessor()` element allows the xref:refguide:applib:index/services/command/Command.adoc[Command] XML representation (as a `CommandDto`) to be processed before being surfaced through the REST endpoint. One use case is to allow data to be obfuscated for security, or to replace large payloads (such as Blobs) with a smaller dummy payload. @@ -116,10 +116,10 @@ This activates the `application-secondary.properties` configuration file: [source,properties] ---- -isis.extensions.command-replay.primary-access.base-url-restful=http://localhost:8080/restful/ -isis.extensions.command-replay.primary-access.user=sven -isis.extensions.command-replay.primary-access.password=pass -isis.extensions.command-replay.primary-access.base-url-wicket=http://localhost:8080/wicket/ +isis.extensions.commandreplay.primary-access.base-url-restful=http://localhost:8080/restful/ +isis.extensions.commandreplay.primary-access.user=sven +isis.extensions.commandreplay.primary-access.password=pass +isis.extensions.commandreplay.primary-access.base-url-wicket=http://localhost:8080/wicket/ server.port=9090 ---- diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jdo/PropertyCommandPublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jdo/PropertyCommandPublishingJdo.java index 84e5f2e3f10..6f445df227f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jdo/PropertyCommandPublishingJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jdo/PropertyCommandPublishingJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.commandPublishing.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -44,9 +45,9 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.PropertyCommandPublishingEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.PropertyCommandPublishingEntity" , editing = Editing.ENABLED ) public class PropertyCommandPublishingJdo diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jpa/PropertyCommandPublishingJpa-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jpa/PropertyCommandPublishingJpa-description.adoc index c3cdfa8b31d..886f57c841b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jpa/PropertyCommandPublishingJpa-description.adoc +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jpa/PropertyCommandPublishingJpa-description.adoc @@ -73,7 +73,7 @@ include::PropertyCommandPublishingJpa.java[tags=meta-annotation-overridden] == CommandSubscriber -The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension, so every command is persisted. +The demo includes the link:https://isis.apache.org/extensions/2.0.0-M3/commandlog/about.html[Command Log] extension, so every command is persisted. These can be viewed in the collection at the bottom of the left page. xref:refguide:applib:index/services/command/Command.adoc[Command]s are persisted after the page rendering phase, so to view a just-persisted command, refresh the page. @@ -99,9 +99,9 @@ In other words actions are reified to commands except for those that don't chang == Command Replay -The link:https://isis.apache.org/extensions/2.0.0-M3/command-log/about.html[Command Log] extension provides an implementation of `CommandServiceListener` to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be persisted. +The link:https://isis.apache.org/extensions/2.0.0-M3/commandlog/about.html[Command Log] extension provides an implementation of `CommandServiceListener` to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be persisted. It also provides a RESTful endpoint to allow xref:refguide:applib:index/services/command/Command.adoc[Command]s to be queried. -This is used by the link:https://isis.apache.org/extensions/2.0.0-M3/command-replay/about.html[Command Replay] extension to allow commands to be replayed on a secondary system, for regression testing. +This is used by the link:https://isis.apache.org/extensions/2.0.0-M3/commandreplay/about.html[Command Replay] extension to allow commands to be replayed on a secondary system, for regression testing. The associated `commandDtoProcessor()` element allows the xref:refguide:applib:index/services/command/Command.adoc[Command] XML representation (as a `CommandDto`) to be processed before being surfaced through the REST endpoint. One use case is to allow data to be obfuscated for security, or to replace large payloads (such as Blobs) with a smaller dummy payload. @@ -116,10 +116,10 @@ This activates the `application-secondary.properties` configuration file: [source,properties] ---- -isis.extensions.command-replay.primary-access.base-url-restful=http://localhost:8080/restful/ -isis.extensions.command-replay.primary-access.user=sven -isis.extensions.command-replay.primary-access.password=pass -isis.extensions.command-replay.primary-access.base-url-wicket=http://localhost:8080/wicket/ +isis.extensions.commandreplay.primary-access.base-url-restful=http://localhost:8080/restful/ +isis.extensions.commandreplay.primary-access.user=sven +isis.extensions.commandreplay.primary-access.password=pass +isis.extensions.commandreplay.primary-access.base-url-wicket=http://localhost:8080/wicket/ server.port=9090 ---- diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jpa/PropertyCommandPublishingJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jpa/PropertyCommandPublishingJpa.java index 0b63dc605a3..5396164afd5 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jpa/PropertyCommandPublishingJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/commandPublishing/jpa/PropertyCommandPublishingJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.commandPublishing.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -50,10 +51,9 @@ name = "PropertyCommandPublishingJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.PropertyCommandPublishingEntity") @DomainObject( - logicalTypeName = "demo.PropertyCommandPublishingEntity" - , editing = Editing.ENABLED -) + editing = Editing.ENABLED) @NoArgsConstructor public class PropertyCommandPublishingJpa extends PropertyCommandPublishingEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.java index 7c81bc7a23a..a75122c6c46 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/domainEvent/PropertyDomainEventVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.domainEvent; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,11 +42,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyDomainEventVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyDomainEventVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) @NoArgsConstructor //tag::class[] public class PropertyDomainEventVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.java index 5a6b49c9357..739dc6c6ef3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/editing/PropertyEditingVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.editing; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,9 +41,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyEditingVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyEditingVm", editing = Editing.DISABLED // <.> ) public class PropertyEditingVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/PropertyExecutionPublishingEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/PropertyExecutionPublishingEntity.java index 8bf322ae933..ee1bf086be9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/PropertyExecutionPublishingEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/PropertyExecutionPublishingEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.domain.properties.Property.executionPublishing; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.domain._interactions.ExposeCapturedInteractions; -@DomainObject( - logicalTypeName = "demo.PropertyExecutionPublishingEntity" // shared permissions with concrete sub class -) +@Named("demo.PropertyExecutionPublishingEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PropertyExecutionPublishingEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/jdo/PropertyExecutionPublishingJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/jdo/PropertyExecutionPublishingJdo.java index d994db73f32..af4996a9546 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/jdo/PropertyExecutionPublishingJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/jdo/PropertyExecutionPublishingJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.executionPublishing.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -45,11 +46,10 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.PropertyExecutionPublishingEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.PropertyExecutionPublishingEntity" - , editing = Editing.ENABLED -) + , editing = Editing.ENABLED) public class PropertyExecutionPublishingJdo extends PropertyExecutionPublishingEntity { // ... diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/jpa/PropertyExecutionPublishingJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/jpa/PropertyExecutionPublishingJpa.java index efba97e0ef8..f4e9542751c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/jpa/PropertyExecutionPublishingJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/executionPublishing/jpa/PropertyExecutionPublishingJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.executionPublishing.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -51,10 +52,9 @@ name = "PropertyExecutionPublishingJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.PropertyExecutionPublishingEntity") @DomainObject( - logicalTypeName = "demo.PropertyExecutionPublishingEntity" - , editing = Editing.ENABLED -) + editing = Editing.ENABLED) @NoArgsConstructor public class PropertyExecutionPublishingJpa extends PropertyExecutionPublishingEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.java index 974a8059db3..505c422543d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/fileAccept/PropertyFileAcceptVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.fileAccept; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,11 +43,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyFileAcceptVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyFileAcceptVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyFileAcceptVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenVm.java index 5c566a7cbef..82661917a42 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/PropertyHiddenVm.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -48,11 +49,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyHiddenVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyHiddenVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) @NoArgsConstructor public class PropertyHiddenVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.java index 88afb91ae39..1a65f0aea63 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/hidden/child/PropertyHiddenChildVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.hidden.child; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -43,10 +44,9 @@ @XmlRootElement(name = "child") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyHiddenChildVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyHiddenChildVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class PropertyHiddenChildVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/maxLength/PropertyMaxLengthVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/maxLength/PropertyMaxLengthVm.java index 2c6491b4233..88ba23fc8a2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/maxLength/PropertyMaxLengthVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/maxLength/PropertyMaxLengthVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.maxLength; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,11 +41,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyMaxLengthVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyMaxLengthVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyMaxLengthVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/mustSatisfy/PropertyMustSatisfyVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/mustSatisfy/PropertyMustSatisfyVm.java index fdf1923eda9..ebb624552c8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/mustSatisfy/PropertyMustSatisfyVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/mustSatisfy/PropertyMustSatisfyVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.mustSatisfy; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,11 +41,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyMustSatisfyVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyMustSatisfyVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyMustSatisfyVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/optionality/PropertyOptionalityVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/optionality/PropertyOptionalityVm.java index 84914788f0f..160eca13b54 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/optionality/PropertyOptionalityVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/optionality/PropertyOptionalityVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.optionality; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,11 +42,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyOptionalityVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyOptionalityVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyOptionalityVm implements HasAsciiDocDescription { // ... //end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/PropertyProjectingVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/PropertyProjectingVm.java index a0d5aa60934..64f6fcc6d96 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/PropertyProjectingVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/PropertyProjectingVm.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyProjectingVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyProjectingVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) @NoArgsConstructor public class PropertyProjectingVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/child/PropertyProjectingChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/child/PropertyProjectingChildVm.java index b7086b8207c..da6a916648b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/child/PropertyProjectingChildVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/child/PropertyProjectingChildVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.projecting.child; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -46,10 +47,9 @@ @XmlRootElement(name = "child") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyProjectingChildVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyProjectingChildVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class PropertyProjectingChildVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/jdo/PropertyProjectingChildJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/jdo/PropertyProjectingChildJdo.java index 1de2b5879a2..e833e8c7bf9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/jdo/PropertyProjectingChildJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/jdo/PropertyProjectingChildJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.projecting.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -42,9 +43,9 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.PropertyProjectingChildJdo") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.PropertyProjectingChildJdo" , editing = Editing.DISABLED ) @XmlJavaTypeAdapter(PersistentEntityAdapter.class) diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/jpa/PropertyProjectingChildJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/jpa/PropertyProjectingChildJpa.java index b946d0919e0..63573420177 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/jpa/PropertyProjectingChildJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/jpa/PropertyProjectingChildJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.projecting.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -48,10 +49,9 @@ name = "PropertyProjectingChildJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.PropertyProjectingChildJpa") @DomainObject( - logicalTypeName = "demo.PropertyProjectingChildJpa" - , editing = Editing.DISABLED -) + editing = Editing.DISABLED) @XmlJavaTypeAdapter(PersistentEntityAdapter.class) @NoArgsConstructor public class PropertyProjectingChildJpa diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/persistence/PropertyProjectingChildEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/persistence/PropertyProjectingChildEntity.java index fdd373f2659..01be2c01513 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/persistence/PropertyProjectingChildEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/projecting/persistence/PropertyProjectingChildEntity.java @@ -18,14 +18,15 @@ */ package demoapp.dom.domain.properties.Property.projecting.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; -@DomainObject( - logicalTypeName = "demo.PropertyProjectingChildEntity" // shared permissions with concrete sub class -) +@Named("demo.PropertyProjectingChildEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PropertyProjectingChildEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/regexPattern/PropertyRegexPatternVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/regexPattern/PropertyRegexPatternVm.java index 03a935b1bd1..2e481c6518f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/regexPattern/PropertyRegexPatternVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/regexPattern/PropertyRegexPatternVm.java @@ -20,6 +20,7 @@ import java.util.regex.Pattern; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,11 +43,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyRegexPatternVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyRegexPatternVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyRegexPatternVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/snapshot/PropertySnapshotVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/snapshot/PropertySnapshotVm.java index 302e1d3370d..c07ed86194d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/snapshot/PropertySnapshotVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/Property/snapshot/PropertySnapshotVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.Property.snapshot; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,11 +42,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertySnapshotVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertySnapshotVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) @NoArgsConstructor public class PropertySnapshotVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java index 159811dd9ef..e95d20d7e2a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/cssClass/PropertyLayoutCssClassVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.PropertyLayout.cssClass; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,11 +42,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutCssClassVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutCssClassVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyLayoutCssClassVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/describedAs/PropertyLayoutDescribedAsVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/describedAs/PropertyLayoutDescribedAsVm.java index c1732e4fc57..5f9ebf69446 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/describedAs/PropertyLayoutDescribedAsVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/describedAs/PropertyLayoutDescribedAsVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.PropertyLayout.describedAs; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,11 +42,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutDescribedAsVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutDescribedAsVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyLayoutDescribedAsVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/hidden/PropertyLayoutHiddenVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/hidden/PropertyLayoutHiddenVm.java index e494a7c82b1..b61dcc5d1bf 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/hidden/PropertyLayoutHiddenVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/hidden/PropertyLayoutHiddenVm.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -49,11 +50,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutHiddenVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutHiddenVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) @NoArgsConstructor public class PropertyLayoutHiddenVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/hidden/child/PropertyLayoutHiddenChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/hidden/child/PropertyLayoutHiddenChildVm.java index 7d1ed002cc7..0da0256b4eb 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/hidden/child/PropertyLayoutHiddenChildVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/hidden/child/PropertyLayoutHiddenChildVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.PropertyLayout.hidden.child; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,10 +45,9 @@ @XmlRootElement(name = "child") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutHiddenChildVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutHiddenChildVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class PropertyLayoutHiddenChildVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionVm.java index c011807207d..679c9aa6971 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/labelPosition/PropertyLayoutLabelPositionVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.PropertyLayout.labelPosition; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,11 +43,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutLabelPositionVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutLabelPositionVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyLayoutLabelPositionVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/multiLine/PropertyLayoutMultiLineVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/multiLine/PropertyLayoutMultiLineVm.java index d333177a07f..02d5e1a36a8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/multiLine/PropertyLayoutMultiLineVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/multiLine/PropertyLayoutMultiLineVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.PropertyLayout.multiLine; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,11 +42,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutMultiLineVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutMultiLineVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyLayoutMultiLineVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm.java index 4216da126ab..9c01b62ad51 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/named/PropertyLayoutNamedVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.PropertyLayout.named; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,11 +42,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutNamedVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutNamedVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyLayoutNamedVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/navigable/FileNodeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/navigable/FileNodeVm.java index 995d4cca26c..d7d348390c2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/navigable/FileNodeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/navigable/FileNodeVm.java @@ -21,6 +21,7 @@ import java.io.File; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlRootElement; import org.apache.isis.applib.annotation.DomainObject; @@ -42,7 +43,8 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; @XmlRootElement(name="FileNode") -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.FileNode") +@Named("demo.FileNode") +@DomainObject(nature=Nature.VIEW_MODEL) @ToString @NoArgsConstructor public class FileNodeVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/renderDay/PropertyLayoutRenderDayVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/renderDay/PropertyLayoutRenderDayVm.java index cd9356d31f4..84b31612847 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/renderDay/PropertyLayoutRenderDayVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/renderDay/PropertyLayoutRenderDayVm.java @@ -20,6 +20,7 @@ import java.time.LocalDate; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -37,20 +38,20 @@ import org.apache.isis.applib.annotation.RenderDay; import org.apache.isis.applib.jaxb.JavaTimeJaxbAdapters; -import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; + //tag::class[] @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutRenderDayVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutRenderDayVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) @NoArgsConstructor public class PropertyLayoutRenderDayVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/repainting/PropertyLayoutRepaintingVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/repainting/PropertyLayoutRepaintingVm.java index bdc1e67a965..a3cf5ce74da 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/repainting/PropertyLayoutRepaintingVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/repainting/PropertyLayoutRepaintingVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.PropertyLayout.repainting; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,10 +45,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutRepaintingVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutRepaintingVm" -) + nature=Nature.VIEW_MODEL) public class PropertyLayoutRepaintingVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/typicalLength/PropertyLayoutTypicalLengthVm.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/typicalLength/PropertyLayoutTypicalLengthVm.java index 822f742e36a..2474732d2a8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/typicalLength/PropertyLayoutTypicalLengthVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/properties/PropertyLayout/typicalLength/PropertyLayoutTypicalLengthVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.domain.properties.PropertyLayout.typicalLength; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -41,11 +42,10 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PropertyLayoutTypicalLengthVm") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PropertyLayoutTypicalLengthVm", - editing = Editing.ENABLED -) + editing = Editing.ENABLED) public class PropertyLayoutTypicalLengthVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/featured/customui/vm/WhereInTheWorldVm.java b/examples/demo/domain/src/main/java/demoapp/dom/featured/customui/vm/WhereInTheWorldVm.java index f079846c2f7..e403abb9ff3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/featured/customui/vm/WhereInTheWorldVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/featured/customui/vm/WhereInTheWorldVm.java @@ -20,6 +20,7 @@ import java.io.Serializable; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -41,8 +42,12 @@ @XmlRootElement(name = "demo.CustomUiVm") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.CustomUiVm") -public class WhereInTheWorldVm implements HasAsciiDocDescription, Serializable { +@Named("demo.CustomUiVm") +@DomainObject(nature=Nature.VIEW_MODEL) +public class WhereInTheWorldVm +implements HasAsciiDocDescription, Serializable { + + private static final long serialVersionUID = 1L; @Title @Getter @Setter diff --git a/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/describedAs/DescribedAsVm.java b/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/describedAs/DescribedAsVm.java index e2aaa7d7846..0ab2d124ab7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/describedAs/DescribedAsVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/describedAs/DescribedAsVm.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -57,7 +58,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.Tooltip") +@Named("demo.Tooltip") +@DomainObject(nature=Nature.VIEW_MODEL) public class DescribedAsVm implements HasAsciiDocDescription { @XmlTransient diff --git a/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/tabs/TabDemo.java b/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/tabs/TabDemo.java index e1036969fab..3e51919374f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/tabs/TabDemo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/featured/layout/tabs/TabDemo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.featured.layout.tabs; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -39,7 +40,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.Tab") +@Named("demo.Tab") +@DomainObject(nature=Nature.VIEW_MODEL) public class TabDemo implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/homepage/DemoHomePage.java b/examples/demo/domain/src/main/java/demoapp/dom/homepage/DemoHomePage.java index 0936aebdbfc..9dc76956b92 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/homepage/DemoHomePage.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/homepage/DemoHomePage.java @@ -19,6 +19,7 @@ package demoapp.dom.homepage; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.HomePage; @@ -31,10 +32,9 @@ import demoapp.dom._infra.resources.AsciiDocReaderService; //tag::class[] +@Named("demo.Homepage") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.Homepage" -) + nature=Nature.VIEW_MODEL) @HomePage // <.> public class DemoHomePage implements HasAsciiDocDescription { // <.> diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/errorreportingservice/ErrorReportingServiceDemoVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/errorreportingservice/ErrorReportingServiceDemoVm.java index af2570974d4..fde4f2ac986 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/errorreportingservice/ErrorReportingServiceDemoVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/errorreportingservice/ErrorReportingServiceDemoVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.services.core.errorreportingservice; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -35,7 +36,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.ErrorReportingServiceDemoVm", editing=Editing.ENABLED) +@Named("demo.ErrorReportingServiceDemoVm") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) public class ErrorReportingServiceDemoVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventBusServiceDemoVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventBusServiceDemoVm.java index e515a9aa3c3..c54caabf664 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventBusServiceDemoVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventBusServiceDemoVm.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.ViewModel; import org.apache.isis.applib.annotation.Action; @@ -34,7 +35,8 @@ import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.EventBusServiceDemoVm") +@Named("demo.EventBusServiceDemoVm") +@DomainObject(nature=Nature.VIEW_MODEL) public class EventBusServiceDemoVm implements HasAsciiDocDescription { @Inject private EventLogEntryRepository eventLogEntryRepository; @@ -49,7 +51,8 @@ public List getAllEvents(){ return eventLogEntryRepository.listAll(); } - @DomainObject(nature = Nature.VIEW_MODEL, logicalTypeName = "demo.EventBusServiceDemoVm.UiButtonEvent") + @Named("demo.EventBusServiceDemoVm.UiButtonEvent") + @DomainObject(nature = Nature.VIEW_MODEL) public static class UiButtonEvent implements ViewModel { // -- VIEWMODEL CONTRACT public UiButtonEvent(final String memento) { } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntry.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntry.java index 257222bc14e..cda5c469016 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntry.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntry.java @@ -18,10 +18,13 @@ */ package demoapp.dom.services.core.eventbusservice; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.ObjectSupport; -@DomainObject(logicalTypeName = "demo.EventLogEntry") +@Named("demo.EventLogEntry") +@DomainObject public abstract class EventLogEntry { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJdo.java index da87c122a36..3b4888a0661 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJdo.java @@ -21,6 +21,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -43,7 +44,8 @@ @Profile("demo-jdo") @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo" ) @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject(logicalTypeName = "demo.EventLogEntry") +@Named("demo.EventLogEntry") +@DomainObject public class EventLogEntryJdo extends EventLogEntry { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJpa.java index 8fd58fe877a..8965387456d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventLogEntryJpa.java @@ -21,6 +21,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @@ -41,7 +42,8 @@ @Profile("demo-jpa") @Entity -@DomainObject(logicalTypeName = "demo.EventLogEntry") +@Named("demo.EventLogEntry") +@DomainObject public class EventLogEntryJpa extends EventLogEntry { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventSubscriberDemoImplementation.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventSubscriberDemoImplementation.java index d413bccfbd5..5a9525b09c8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventSubscriberDemoImplementation.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/eventbusservice/EventSubscriberDemoImplementation.java @@ -61,9 +61,9 @@ public void on(final UiButtonEvent event) { } + @Named("demo.eventLogWriter") @DomainObject( - nature = Nature.BEAN, // <-- have this Object's lifecycle managed by Spring - logicalTypeName = "demo.eventLogWriter") + nature = Nature.BEAN) // <-- have this Object's lifecycle managed by Spring public static class EventLogWriter { @Inject private EventLogEntryRepository eventLogEntryRepository; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/messageservice/MessageServiceDemoVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/messageservice/MessageServiceDemoVm.java index a9c3113812c..4679a217aa4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/messageservice/MessageServiceDemoVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/messageservice/MessageServiceDemoVm.java @@ -19,18 +19,20 @@ package demoapp.dom.services.core.messageservice; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.Action; import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.ActionLayout.Position; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; import org.apache.isis.applib.annotation.ObjectSupport; -import org.apache.isis.applib.annotation.ActionLayout.Position; import org.apache.isis.applib.services.message.MessageService; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.MessageServiceDemoVm") +@Named("demo.MessageServiceDemoVm") +@DomainObject(nature=Nature.VIEW_MODEL) public class MessageServiceDemoVm implements HasAsciiDocDescription { @Inject private MessageService messageService; diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/WrapperFactoryEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/WrapperFactoryEntity.java index d04fb95679f..60ee9d34ee4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/WrapperFactoryEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/WrapperFactoryEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.services.core.wrapperFactory; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.domain._commands.ExposePersistedCommands; -@DomainObject( - logicalTypeName = "demo.WrapperFactoryEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperFactoryEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperFactoryEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/jdo/WrapperFactoryJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/jdo/WrapperFactoryJdo.java index 5f658167156..7f7d0ca9d97 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/jdo/WrapperFactoryJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/jdo/WrapperFactoryJdo.java @@ -19,6 +19,7 @@ package demoapp.dom.services.core.wrapperFactory.jdo; import javax.inject.Inject; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -51,9 +52,9 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") +@Named("demo.WrapperFactoryEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.WrapperFactoryEntity" , editing = Editing.DISABLED ) public class WrapperFactoryJdo diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/jpa/WrapperFactoryJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/jpa/WrapperFactoryJpa.java index 87c9ffacfd1..e3d6ab114b1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/jpa/WrapperFactoryJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/wrapperFactory/jpa/WrapperFactoryJpa.java @@ -19,6 +19,7 @@ package demoapp.dom.services.core.wrapperFactory.jpa; import javax.inject.Inject; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -58,9 +59,9 @@ name = "WrapperFactoryJpa" ) @EntityListeners(IsisEntityListener.class) +@Named("demo.WrapperFactoryEntity") @DomainObject( nature=Nature.ENTITY - , logicalTypeName = "demo.WrapperFactoryEntity" , editing = Editing.DISABLED ) @NoArgsConstructor diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm.java index 14aecb0826a..26c618b08bf 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/XmlSnapshotParentVm.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -48,10 +49,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.XmlSnapshotParentVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.XmlSnapshotParentVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class XmlSnapshotParentVm implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/child/XmlSnapshotChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/child/XmlSnapshotChildVm.java index b75d3319812..92754bad649 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/child/XmlSnapshotChildVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/child/XmlSnapshotChildVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.services.core.xmlSnapshotService.child; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,14 +41,13 @@ @XmlRootElement(name = "child") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.XmlSnapshotChildVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.XmlSnapshotChildVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class XmlSnapshotChildVm implements HasAsciiDocDescription { - public XmlSnapshotChildVm(String value) { + public XmlSnapshotChildVm(final String value) { setValue(value); } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/peer/XmlSnapshotPeerVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/peer/XmlSnapshotPeerVm.java index 9a65e772188..671c484bb4b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/peer/XmlSnapshotPeerVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/peer/XmlSnapshotPeerVm.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -47,14 +48,13 @@ @XmlRootElement(name = "peer") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.XmlSnapshotPeerVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.XmlSnapshotPeerVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class XmlSnapshotPeerVm implements HasAsciiDocDescription { - public XmlSnapshotPeerVm(String value) { + public XmlSnapshotPeerVm(final String value) { setValue(value); } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/peer/child/XmlSnapshotPeerChildVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/peer/child/XmlSnapshotPeerChildVm.java index c517e55f133..f3e1f0ce562 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/peer/child/XmlSnapshotPeerChildVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/core/xmlSnapshotService/peer/child/XmlSnapshotPeerChildVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.services.core.xmlSnapshotService.peer.child; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -40,14 +41,13 @@ @XmlRootElement(name = "child") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.XmlSnapshotPeerChildVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.XmlSnapshotPeerChildVm" -) + nature=Nature.VIEW_MODEL) @NoArgsConstructor public class XmlSnapshotPeerChildVm implements HasAsciiDocDescription { - public XmlSnapshotPeerChildVm(String value) { + public XmlSnapshotPeerChildVm(final String value) { setValue(value); } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/AppTenancyVm.java b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/AppTenancyVm.java index c9cfa5bbef9..ce24d9d538b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/AppTenancyVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/AppTenancyVm.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -45,10 +46,9 @@ @XmlRootElement(name = "root") @XmlType() @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.SecManVm") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "demo.SecManVm" -) + nature=Nature.VIEW_MODEL) public class AppTenancyVm implements HasAsciiDocDescription { @ObjectSupport public String title() { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/jdo/TenantedJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/jdo/TenantedJdo.java index 9b3ed2a9f39..305367e0c8f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/jdo/TenantedJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/jdo/TenantedJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.services.extensions.secman.apptenancy.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -44,9 +45,8 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo" ) @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.TenantedEntity" -) +@Named("demo.TenantedEntity") +@DomainObject public class TenantedJdo extends TenantedEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/jpa/TenantedJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/jpa/TenantedJpa.java index 4404c61a6eb..baeffd8b82b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/jpa/TenantedJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/jpa/TenantedJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.services.extensions.secman.apptenancy.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -51,9 +52,8 @@ name = "TenantedJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.TenantedEntity" -) +@Named("demo.TenantedEntity") +@DomainObject @NoArgsConstructor public class TenantedJpa extends TenantedEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/persistence/TenantedEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/persistence/TenantedEntity.java index 65c238ce2d5..c498b9d68d4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/persistence/TenantedEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/services/extensions/secman/apptenancy/persistence/TenantedEntity.java @@ -18,13 +18,14 @@ */ package demoapp.dom.services.extensions.secman.apptenancy.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.values.ValueHolder; -@DomainObject( - logicalTypeName = "demo.TenantedEntity" // shared permissions with concrete sub class -) +@Named("demo.TenantedEntity") // shared permissions with concrete sub class +@DomainObject public abstract class TenantedEntity implements ValueHolder{ diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/IsisBlobs.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/IsisBlobs.java index 9fbdccea591..3d56d52fa82 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/IsisBlobs.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/IsisBlobs.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.IsisBlobs", editing=Editing.ENABLED) +@Named("demo.IsisBlobs") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class IsisBlobs implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/holder/IsisBlobHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/holder/IsisBlobHolder.java index ede24fa96a6..5e530fe2f85 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/holder/IsisBlobHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/holder/IsisBlobHolder.java @@ -18,10 +18,11 @@ */ package demoapp.dom.types.isis.blobs.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.value.Blob; -@LogicalTypeName("demo.IsisBlobHolder") +@Named("demo.IsisBlobHolder") //tag::class[] public interface IsisBlobHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdo.java index 5cd686decfa..fc59e20ce55 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jdo/IsisBlobJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.blobs.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -44,14 +45,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.IsisBlobEntity" -) +@Named("demo.IsisBlobEntity") +@DomainObject public class IsisBlobJdo // <.> extends IsisBlobEntity { //end::class[] - public IsisBlobJdo(Blob initialValue) { + public IsisBlobJdo(final Blob initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jpa/IsisBlobJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jpa/IsisBlobJpa.java index 97bb10ce7a5..7db185115f9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jpa/IsisBlobJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/jpa/IsisBlobJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.blobs.jpa; +import javax.inject.Named; import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; @@ -52,15 +53,14 @@ name = "IsisBlobJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.IsisBlobEntity" -) +@Named("demo.IsisBlobEntity") +@DomainObject @NoArgsConstructor public class IsisBlobJpa extends IsisBlobEntity { //end::class[] - public IsisBlobJpa(Blob initialValue) { + public IsisBlobJpa(final Blob initialValue) { setReadOnlyProperty(initialValue); setReadWriteProperty(initialValue); } @@ -78,11 +78,13 @@ public IsisBlobJpa(Blob initialValue) { @Embedded private BlobJpaEmbeddable readOnlyProperty; + @Override @Title(prepend = "Blob JPA entity: ") @PropertyLayout(fieldSetId = "read-only-properties", sequence = "1") public Blob getReadOnlyProperty() { return BlobJpaEmbeddable.toBlob(readOnlyProperty); } + @Override public void setReadOnlyProperty(final Blob readOnlyProperty) { this.readOnlyProperty = BlobJpaEmbeddable.fromBlob(readOnlyProperty); } @@ -95,12 +97,14 @@ public void setReadOnlyProperty(final Blob readOnlyProperty) { @Embedded private BlobJpaEmbeddable readWriteProperty; + @Override @Property(editing = Editing.ENABLED) // <.> @PropertyLayout(fieldSetId = "editable-properties", sequence = "1") public Blob getReadWriteProperty() { return BlobJpaEmbeddable.toBlob(readWriteProperty); } + @Override public void setReadWriteProperty(final Blob readWriteProperty) { this.readWriteProperty = BlobJpaEmbeddable.fromBlob(readWriteProperty); } @@ -113,12 +117,14 @@ public void setReadWriteProperty(final Blob readWriteProperty) { @Embedded private BlobJpaEmbeddable readOnlyOptionalProperty; + @Override @Property(optionality = Optionality.OPTIONAL) // <.> @PropertyLayout(fieldSetId = "optional-properties", sequence = "1") public Blob getReadOnlyOptionalProperty() { return BlobJpaEmbeddable.toBlob(readOnlyOptionalProperty); } + @Override public void setReadOnlyOptionalProperty(final Blob readOnlyOptionalProperty) { this.readOnlyOptionalProperty = BlobJpaEmbeddable.fromBlob(readOnlyOptionalProperty); } @@ -132,12 +138,14 @@ public void setReadOnlyOptionalProperty(final Blob readOnlyOptionalProperty) { @Embedded private BlobJpaEmbeddable readWriteOptionalProperty; + @Override @Property(editing = Editing.ENABLED, optionality = Optionality.OPTIONAL) @PropertyLayout(fieldSetId = "optional-properties", sequence = "2") public Blob getReadWriteOptionalProperty() { return BlobJpaEmbeddable.toBlob(readWriteOptionalProperty); } + @Override public void setReadWriteOptionalProperty(final Blob readWriteOptionalProperty) { this.readWriteOptionalProperty = BlobJpaEmbeddable.fromBlob(readWriteOptionalProperty); } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/persistence/IsisBlobEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/persistence/IsisBlobEntity.java index a7261028872..fa801602070 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/persistence/IsisBlobEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/persistence/IsisBlobEntity.java @@ -18,6 +18,8 @@ */ package demoapp.dom.types.isis.blobs.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.value.Blob; @@ -25,9 +27,8 @@ import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.isis.blobs.holder.IsisBlobHolder2; -@DomainObject( - logicalTypeName = "demo.IsisBlobEntity" // shared permissions with concrete sub class -) +@Named("demo.IsisBlobEntity") // shared permissions with concrete sub class +@DomainObject public abstract class IsisBlobEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/vm/IsisBlobVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/vm/IsisBlobVm.java index 965af2364fd..491208b983f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/vm/IsisBlobVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/blobs/vm/IsisBlobVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.blobs.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -43,10 +44,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.IsisBlobVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.IsisBlobVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class IsisBlobVm implements HasAsciiDocDescription, IsisBlobHolder2 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/IsisClobs.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/IsisClobs.java index f42a3fd1fa6..f2357df3215 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/IsisClobs.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/IsisClobs.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.IsisClobs", editing=Editing.ENABLED) +@Named("demo.IsisClobs") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class IsisClobs implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/holder/IsisClobHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/holder/IsisClobHolder.java index f9340a8f97c..07051fde2b7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/holder/IsisClobHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/holder/IsisClobHolder.java @@ -18,10 +18,11 @@ */ package demoapp.dom.types.isis.clobs.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.value.Clob; -@LogicalTypeName("demo.IsisClobHolder") +@Named("demo.IsisClobHolder") //tag::class[] public interface IsisClobHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdo.java index a3b8ec043f9..75f16b53bbc 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jdo/IsisClobJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.clobs.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -44,14 +45,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.IsisClobEntity" -) +@Named("demo.IsisClobEntity") +@DomainObject public class IsisClobJdo // <.> extends IsisClobEntity { //end::class[] - public IsisClobJdo(Clob initialValue) { + public IsisClobJdo(final Clob initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jpa/IsisClobJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jpa/IsisClobJpa.java index 9e093423d91..4d974caa57d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jpa/IsisClobJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/jpa/IsisClobJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.clobs.jpa; +import javax.inject.Named; import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; @@ -52,9 +53,8 @@ name = "IsisClobJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.IsisClobEntity" -) +@Named("demo.IsisClobEntity") +@DomainObject @NoArgsConstructor public class IsisClobJpa extends IsisClobEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/persistence/IsisClobEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/persistence/IsisClobEntity.java index 99ebd5067b2..ec5437cb101 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/persistence/IsisClobEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/persistence/IsisClobEntity.java @@ -18,6 +18,8 @@ */ package demoapp.dom.types.isis.clobs.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.value.Clob; @@ -25,9 +27,8 @@ import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.isis.clobs.holder.IsisClobHolder2; -@DomainObject( - logicalTypeName = "demo.IsisClobEntity" // shared permissions with concrete sub class -) +@Named("demo.IsisClobEntity") // shared permissions with concrete sub class +@DomainObject public abstract class IsisClobEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/vm/IsisClobVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/vm/IsisClobVm.java index c59e9187abe..e19c30eecef 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/vm/IsisClobVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/clobs/vm/IsisClobVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.clobs.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -43,16 +44,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.IsisClobVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.IsisClobVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class IsisClobVm implements HasAsciiDocDescription, IsisClobHolder2 { //end::class[] - public IsisClobVm(Clob initialValue) { + public IsisClobVm(final Clob initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/IsisLocalResourcePaths.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/IsisLocalResourcePaths.java index 80b0243c55c..dc16e6cb7ab 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/IsisLocalResourcePaths.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/IsisLocalResourcePaths.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.IsisLocalResourcePaths", editing=Editing.ENABLED) +@Named("demo.IsisLocalResourcePaths") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class IsisLocalResourcePaths implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/holder/IsisLocalResourcePathHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/holder/IsisLocalResourcePathHolder.java index cece8207d44..292cae0e068 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/holder/IsisLocalResourcePathHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/holder/IsisLocalResourcePathHolder.java @@ -18,10 +18,11 @@ */ package demoapp.dom.types.isis.localresourcepaths.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.value.LocalResourcePath; -@LogicalTypeName("demo.IsisLocalResourcePathHolder") +@Named("demo.IsisLocalResourcePathHolder") //tag::class[] public interface IsisLocalResourcePathHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdo.java index ae00a3782ad..18459e95fd3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jdo/IsisLocalResourcePathJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.localresourcepaths.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -44,14 +45,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.IsisLocalResourcePathEntity" -) +@Named("demo.IsisLocalResourcePathEntity") +@DomainObject public class IsisLocalResourcePathJdo // <.> extends IsisLocalResourcePathEntity { //end::class[] - public IsisLocalResourcePathJdo(LocalResourcePath initialValue) { + public IsisLocalResourcePathJdo(final LocalResourcePath initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jpa/IsisLocalResourcePathJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jpa/IsisLocalResourcePathJpa.java index 168f81cf616..a9b5cc714e3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jpa/IsisLocalResourcePathJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/jpa/IsisLocalResourcePathJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.localresourcepaths.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -50,9 +51,8 @@ name = "IsisLocalResourcePathJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.IsisLocalResourcePathEntity" -) +@Named("demo.IsisLocalResourcePathEntity") +@DomainObject @NoArgsConstructor public class IsisLocalResourcePathJpa extends IsisLocalResourcePathEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/persistence/IsisLocalResourcePathEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/persistence/IsisLocalResourcePathEntity.java index 825f48d008a..9e80d7ee10d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/persistence/IsisLocalResourcePathEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/persistence/IsisLocalResourcePathEntity.java @@ -18,6 +18,8 @@ */ package demoapp.dom.types.isis.localresourcepaths.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.value.LocalResourcePath; @@ -25,9 +27,8 @@ import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.isis.localresourcepaths.holder.IsisLocalResourcePathHolder2; -@DomainObject( - logicalTypeName = "demo.IsisLocalResourcePathEntity" // shared permissions with concrete sub class -) +@Named("demo.IsisLocalResourcePathEntity") // shared permissions with concrete sub class +@DomainObject public abstract class IsisLocalResourcePathEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/vm/IsisLocalResourcePathVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/vm/IsisLocalResourcePathVm.java index 0edb39c0051..d7a250c54ec 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/vm/IsisLocalResourcePathVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/localresourcepaths/vm/IsisLocalResourcePathVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.localresourcepaths.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -43,16 +44,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.IsisLocalResourcePathVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.IsisLocalResourcePathVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class IsisLocalResourcePathVm implements HasAsciiDocDescription, IsisLocalResourcePathHolder2 { //end::class[] - public IsisLocalResourcePathVm(LocalResourcePath initialValue) { + public IsisLocalResourcePathVm(final LocalResourcePath initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/IsisMarkups.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/IsisMarkups.java index 4c8f1a4678c..b5c421baa30 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/IsisMarkups.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/IsisMarkups.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.IsisMarkups", editing=Editing.ENABLED) +@Named("demo.IsisMarkups") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class IsisMarkups implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/holder/IsisMarkupHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/holder/IsisMarkupHolder.java index b1b145665c8..f038114da6f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/holder/IsisMarkupHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/holder/IsisMarkupHolder.java @@ -18,10 +18,11 @@ */ package demoapp.dom.types.isis.markups.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.value.Markup; -@LogicalTypeName("demo.IsisMarkupHolder") +@Named("demo.IsisMarkupHolder") //tag::class[] public interface IsisMarkupHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdo.java index c82a1ac8b03..0a031379d65 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jdo/IsisMarkupJdo.java @@ -19,6 +19,7 @@ package demoapp.dom.types.isis.markups.jdo; import javax.inject.Inject; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -46,11 +47,10 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.IsisMarkupEntity" -) +@Named("demo.IsisMarkupEntity") +@DomainObject public class IsisMarkupJdo // <.> - extends IsisMarkupEntity { +extends IsisMarkupEntity { //end::class[] public IsisMarkupJdo(final Markup initialValue) { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jpa/IsisMarkupJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jpa/IsisMarkupJpa.java index cb130a7a964..456c7d7f9c4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jpa/IsisMarkupJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/jpa/IsisMarkupJpa.java @@ -19,6 +19,7 @@ package demoapp.dom.types.isis.markups.jpa; import javax.inject.Inject; +import javax.inject.Named; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; @@ -57,9 +58,8 @@ name = "IsisMarkupJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.IsisMarkupEntity" -) +@Named("demo.IsisMarkupEntity") +@DomainObject @NoArgsConstructor public class IsisMarkupJpa extends IsisMarkupEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/persistence/IsisMarkupEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/persistence/IsisMarkupEntity.java index f77474c9c15..5cb4ac665a7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/persistence/IsisMarkupEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/persistence/IsisMarkupEntity.java @@ -18,6 +18,8 @@ */ package demoapp.dom.types.isis.markups.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.value.Markup; @@ -25,9 +27,8 @@ import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.isis.markups.holder.IsisMarkupHolder2; -@DomainObject( - logicalTypeName = "demo.IsisMarkupEntity" // shared permissions with concrete sub class -) +@Named("demo.IsisMarkupEntity") // shared permissions with concrete sub class +@DomainObject public abstract class IsisMarkupEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/vm/IsisMarkupVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/vm/IsisMarkupVm.java index 859616600db..d78fe06c87f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/vm/IsisMarkupVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/markups/vm/IsisMarkupVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.markups.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,10 +45,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.IsisMarkupVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.IsisMarkupVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class IsisMarkupVm implements HasAsciiDocDescription, IsisMarkupHolder2 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/IsisPasswords.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/IsisPasswords.java index 23c1d03cab3..1863454c605 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/IsisPasswords.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/IsisPasswords.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.IsisPasswords", editing=Editing.ENABLED) +@Named("demo.IsisPasswords") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class IsisPasswords implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/holder/IsisPasswordHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/holder/IsisPasswordHolder.java index 37d41cc6ed2..f4c6320d4e3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/holder/IsisPasswordHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/holder/IsisPasswordHolder.java @@ -18,10 +18,11 @@ */ package demoapp.dom.types.isis.passwords.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.value.Password; -@LogicalTypeName("demo.IsisPasswordHolder") +@Named("demo.IsisPasswordHolder") //tag::class[] public interface IsisPasswordHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/jdo/IsisPasswordJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/jdo/IsisPasswordJdo.java index e475e205b7a..b4dc542e850 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/jdo/IsisPasswordJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/jdo/IsisPasswordJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.passwords.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -43,14 +44,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.IsisPasswordEntity" -) +@Named("demo.IsisPasswordEntity") +@DomainObject public class IsisPasswordJdo // <.> extends IsisPasswordEntity { //end::class[] - public IsisPasswordJdo(Password initialValue) { + public IsisPasswordJdo(final Password initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/jpa/IsisPasswordJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/jpa/IsisPasswordJpa.java index e076661137c..b00b3e26229 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/jpa/IsisPasswordJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/jpa/IsisPasswordJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.passwords.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -50,9 +51,8 @@ name = "IsisPasswordJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.IsisPasswordEntity" -) +@Named("demo.IsisPasswordEntity") +@DomainObject @NoArgsConstructor public class IsisPasswordJpa extends IsisPasswordEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/persistence/IsisPasswordEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/persistence/IsisPasswordEntity.java index 26df5af1549..1918009a282 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/persistence/IsisPasswordEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/persistence/IsisPasswordEntity.java @@ -19,12 +19,13 @@ package demoapp.dom.types.isis.passwords.persistence; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.Action; import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.ActionLayout.Position; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.PromptStyle; -import org.apache.isis.applib.annotation.ActionLayout.Position; import org.apache.isis.applib.services.message.MessageService; import org.apache.isis.applib.value.Password; @@ -32,9 +33,8 @@ import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.isis.passwords.holder.IsisPasswordHolder2; -@DomainObject( - logicalTypeName = "demo.IsisPasswordEntity" // shared permissions with concrete sub class -) +@Named("demo.IsisPasswordEntity") // shared permissions with concrete sub class +@DomainObject public abstract class IsisPasswordEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/vm/IsisPasswordVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/vm/IsisPasswordVm.java index 3647a08939a..95bf564ac98 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/vm/IsisPasswordVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isis/passwords/vm/IsisPasswordVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isis.passwords.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -43,10 +44,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.IsisPasswordVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.IsisPasswordVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class IsisPasswordVm implements HasAsciiDocDescription, IsisPasswordHolder2 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/IsisAsciiDocs.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/IsisAsciiDocs.java index 283438d57a3..f141a9ae3c6 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/IsisAsciiDocs.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/IsisAsciiDocs.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.IsisAsciiDocs", editing=Editing.ENABLED) +@Named("demo.IsisAsciiDocs") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class IsisAsciiDocs implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/holder/IsisAsciiDocHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/holder/IsisAsciiDocHolder.java index 2b6407a52fb..54b926a2fa9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/holder/IsisAsciiDocHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/holder/IsisAsciiDocHolder.java @@ -18,10 +18,11 @@ */ package demoapp.dom.types.isisext.asciidocs.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc; -@LogicalTypeName("demo.IsisAsciiDocHolder") +@Named("demo.IsisAsciiDocHolder") //tag::class[] public interface IsisAsciiDocHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/jdo/IsisAsciiDocJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/jdo/IsisAsciiDocJdo.java index 5e141fd9f3d..16e3aaf8683 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/jdo/IsisAsciiDocJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/jdo/IsisAsciiDocJdo.java @@ -19,6 +19,7 @@ package demoapp.dom.types.isisext.asciidocs.jdo; import javax.inject.Inject; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -46,9 +47,8 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.IsisAsciiDocEntity" -) +@Named("demo.IsisAsciiDocEntity") +@DomainObject public class IsisAsciiDocJdo // <.> extends IsisAsciiDocEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/jpa/IsisAsciiDocJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/jpa/IsisAsciiDocJpa.java index 0be6edab5f4..729f7b2b534 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/jpa/IsisAsciiDocJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/jpa/IsisAsciiDocJpa.java @@ -19,6 +19,7 @@ package demoapp.dom.types.isisext.asciidocs.jpa; import javax.inject.Inject; +import javax.inject.Named; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; @@ -57,9 +58,8 @@ name = "IsisAsciiDocJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.IsisAsciiDocEntity" -) +@Named("demo.IsisAsciiDocEntity") +@DomainObject @NoArgsConstructor public class IsisAsciiDocJpa extends IsisAsciiDocEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/persistence/IsisAsciiDocEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/persistence/IsisAsciiDocEntity.java index 94aa08e5acb..982c2d6ed40 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/persistence/IsisAsciiDocEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/persistence/IsisAsciiDocEntity.java @@ -18,6 +18,8 @@ */ package demoapp.dom.types.isisext.asciidocs.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc; @@ -25,9 +27,8 @@ import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.isisext.asciidocs.holder.IsisAsciiDocHolder2; -@DomainObject( - logicalTypeName = "demo.IsisAsciiDocEntity" // shared permissions with concrete sub class -) +@Named("demo.IsisAsciiDocEntity") // shared permissions with concrete sub class +@DomainObject public abstract class IsisAsciiDocEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/vm/IsisAsciiDocVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/vm/IsisAsciiDocVm.java index 53bc0d6bcdc..9ad314aced0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/vm/IsisAsciiDocVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/asciidocs/vm/IsisAsciiDocVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isisext.asciidocs.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,10 +45,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.IsisAsciiDocVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.IsisAsciiDocVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class IsisAsciiDocVm implements HasAsciiDocDescription, IsisAsciiDocHolder2 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/IsisCalendarEvents.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/IsisCalendarEvents.java index 1a2e1391f82..b6a1c33a47d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/IsisCalendarEvents.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/IsisCalendarEvents.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.IsisCalendarEvents", editing=Editing.ENABLED) +@Named("demo.IsisCalendarEvents") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class IsisCalendarEvents implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/holder/IsisCalendarEventHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/holder/IsisCalendarEventHolder.java index 8d7c567a805..c32b7284b35 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/holder/IsisCalendarEventHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/holder/IsisCalendarEventHolder.java @@ -18,10 +18,11 @@ */ package demoapp.dom.types.isisext.cal.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.extensions.fullcalendar.applib.value.CalendarEvent; -@LogicalTypeName("demo.IsisCalendarEventHolder") +@Named("demo.IsisCalendarEventHolder") //tag::class[] public interface IsisCalendarEventHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jdo/IsisCalendarEventJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jdo/IsisCalendarEventJdo.java index 325adb61fe1..4ad95c54908 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jdo/IsisCalendarEventJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jdo/IsisCalendarEventJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isisext.cal.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -43,9 +44,8 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.IsisCalendarEventEntity" -) +@Named("demo.IsisCalendarEventEntity") +@DomainObject public class IsisCalendarEventJdo extends IsisCalendarEventEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jpa/IsisCalendarEventJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jpa/IsisCalendarEventJpa.java index bfc0f52c1bb..fb68365b953 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jpa/IsisCalendarEventJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jpa/IsisCalendarEventJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isisext.cal.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -50,9 +51,8 @@ name = "IsisCalendarEventJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.IsisCalendarEventEntity" -) +@Named("demo.IsisCalendarEventEntity") +@DomainObject @NoArgsConstructor public class IsisCalendarEventJpa extends IsisCalendarEventEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/persistence/IsisCalendarEventEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/persistence/IsisCalendarEventEntity.java index 4088a9834c8..f8a46859cfe 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/persistence/IsisCalendarEventEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/persistence/IsisCalendarEventEntity.java @@ -18,6 +18,8 @@ */ package demoapp.dom.types.isisext.cal.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.extensions.fullcalendar.applib.CalendarEventable; import org.apache.isis.extensions.fullcalendar.applib.value.CalendarEvent; @@ -26,9 +28,8 @@ import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.isisext.cal.holder.IsisCalendarEventHolder2; -@DomainObject( - logicalTypeName = "demo.CalendarEventEntity" // shared permissions with concrete sub class -) +@Named("demo.CalendarEventEntity") // shared permissions with concrete sub class +@DomainObject public abstract class IsisCalendarEventEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/vm/IsisCalendarEventVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/vm/IsisCalendarEventVm.java index 23ec3efeece..e766665f125 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/vm/IsisCalendarEventVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/vm/IsisCalendarEventVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isisext.cal.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -43,10 +44,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.IsisCalendarEventVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.IsisCalendarEventVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class IsisCalendarEventVm implements HasAsciiDocDescription, IsisCalendarEventHolder2 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/IsisMarkdowns.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/IsisMarkdowns.java index 6cb9278137b..1f5605635c7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/IsisMarkdowns.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/IsisMarkdowns.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.IsisMarkdowns", editing=Editing.ENABLED) +@Named("demo.IsisMarkdowns") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class IsisMarkdowns implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/holder/IsisMarkdownHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/holder/IsisMarkdownHolder.java index 04415638a42..5b9b2dcafd4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/holder/IsisMarkdownHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/holder/IsisMarkdownHolder.java @@ -18,10 +18,11 @@ */ package demoapp.dom.types.isisext.markdowns.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.valuetypes.markdown.applib.value.Markdown; -@LogicalTypeName("demo.IsisMarkdownHolder") +@Named("demo.IsisMarkdownHolder") //tag::class[] public interface IsisMarkdownHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/jdo/IsisMarkdownJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/jdo/IsisMarkdownJdo.java index 76f9bb70d25..3b772ba0b74 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/jdo/IsisMarkdownJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/jdo/IsisMarkdownJdo.java @@ -19,6 +19,7 @@ package demoapp.dom.types.isisext.markdowns.jdo; import javax.inject.Inject; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -46,9 +47,8 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.IsisMarkdownEntity" -) +@Named("demo.IsisMarkdownEntity") +@DomainObject public class IsisMarkdownJdo // <.> extends IsisMarkdownEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/jpa/IsisMarkdownJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/jpa/IsisMarkdownJpa.java index f382387ae7c..bbbf110bbc5 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/jpa/IsisMarkdownJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/jpa/IsisMarkdownJpa.java @@ -19,6 +19,7 @@ package demoapp.dom.types.isisext.markdowns.jpa; import javax.inject.Inject; +import javax.inject.Named; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; @@ -57,9 +58,8 @@ name = "IsisMarkdownJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.IsisMarkdownEntity" -) +@Named("demo.IsisMarkdownEntity") +@DomainObject @NoArgsConstructor public class IsisMarkdownJpa extends IsisMarkdownEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/persistence/IsisMarkdownEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/persistence/IsisMarkdownEntity.java index 74ac8bd4a84..55f354e05b3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/persistence/IsisMarkdownEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/persistence/IsisMarkdownEntity.java @@ -18,6 +18,8 @@ */ package demoapp.dom.types.isisext.markdowns.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.valuetypes.markdown.applib.value.Markdown; @@ -25,9 +27,8 @@ import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.isisext.markdowns.holder.IsisMarkdownHolder2; -@DomainObject( - logicalTypeName = "demo.IsisMarkdownEntity" // shared permissions with concrete sub class -) +@Named("demo.IsisMarkdownEntity") // shared permissions with concrete sub class +@DomainObject public abstract class IsisMarkdownEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/vm/IsisMarkdownVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/vm/IsisMarkdownVm.java index b9d3e07aed2..360c1c73455 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/vm/IsisMarkdownVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/markdowns/vm/IsisMarkdownVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.isisext.markdowns.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,10 +45,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.IsisMarkdownVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.IsisMarkdownVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class IsisMarkdownVm implements HasAsciiDocDescription, IsisMarkdownHolder2 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionDemo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionDemo.java index 8872a674578..701dc146a71 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionDemo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/AsyncActionDemo.java @@ -19,6 +19,7 @@ package demoapp.dom.types.isisext.sse; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.AsyncAction", editing=Editing.DISABLED) +@Named("demo.AsyncAction") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.DISABLED) public class AsyncActionDemo implements HasAsciiDocDescription { @XmlTransient diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/DemoTask.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/DemoTask.java index d1122c9a01c..29596920c4d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/DemoTask.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/sse/DemoTask.java @@ -20,6 +20,8 @@ import java.util.concurrent.atomic.LongAdder; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Editing; import org.apache.isis.applib.annotation.Nature; @@ -30,7 +32,8 @@ import lombok.RequiredArgsConstructor; -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.AsyncDemoTask", editing=Editing.DISABLED) +@Named("demo.AsyncDemoTask") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.DISABLED) @RequiredArgsConstructor(staticName="of") public class DemoTask implements SseSource { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/JavaAwtBufferedImages.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/JavaAwtBufferedImages.java index 450dd1401f8..507c73e617e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/JavaAwtBufferedImages.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/JavaAwtBufferedImages.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaAwtBufferedImages", editing=Editing.ENABLED) +@Named("demo.JavaAwtBufferedImages") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaAwtBufferedImages implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/holder/JavaAwtBufferedImageHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/holder/JavaAwtBufferedImageHolder.java index e3c1a06aca4..fabd3adbc0a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/holder/JavaAwtBufferedImageHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/holder/JavaAwtBufferedImageHolder.java @@ -20,9 +20,9 @@ import java.awt.image.BufferedImage; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaAwtBufferedImageHolder") +@Named("demo.JavaAwtBufferedImageHolder") //tag::class[] public interface JavaAwtBufferedImageHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jdo/JavaAwtBufferedImageJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jdo/JavaAwtBufferedImageJdo.java index 0a10ae87986..4dc3c34439e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jdo/JavaAwtBufferedImageJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jdo/JavaAwtBufferedImageJdo.java @@ -20,6 +20,7 @@ import java.awt.image.BufferedImage; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -43,9 +44,8 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaAwtBufferedImageEntity" -) +@Named("demo.JavaAwtBufferedImageEntity") +@DomainObject public class JavaAwtBufferedImageJdo extends JavaAwtBufferedImageEntity //end::class[] diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jpa/JavaAwtBufferedImageJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jpa/JavaAwtBufferedImageJpa.java index 0eb04c8d2c6..ce0b0ea7d3d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jpa/JavaAwtBufferedImageJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/jpa/JavaAwtBufferedImageJpa.java @@ -20,6 +20,7 @@ import java.awt.image.BufferedImage; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Convert; import javax.persistence.Entity; @@ -52,9 +53,8 @@ name = "JavaAwtBufferedImageJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaAwtBufferedImageEntity" -) +@Named("demo.JavaAwtBufferedImageEntity") +@DomainObject @NoArgsConstructor public class JavaAwtBufferedImageJpa extends JavaAwtBufferedImageEntity diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/persistence/JavaAwtBufferedImageEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/persistence/JavaAwtBufferedImageEntity.java index fbef565a6f1..b5b984836c1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/persistence/JavaAwtBufferedImageEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/persistence/JavaAwtBufferedImageEntity.java @@ -20,15 +20,16 @@ import java.awt.image.BufferedImage; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javaawt.images.holder.JavaAwtBufferedImageHolder2; -@DomainObject( - logicalTypeName = "demo.JavaAwtBufferedImageEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaAwtBufferedImageEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaAwtBufferedImageEntity implements HasAsciiDocDescription, @@ -49,7 +50,7 @@ public BufferedImage getReadWriteProperty() { } @Override - public void setReadWriteProperty(BufferedImage c) { + public void setReadWriteProperty(final BufferedImage c) { // TODO Auto-generated method stub } @@ -60,7 +61,7 @@ public BufferedImage getReadWriteOptionalProperty() { } @Override - public void setReadWriteOptionalProperty(BufferedImage c) { + public void setReadWriteOptionalProperty(final BufferedImage c) { // TODO Auto-generated method stub } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/vm/JavaAwtBufferedImageVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/vm/JavaAwtBufferedImageVm.java index 62203f27174..9be23f6f4d1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/vm/JavaAwtBufferedImageVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javaawt/images/vm/JavaAwtBufferedImageVm.java @@ -20,6 +20,7 @@ import java.awt.image.BufferedImage; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,10 +43,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaAwtBufferedImageVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaAwtBufferedImageVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaAwtBufferedImageVm implements HasAsciiDocDescription diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/WrapperBooleans.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/WrapperBooleans.java index 553c7f775fd..5833234a248 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/WrapperBooleans.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/WrapperBooleans.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.WrapperBooleans", editing=Editing.ENABLED) +@Named("demo.WrapperBooleans") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class WrapperBooleans implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/holder/WrapperBooleanHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/holder/WrapperBooleanHolder.java index b74c13635aa..f5bb57d4e60 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/holder/WrapperBooleanHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/holder/WrapperBooleanHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.booleans.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.WrapperBooleanHolder") +@Named("demo.WrapperBooleanHolder") //tag::class[] public interface WrapperBooleanHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/jdo/WrapperBooleanJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/jdo/WrapperBooleanJdo.java index eb0373ada95..fb5217a374f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/jdo/WrapperBooleanJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/jdo/WrapperBooleanJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.booleans.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.WrapperBooleanEntity" -) +@Named("demo.WrapperBooleanEntity") +@DomainObject public class WrapperBooleanJdo // <.> extends WrapperBooleanEntity { //end::class[] - public WrapperBooleanJdo(Boolean initialValue) { + public WrapperBooleanJdo(final Boolean initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/jpa/WrapperBooleanJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/jpa/WrapperBooleanJpa.java index 381ee276bba..21b829869f8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/jpa/WrapperBooleanJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/jpa/WrapperBooleanJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.booleans.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "WrapperBooleanJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.WrapperBooleanEntity" -) +@Named("demo.WrapperBooleanEntity") +@DomainObject @NoArgsConstructor public class WrapperBooleanJpa extends WrapperBooleanEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/persistence/WrapperBooleanEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/persistence/WrapperBooleanEntity.java index 71193299443..502cfe34e95 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/persistence/WrapperBooleanEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/persistence/WrapperBooleanEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.booleans.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.booleans.holder.WrapperBooleanHolder2; -@DomainObject( - logicalTypeName = "demo.WrapperBooleanEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperBooleanEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperBooleanEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/vm/WrapperBooleanVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/vm/WrapperBooleanVm.java index 83a9bb1f60a..f574cf0edc0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/vm/WrapperBooleanVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/booleans/vm/WrapperBooleanVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.booleans.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.WrapperBooleanVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.WrapperBooleanVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class WrapperBooleanVm implements HasAsciiDocDescription, WrapperBooleanHolder2 { //end::class[] - public WrapperBooleanVm(Boolean initialValue) { + public WrapperBooleanVm(final Boolean initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/WrapperBytes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/WrapperBytes.java index eb428edddba..ec8eafca876 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/WrapperBytes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/WrapperBytes.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.WrapperBytes", editing=Editing.ENABLED) +@Named("demo.WrapperBytes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class WrapperBytes implements HasAsciiDocDescription { @@ -73,5 +75,4 @@ public List getEntities() { @XmlTransient ValueHolderRepository entities; - } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/holder/WrapperByteHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/holder/WrapperByteHolder.java index c8fc00cba4c..e742108e615 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/holder/WrapperByteHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/holder/WrapperByteHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.bytes.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.WrapperByteHolder") +@Named("demo.WrapperByteHolder") //tag::class[] public interface WrapperByteHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/jdo/WrapperByteJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/jdo/WrapperByteJdo.java index 2517742a26c..30de7c38278 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/jdo/WrapperByteJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/jdo/WrapperByteJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.bytes.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.WrapperByteEntity" -) +@Named("demo.WrapperByteEntity") +@DomainObject public class WrapperByteJdo // <.> extends WrapperByteEntity { //end::class[] - public WrapperByteJdo(Byte initialValue) { + public WrapperByteJdo(final Byte initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/jpa/WrapperByteJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/jpa/WrapperByteJpa.java index 2276a28a901..8f703e5e76b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/jpa/WrapperByteJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/jpa/WrapperByteJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.bytes.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "WrapperByteJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.WrapperByteEntity" -) +@Named("demo.WrapperByteEntity") +@DomainObject @NoArgsConstructor public class WrapperByteJpa extends WrapperByteEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/persistence/WrapperByteEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/persistence/WrapperByteEntity.java index 9271f7bdb8c..99be9f0b37c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/persistence/WrapperByteEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/persistence/WrapperByteEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.bytes.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.bytes.holder.WrapperByteHolder2; -@DomainObject( - logicalTypeName = "demo.WrapperByteEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperByteEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperByteEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/vm/WrapperByteVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/vm/WrapperByteVm.java index 06761f18316..ea2671f6007 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/vm/WrapperByteVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/bytes/vm/WrapperByteVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.bytes.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.WrapperByteVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.WrapperByteVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class WrapperByteVm implements HasAsciiDocDescription, WrapperByteHolder2 { //end::class[] - public WrapperByteVm(Byte initialValue) { + public WrapperByteVm(final Byte initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/WrapperCharacters.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/WrapperCharacters.java index 3b9a6cc07bd..3502f7c3109 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/WrapperCharacters.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/WrapperCharacters.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.WrapperCharacters", editing=Editing.ENABLED) +@Named("demo.WrapperCharacters") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class WrapperCharacters implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/holder/WrapperCharacterHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/holder/WrapperCharacterHolder.java index 6011e7c76bd..af7d920df3f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/holder/WrapperCharacterHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/holder/WrapperCharacterHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.characters.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.WrapperCharacterHolder") +@Named("demo.WrapperCharacterHolder") //tag::class[] public interface WrapperCharacterHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/jdo/WrapperCharacterJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/jdo/WrapperCharacterJdo.java index bb46e81c68d..a7d30ab42a2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/jdo/WrapperCharacterJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/jdo/WrapperCharacterJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.characters.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.WrapperCharacterEntity" -) +@Named("demo.WrapperCharacterEntity") +@DomainObject public class WrapperCharacterJdo // <.> extends WrapperCharacterEntity { //end::class[] - public WrapperCharacterJdo(Character initialValue) { + public WrapperCharacterJdo(final Character initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/jpa/WrapperCharacterJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/jpa/WrapperCharacterJpa.java index c71642de215..38dfb22be59 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/jpa/WrapperCharacterJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/jpa/WrapperCharacterJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.characters.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "WrapperCharacterJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.WrapperCharacterEntity" -) +@Named("demo.WrapperCharacterEntity") +@DomainObject @NoArgsConstructor public class WrapperCharacterJpa extends WrapperCharacterEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/persistence/WrapperCharacterEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/persistence/WrapperCharacterEntity.java index 3833e89b6de..67f724458b6 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/persistence/WrapperCharacterEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/persistence/WrapperCharacterEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.characters.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.characters.holder.WrapperCharacterHolder2; -@DomainObject( - logicalTypeName = "demo.WrapperCharacterEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperCharacterEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperCharacterEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/vm/WrapperCharacterVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/vm/WrapperCharacterVm.java index 0e60a130ea4..e1e4b110fac 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/vm/WrapperCharacterVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/characters/vm/WrapperCharacterVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.characters.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.WrapperCharacterVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.WrapperCharacterVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class WrapperCharacterVm implements HasAsciiDocDescription, WrapperCharacterHolder2 { //end::class[] - public WrapperCharacterVm(Character initialValue) { + public WrapperCharacterVm(final Character initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/WrapperDoubles.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/WrapperDoubles.java index 2b15a9b81c5..6d41711a6ff 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/WrapperDoubles.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/WrapperDoubles.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.WrapperDoubles", editing=Editing.ENABLED) +@Named("demo.WrapperDoubles") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class WrapperDoubles implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/holder/WrapperDoubleHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/holder/WrapperDoubleHolder.java index 53f4a37fbd9..8ba13b4e563 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/holder/WrapperDoubleHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/holder/WrapperDoubleHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.doubles.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.WrapperDoubleHolder") +@Named("demo.WrapperDoubleHolder") //tag::class[] public interface WrapperDoubleHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/jdo/WrapperDoubleJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/jdo/WrapperDoubleJdo.java index 84f10b1c838..64959109a8b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/jdo/WrapperDoubleJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/jdo/WrapperDoubleJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.doubles.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.WrapperDoubleEntity" -) +@Named("demo.WrapperDoubleEntity") +@DomainObject public class WrapperDoubleJdo // <.> extends WrapperDoubleEntity { //end::class[] - public WrapperDoubleJdo(Double initialValue) { + public WrapperDoubleJdo(final Double initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/jpa/WrapperDoubleJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/jpa/WrapperDoubleJpa.java index ac952231fb4..8c448953a3e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/jpa/WrapperDoubleJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/jpa/WrapperDoubleJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.doubles.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "WrapperDoubleJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.WrapperDoubleEntity" -) +@Named("demo.WrapperDoubleEntity") +@DomainObject @NoArgsConstructor public class WrapperDoubleJpa extends WrapperDoubleEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/persistence/WrapperDoubleEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/persistence/WrapperDoubleEntity.java index 70a415aef1d..a87fef51b03 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/persistence/WrapperDoubleEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/persistence/WrapperDoubleEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.doubles.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.doubles.holder.WrapperDoubleHolder2; -@DomainObject( - logicalTypeName = "demo.WrapperDoubleEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperDoubleEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperDoubleEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/vm/WrapperDoubleVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/vm/WrapperDoubleVm.java index 8024a5a816c..04f283d7dde 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/vm/WrapperDoubleVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/doubles/vm/WrapperDoubleVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.doubles.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.WrapperDoubleVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.WrapperDoubleVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class WrapperDoubleVm implements HasAsciiDocDescription, WrapperDoubleHolder2 { //end::class[] - public WrapperDoubleVm(Double initialValue) { + public WrapperDoubleVm(final Double initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/WrapperFloats.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/WrapperFloats.java index 0eb61dd571b..f9cf165839e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/WrapperFloats.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/WrapperFloats.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.WrapperFloats", editing=Editing.ENABLED) +@Named("demo.WrapperFloats") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class WrapperFloats implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/holder/WrapperFloatHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/holder/WrapperFloatHolder.java index df2734fb1b3..14f1c1979a2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/holder/WrapperFloatHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/holder/WrapperFloatHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.floats.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.WrapperFloatHolder") +@Named("demo.WrapperFloatHolder") //tag::class[] public interface WrapperFloatHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/jdo/WrapperFloatJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/jdo/WrapperFloatJdo.java index 8e59304ad2e..8997126b2ef 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/jdo/WrapperFloatJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/jdo/WrapperFloatJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.floats.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.WrapperFloatEntity" -) +@Named("demo.WrapperFloatEntity") +@DomainObject public class WrapperFloatJdo // <.> extends WrapperFloatEntity { //end::class[] - public WrapperFloatJdo(Float initialValue) { + public WrapperFloatJdo(final Float initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/jpa/WrapperFloatJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/jpa/WrapperFloatJpa.java index cee5733aa21..088f6db7777 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/jpa/WrapperFloatJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/jpa/WrapperFloatJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.floats.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "WrapperFloatJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.WrapperFloatEntity" -) +@Named("demo.WrapperFloatEntity") +@DomainObject @NoArgsConstructor public class WrapperFloatJpa extends WrapperFloatEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/persistence/WrapperFloatEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/persistence/WrapperFloatEntity.java index 46feb4eaf44..a6b0a5c257b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/persistence/WrapperFloatEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/persistence/WrapperFloatEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.floats.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.floats.holder.WrapperFloatHolder2; -@DomainObject( - logicalTypeName = "demo.WrapperFloatEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperFloatEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperFloatEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/vm/WrapperFloatVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/vm/WrapperFloatVm.java index b0a4f296f07..304e0d9bbe2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/vm/WrapperFloatVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/floats/vm/WrapperFloatVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.floats.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.WrapperFloatVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.WrapperFloatVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class WrapperFloatVm implements HasAsciiDocDescription, WrapperFloatHolder2 { //end::class[] - public WrapperFloatVm(Float initialValue) { + public WrapperFloatVm(final Float initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/WrapperIntegers.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/WrapperIntegers.java index 711c852e1e6..f6ae534e77d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/WrapperIntegers.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/WrapperIntegers.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.WrapperIntegers", editing=Editing.ENABLED) +@Named("demo.WrapperIntegers") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class WrapperIntegers implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/holder/WrapperIntegerHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/holder/WrapperIntegerHolder.java index 85473ff873e..ef121655ced 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/holder/WrapperIntegerHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/holder/WrapperIntegerHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.integers.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.WrapperIntegerHolder") +@Named("demo.WrapperIntegerHolder") //tag::class[] public interface WrapperIntegerHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/jdo/WrapperIntegerJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/jdo/WrapperIntegerJdo.java index 5e276818710..b5e72b06707 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/jdo/WrapperIntegerJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/jdo/WrapperIntegerJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.integers.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.WrapperIntegerEntity" -) +@Named("demo.WrapperIntegerEntity") +@DomainObject public class WrapperIntegerJdo // <.> extends WrapperIntegerEntity { //end::class[] - public WrapperIntegerJdo(Integer initialValue) { + public WrapperIntegerJdo(final Integer initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/jpa/WrapperIntegerJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/jpa/WrapperIntegerJpa.java index dbd9cfc04f3..08d26231c2a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/jpa/WrapperIntegerJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/jpa/WrapperIntegerJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.integers.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "WrapperIntegerJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.WrapperIntegerEntity" -) +@Named("demo.WrapperIntegerEntity") +@DomainObject @NoArgsConstructor public class WrapperIntegerJpa extends WrapperIntegerEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/persistence/WrapperIntegerEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/persistence/WrapperIntegerEntity.java index b5ee7c498a7..5d37772bcf0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/persistence/WrapperIntegerEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/persistence/WrapperIntegerEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.integers.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.integers.holder.WrapperIntegerHolder2; -@DomainObject( - logicalTypeName = "demo.WrapperIntegerEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperIntegerEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperIntegerEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/vm/WrapperIntegerVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/vm/WrapperIntegerVm.java index dac385d28a4..62501817170 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/vm/WrapperIntegerVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/integers/vm/WrapperIntegerVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.integers.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.WrapperIntegerVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.WrapperIntegerVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class WrapperIntegerVm implements HasAsciiDocDescription, WrapperIntegerHolder2 { //end::class[] - public WrapperIntegerVm(Integer initialValue) { + public WrapperIntegerVm(final Integer initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/WrapperLongs.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/WrapperLongs.java index 0863afe9a75..3194d2243d4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/WrapperLongs.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/WrapperLongs.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.WrapperLongs", editing=Editing.ENABLED) +@Named("demo.WrapperLongs") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class WrapperLongs implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/holder/WrapperLongHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/holder/WrapperLongHolder.java index 47255b875ec..5ef90747ad4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/holder/WrapperLongHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/holder/WrapperLongHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.longs.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.WrapperLongHolder") +@Named("demo.WrapperLongHolder") //tag::class[] public interface WrapperLongHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/jdo/WrapperLongJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/jdo/WrapperLongJdo.java index 14b3e907409..485a49e1765 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/jdo/WrapperLongJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/jdo/WrapperLongJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.longs.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.WrapperLongEntity" -) +@Named("demo.WrapperLongEntity") +@DomainObject public class WrapperLongJdo // <.> extends WrapperLongEntity { //end::class[] - public WrapperLongJdo(Long initialValue) { + public WrapperLongJdo(final Long initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/jpa/WrapperLongJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/jpa/WrapperLongJpa.java index c76214d008c..22ccda932af 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/jpa/WrapperLongJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/jpa/WrapperLongJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.longs.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "WrapperLongJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.WrapperLongEntity" -) +@Named("demo.WrapperLongEntity") +@DomainObject @NoArgsConstructor public class WrapperLongJpa extends WrapperLongEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/persistence/WrapperLongEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/persistence/WrapperLongEntity.java index 79e80459849..f382471f8d4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/persistence/WrapperLongEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/persistence/WrapperLongEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.longs.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.longs.holder.WrapperLongHolder2; -@DomainObject( - logicalTypeName = "demo.WrapperLongEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperLongEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperLongEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/vm/WrapperLongVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/vm/WrapperLongVm.java index f25f524e003..f0e4041815d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/vm/WrapperLongVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/longs/vm/WrapperLongVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.longs.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.WrapperLongVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.WrapperLongVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class WrapperLongVm implements HasAsciiDocDescription, WrapperLongHolder2 { //end::class[] - public WrapperLongVm(Long initialValue) { + public WrapperLongVm(final Long initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/WrapperShorts.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/WrapperShorts.java index 71b7cdce789..f9893f9f4b0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/WrapperShorts.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/WrapperShorts.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.WrapperShorts", editing=Editing.ENABLED) +@Named("demo.WrapperShorts") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class WrapperShorts implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/holder/WrapperShortHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/holder/WrapperShortHolder.java index 257c0beb7eb..793454d4e98 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/holder/WrapperShortHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/holder/WrapperShortHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.shorts.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.WrapperShortHolder") +@Named("demo.WrapperShortHolder") //tag::class[] public interface WrapperShortHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/jdo/WrapperShortJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/jdo/WrapperShortJdo.java index 269f69da927..eb5863428cb 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/jdo/WrapperShortJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/jdo/WrapperShortJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.shorts.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.WrapperShortEntity" -) +@Named("demo.WrapperShortEntity") +@DomainObject public class WrapperShortJdo // <.> extends WrapperShortEntity { //end::class[] - public WrapperShortJdo(Short initialValue) { + public WrapperShortJdo(final Short initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/jpa/WrapperShortJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/jpa/WrapperShortJpa.java index 72a0a2e0184..966bd0bcbf6 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/jpa/WrapperShortJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/jpa/WrapperShortJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.shorts.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "WrapperShortJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.WrapperShortEntity" -) +@Named("demo.WrapperShortEntity") +@DomainObject @NoArgsConstructor public class WrapperShortJpa extends WrapperShortEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/persistence/WrapperShortEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/persistence/WrapperShortEntity.java index 330a3a75dbf..8a1b513449f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/persistence/WrapperShortEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/persistence/WrapperShortEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.shorts.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.shorts.holder.WrapperShortHolder2; -@DomainObject( - logicalTypeName = "demo.WrapperShortEntity" // shared permissions with concrete sub class -) +@Named("demo.WrapperShortEntity") // shared permissions with concrete sub class +@DomainObject public abstract class WrapperShortEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/vm/WrapperShortVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/vm/WrapperShortVm.java index e86d5be05f0..321b64308f3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/vm/WrapperShortVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/shorts/vm/WrapperShortVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.shorts.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.WrapperShortVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.WrapperShortVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class WrapperShortVm implements HasAsciiDocDescription, WrapperShortHolder2 { //end::class[] - public WrapperShortVm(Short initialValue) { + public WrapperShortVm(final Short initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/JavaLangStrings.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/JavaLangStrings.java index e9b58cb92c7..fd59eae43cf 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/JavaLangStrings.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/JavaLangStrings.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -47,7 +48,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaLangStrings", editing=Editing.ENABLED) +@Named("demo.JavaLangStrings") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaLangStrings implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/holder/JavaLangStringHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/holder/JavaLangStringHolder.java index d5ef0d87b46..9239581fa90 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/holder/JavaLangStringHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/holder/JavaLangStringHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javalang.strings.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaLangStringHolder") +@Named("demo.JavaLangStringHolder") //tag::class[] public interface JavaLangStringHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdo.java index 3046fb00710..215eeca80cd 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jdo/JavaLangStringJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.strings.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaLangStringEntity" -) +@Named("demo.JavaLangStringEntity") +@DomainObject public class JavaLangStringJdo // <.> extends JavaLangStringEntity { //end::class[] - public JavaLangStringJdo(String initialValue) { + public JavaLangStringJdo(final String initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jpa/JavaLangStringJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jpa/JavaLangStringJpa.java index d8d1fccfeae..7ec76333581 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jpa/JavaLangStringJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/jpa/JavaLangStringJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.strings.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaLangStringJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaLangStringEntity" -) +@Named("demo.JavaLangStringEntity") +@DomainObject @NoArgsConstructor public class JavaLangStringJpa extends JavaLangStringEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringEntity.java index ba6cebb32f4..d3ec78d0411 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/persistence/JavaLangStringEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javalang.strings.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javalang.strings.holder.JavaLangStringHolder2; -@DomainObject( - logicalTypeName = "demo.JavaLangStringEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaLangStringEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaLangStringEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/vm/JavaLangStringVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/vm/JavaLangStringVm.java index ee371a03063..ba0bf882df6 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/vm/JavaLangStringVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/strings/vm/JavaLangStringVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.strings.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,10 +43,9 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaLangStringVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaLangStringVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaLangStringVm implements HasAsciiDocDescription, JavaLangStringHolder2 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/voids/JavaLangVoids.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/voids/JavaLangVoids.java index 018568c96f9..85a6bfdc4f6 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/voids/JavaLangVoids.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javalang/voids/JavaLangVoids.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javalang.voids; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -37,7 +38,8 @@ @XmlRootElement(name = "demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaLangVoids", editing=Editing.ENABLED) +@Named("demo.JavaLangVoids") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaLangVoids implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/JavaMathBigDecimals.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/JavaMathBigDecimals.java index c1989b7097d..4a6cd007161 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/JavaMathBigDecimals.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/JavaMathBigDecimals.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaMathBigDecimals", editing=Editing.ENABLED) +@Named("demo.JavaMathBigDecimals") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaMathBigDecimals implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/holder/JavaMathBigDecimalHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/holder/JavaMathBigDecimalHolder.java index 3675cd5aabb..8ce1dcc86b3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/holder/JavaMathBigDecimalHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/holder/JavaMathBigDecimalHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javamath.bigdecimals.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaMathBigDecimalHolder") +@Named("demo.JavaMathBigDecimalHolder") //tag::class[] public interface JavaMathBigDecimalHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/jdo/JavaMathBigDecimalJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/jdo/JavaMathBigDecimalJdo.java index 31f6ad8598f..ea77d104f7b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/jdo/JavaMathBigDecimalJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/jdo/JavaMathBigDecimalJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javamath.bigdecimals.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,9 +43,8 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaMathBigDecimalEntity" -) +@Named("demo.JavaMathBigDecimalEntity") +@DomainObject public class JavaMathBigDecimalJdo // <.> extends JavaMathBigDecimalEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/jpa/JavaMathBigDecimalJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/jpa/JavaMathBigDecimalJpa.java index 9d2c095380b..ca23e1d33d1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/jpa/JavaMathBigDecimalJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/jpa/JavaMathBigDecimalJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javamath.bigdecimals.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaMathBigDecimalJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaMathBigDecimalEntity" -) +@Named("demo.JavaMathBigDecimalEntity") +@DomainObject @NoArgsConstructor public class JavaMathBigDecimalJpa // <.> extends JavaMathBigDecimalEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/persistence/JavaMathBigDecimalEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/persistence/JavaMathBigDecimalEntity.java index 1f0018a969c..d3cfa14304f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/persistence/JavaMathBigDecimalEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/persistence/JavaMathBigDecimalEntity.java @@ -20,15 +20,16 @@ import java.math.BigDecimal; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javamath.bigdecimals.holder.JavaMathBigDecimalHolder2; -@DomainObject( - logicalTypeName = "demo.JavaMathBigDecimalEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaMathBigDecimalEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaMathBigDecimalEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/vm/JavaMathBigDecimalVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/vm/JavaMathBigDecimalVm.java index 874545ffcda..36c0302bc7a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/vm/JavaMathBigDecimalVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigdecimals/vm/JavaMathBigDecimalVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javamath.bigdecimals.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -33,6 +34,7 @@ import org.apache.isis.applib.annotation.Title; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; @@ -42,16 +44,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaMathBigDecimalVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaMathBigDecimalVm" -) -@lombok.NoArgsConstructor // <.> + nature=Nature.VIEW_MODEL) +@NoArgsConstructor // <.> public class JavaMathBigDecimalVm implements HasAsciiDocDescription, JavaMathBigDecimalHolder2 { //end::class[] - public JavaMathBigDecimalVm(java.math.BigDecimal initialValue) { + public JavaMathBigDecimalVm(final java.math.BigDecimal initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/JavaMathBigIntegers.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/JavaMathBigIntegers.java index cd4de317de7..d1bfa2367bb 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/JavaMathBigIntegers.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/JavaMathBigIntegers.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaMathBigIntegers", editing=Editing.ENABLED) +@Named("demo.JavaMathBigIntegers") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaMathBigIntegers implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/holder/JavaMathBigIntegerHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/holder/JavaMathBigIntegerHolder.java index fe385f3909e..9d077feff92 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/holder/JavaMathBigIntegerHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/holder/JavaMathBigIntegerHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javamath.bigintegers.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaMathBigIntegerHolder") +@Named("demo.JavaMathBigIntegerHolder") //tag::class[] public interface JavaMathBigIntegerHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/jdo/JavaMathBigIntegerJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/jdo/JavaMathBigIntegerJdo.java index 246b37aa635..98afd77fb0e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/jdo/JavaMathBigIntegerJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/jdo/JavaMathBigIntegerJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javamath.bigintegers.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaMathBigIntegerEntity" -) +@Named("demo.JavaMathBigIntegerEntity") +@DomainObject public class JavaMathBigIntegerJdo // <.> extends JavaMathBigIntegerEntity { //end::class[] - public JavaMathBigIntegerJdo(java.math.BigInteger initialValue) { + public JavaMathBigIntegerJdo(final java.math.BigInteger initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/jpa/JavaMathBigIntegerJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/jpa/JavaMathBigIntegerJpa.java index 896b86e8f0e..65787cfa833 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/jpa/JavaMathBigIntegerJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/jpa/JavaMathBigIntegerJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javamath.bigintegers.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaMathBigIntegerJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaMathBigIntegerEntity" -) +@Named("demo.JavaMathBigIntegerEntity") +@DomainObject @NoArgsConstructor public class JavaMathBigIntegerJpa extends JavaMathBigIntegerEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/persistence/JavaMathBigIntegerEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/persistence/JavaMathBigIntegerEntity.java index 0800603155a..012a3a325ba 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/persistence/JavaMathBigIntegerEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/persistence/JavaMathBigIntegerEntity.java @@ -20,15 +20,16 @@ import java.math.BigInteger; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javamath.bigintegers.holder.JavaMathBigIntegerHolder2; -@DomainObject( - logicalTypeName = "demo.JavaMathBigIntegerEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaMathBigIntegerEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaMathBigIntegerEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/vm/JavaMathBigIntegerVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/vm/JavaMathBigIntegerVm.java index 023240d878a..a57324f1274 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/vm/JavaMathBigIntegerVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javamath/bigintegers/vm/JavaMathBigIntegerVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javamath.bigintegers.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaMathBigIntegerVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaMathBigIntegerVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaMathBigIntegerVm implements HasAsciiDocDescription, JavaMathBigIntegerHolder2 { //end::class[] - public JavaMathBigIntegerVm(java.math.BigInteger initialValue) { + public JavaMathBigIntegerVm(final java.math.BigInteger initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/JavaNetUrls.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/JavaNetUrls.java index aeb0bcb1688..f5c5c7204a5 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/JavaNetUrls.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/JavaNetUrls.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -48,7 +49,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaNetUrls", editing=Editing.ENABLED) +@Named("demo.JavaNetUrls") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaNetUrls implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/holder/JavaNetUrlHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/holder/JavaNetUrlHolder.java index a80b71992f2..dc5859cc2e8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/holder/JavaNetUrlHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/holder/JavaNetUrlHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javanet.urls.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaNetUrlHolder") +@Named("demo.JavaNetUrlHolder") //tag::class[] public interface JavaNetUrlHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/jdo/JavaNetUrlJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/jdo/JavaNetUrlJdo.java index 8e97e4090b8..7a7d298aec2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/jdo/JavaNetUrlJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/jdo/JavaNetUrlJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javanet.urls.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaNetUrlEntity" -) +@Named("demo.JavaNetUrlEntity") +@DomainObject public class JavaNetUrlJdo // <.> extends JavaNetUrlEntity { //end::class[] - public JavaNetUrlJdo(java.net.URL initialValue) { + public JavaNetUrlJdo(final java.net.URL initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/jpa/JavaNetUrlJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/jpa/JavaNetUrlJpa.java index 584194dd2f7..c7339ba22d8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/jpa/JavaNetUrlJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/jpa/JavaNetUrlJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javanet.urls.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaNetUrlJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaNetUrlEntity" -) +@Named("demo.JavaNetUrlEntity") +@DomainObject @NoArgsConstructor public class JavaNetUrlJpa extends JavaNetUrlEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/persistence/JavaNetUrlEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/persistence/JavaNetUrlEntity.java index fa7a0c35db1..0b38157cd9f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/persistence/JavaNetUrlEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/persistence/JavaNetUrlEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javanet.urls.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javanet.urls.holder.JavaNetUrlHolder2; -@DomainObject( - logicalTypeName = "demo.JavaNetUrlEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaNetUrlEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaNetUrlEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/vm/JavaNetUrlVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/vm/JavaNetUrlVm.java index 35072461858..ba6c48c9fd3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/vm/JavaNetUrlVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javanet/urls/vm/JavaNetUrlVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javanet.urls.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaNetUrlVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaNetUrlVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaNetUrlVm implements HasAsciiDocDescription, JavaNetUrlHolder2 { //end::class[] - public JavaNetUrlVm(java.net.URL initialValue) { + public JavaNetUrlVm(final java.net.URL initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/JavaSqlDates.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/JavaSqlDates.java index ff2f03857ac..5112de5e221 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/JavaSqlDates.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/JavaSqlDates.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaSqlDates", editing=Editing.ENABLED) +@Named("demo.JavaSqlDates") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaSqlDates implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/holder/JavaSqlDateHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/holder/JavaSqlDateHolder.java index 85fee85d710..a03f707b0b4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/holder/JavaSqlDateHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/holder/JavaSqlDateHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javasql.javasqldate.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaSqlDateHolder") +@Named("demo.JavaSqlDateHolder") //tag::class[] public interface JavaSqlDateHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/jdo/JavaSqlDateJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/jdo/JavaSqlDateJdo.java index a80481b9496..2867b1f6b07 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/jdo/JavaSqlDateJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/jdo/JavaSqlDateJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javasql.javasqldate.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaSqlDateEntity" -) +@Named("demo.JavaSqlDateEntity") +@DomainObject public class JavaSqlDateJdo // <.> extends JavaSqlDateEntity { //end::class[] - public JavaSqlDateJdo(java.sql.Date initialValue) { + public JavaSqlDateJdo(final java.sql.Date initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/jpa/JavaSqlDateJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/jpa/JavaSqlDateJpa.java index ebbae9df4a1..3cce1598960 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/jpa/JavaSqlDateJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/jpa/JavaSqlDateJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javasql.javasqldate.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaSqlDateJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaSqlDateEntity" -) +@Named("demo.JavaSqlDateEntity") +@DomainObject @NoArgsConstructor public class JavaSqlDateJpa extends JavaSqlDateEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/persistence/JavaSqlDateEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/persistence/JavaSqlDateEntity.java index c1589d4dad8..17689c36b13 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/persistence/JavaSqlDateEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/persistence/JavaSqlDateEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javasql.javasqldate.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javasql.javasqldate.holder.JavaSqlDateHolder3; -@DomainObject( - logicalTypeName = "demo.JavaSqlDateEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaSqlDateEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaSqlDateEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/vm/JavaSqlDateVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/vm/JavaSqlDateVm.java index 17c670c0845..8280a906a52 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/vm/JavaSqlDateVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqldate/vm/JavaSqlDateVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javasql.javasqldate.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,16 +45,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaSqlDateVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaSqlDateVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaSqlDateVm implements HasAsciiDocDescription, JavaSqlDateHolder3 { //end::class[] - public JavaSqlDateVm(java.sql.Date initialValue) { + public JavaSqlDateVm(final java.sql.Date initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/JavaSqlTimestamps.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/JavaSqlTimestamps.java index eb3734a9ab4..3412dc92571 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/JavaSqlTimestamps.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/JavaSqlTimestamps.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaSqlTimestamps", editing=Editing.ENABLED) +@Named("demo.JavaSqlTimestamps") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaSqlTimestamps implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/holder/JavaSqlTimestampHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/holder/JavaSqlTimestampHolder.java index 0912ee6b120..1f171f3295d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/holder/JavaSqlTimestampHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/holder/JavaSqlTimestampHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javasql.javasqltimestamp.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaSqlTimestampHolder") +@Named("demo.JavaSqlTimestampHolder") //tag::class[] public interface JavaSqlTimestampHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/jdo/JavaSqlTimestampJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/jdo/JavaSqlTimestampJdo.java index 972848f7289..5d4a61ec8ef 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/jdo/JavaSqlTimestampJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/jdo/JavaSqlTimestampJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javasql.javasqltimestamp.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaSqlTimestampEntity" -) +@Named("demo.JavaSqlTimestampEntity") +@DomainObject public class JavaSqlTimestampJdo // <.> extends JavaSqlTimestampEntity { //end::class[] - public JavaSqlTimestampJdo(java.sql.Timestamp initialValue) { + public JavaSqlTimestampJdo(final java.sql.Timestamp initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/jpa/JavaSqlTimestampJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/jpa/JavaSqlTimestampJpa.java index fdf34b3d7d9..d796a1377be 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/jpa/JavaSqlTimestampJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/jpa/JavaSqlTimestampJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javasql.javasqltimestamp.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaSqlTimestampJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaSqlTimestampEntity" -) +@Named("demo.JavaSqlTimestampEntity") +@DomainObject @NoArgsConstructor public class JavaSqlTimestampJpa extends JavaSqlTimestampEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/persistence/JavaSqlTimestampEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/persistence/JavaSqlTimestampEntity.java index 3df9d0be3b6..a602295c94b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/persistence/JavaSqlTimestampEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/persistence/JavaSqlTimestampEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javasql.javasqltimestamp.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javasql.javasqltimestamp.holder.JavaSqlTimestampHolder3; -@DomainObject( - logicalTypeName = "demo.JavaSqlTimestampEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaSqlTimestampEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaSqlTimestampEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/vm/JavaSqlTimestampVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/vm/JavaSqlTimestampVm.java index b86e47546df..0f7f52ea9d9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/vm/JavaSqlTimestampVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javasql/javasqltimestamp/vm/JavaSqlTimestampVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javasql.javasqltimestamp.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,16 +45,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaSqlTimestampVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaSqlTimestampVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaSqlTimestampVm implements HasAsciiDocDescription, JavaSqlTimestampHolder3 { //end::class[] - public JavaSqlTimestampVm(java.sql.Timestamp initialValue) { + public JavaSqlTimestampVm(final java.sql.Timestamp initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/JavaTimeLocalDates.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/JavaTimeLocalDates.java index b836457fabe..ac29c4391d2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/JavaTimeLocalDates.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/JavaTimeLocalDates.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaTimeLocalDates", editing=Editing.ENABLED) +@Named("demo.JavaTimeLocalDates") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaTimeLocalDates implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/holder/JavaTimeLocalDateHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/holder/JavaTimeLocalDateHolder.java index a5de7716a41..eb568c597fa 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/holder/JavaTimeLocalDateHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/holder/JavaTimeLocalDateHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javatime.javatimelocaldate.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaTimeLocalDateHolder") +@Named("demo.JavaTimeLocalDateHolder") //tag::class[] public interface JavaTimeLocalDateHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/jdo/JavaTimeLocalDateJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/jdo/JavaTimeLocalDateJdo.java index a04f2e4bc91..00ba76b029a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/jdo/JavaTimeLocalDateJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/jdo/JavaTimeLocalDateJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaldate.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalDateEntity" -) +@Named("demo.JavaTimeLocalDateEntity") +@DomainObject public class JavaTimeLocalDateJdo // <.> extends JavaTimeLocalDateEntity { //end::class[] - public JavaTimeLocalDateJdo(java.time.LocalDate initialValue) { + public JavaTimeLocalDateJdo(final java.time.LocalDate initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/jpa/JavaTimeLocalDateJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/jpa/JavaTimeLocalDateJpa.java index b72fd53292d..8bf9749b37a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/jpa/JavaTimeLocalDateJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/jpa/JavaTimeLocalDateJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaldate.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaTimeLocalDateJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalDateEntity" -) +@Named("demo.JavaTimeLocalDateEntity") +@DomainObject @NoArgsConstructor public class JavaTimeLocalDateJpa extends JavaTimeLocalDateEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/persistence/JavaTimeLocalDateEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/persistence/JavaTimeLocalDateEntity.java index d1406f41418..6f58a32a8f7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/persistence/JavaTimeLocalDateEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/persistence/JavaTimeLocalDateEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javatime.javatimelocaldate.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javatime.javatimelocaldate.holder.JavaTimeLocalDateHolder3; -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalDateEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaTimeLocalDateEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaTimeLocalDateEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/vm/JavaTimeLocalDateVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/vm/JavaTimeLocalDateVm.java index ceb182efaf7..81cde595036 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/vm/JavaTimeLocalDateVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldate/vm/JavaTimeLocalDateVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaldate.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,16 +45,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaTimeLocalDateVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaTimeLocalDateVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaTimeLocalDateVm implements HasAsciiDocDescription, JavaTimeLocalDateHolder3 { //end::class[] - public JavaTimeLocalDateVm(java.time.LocalDate initialValue) { + public JavaTimeLocalDateVm(final java.time.LocalDate initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/JavaTimeLocalDateTimes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/JavaTimeLocalDateTimes.java index dd1df41bb68..d26b6c7af22 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/JavaTimeLocalDateTimes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/JavaTimeLocalDateTimes.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaTimeLocalDateTimes", editing=Editing.ENABLED) +@Named("demo.JavaTimeLocalDateTimes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaTimeLocalDateTimes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/holder/JavaTimeLocalDateTimeHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/holder/JavaTimeLocalDateTimeHolder.java index 31baf745d32..fa44a50dd35 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/holder/JavaTimeLocalDateTimeHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/holder/JavaTimeLocalDateTimeHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javatime.javatimelocaldatetime.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaTimeLocalDateTimeHolder") +@Named("demo.JavaTimeLocalDateTimeHolder") //tag::class[] public interface JavaTimeLocalDateTimeHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/jdo/JavaTimeLocalDateTimeJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/jdo/JavaTimeLocalDateTimeJdo.java index 6bcc361362f..cb5433fbccf 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/jdo/JavaTimeLocalDateTimeJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/jdo/JavaTimeLocalDateTimeJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaldatetime.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalDateTimeEntity" -) +@Named("demo.JavaTimeLocalDateTimeEntity") +@DomainObject public class JavaTimeLocalDateTimeJdo // <.> extends JavaTimeLocalDateTimeEntity { //end::class[] - public JavaTimeLocalDateTimeJdo(java.time.LocalDateTime initialValue) { + public JavaTimeLocalDateTimeJdo(final java.time.LocalDateTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/jpa/JavaTimeLocalDateTimeJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/jpa/JavaTimeLocalDateTimeJpa.java index 5fd29047e5d..47efaa17a7f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/jpa/JavaTimeLocalDateTimeJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/jpa/JavaTimeLocalDateTimeJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaldatetime.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaTimeLocalDateTimeJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalDateTimeEntity" -) +@Named("demo.JavaTimeLocalDateTimeEntity") +@DomainObject @NoArgsConstructor public class JavaTimeLocalDateTimeJpa extends JavaTimeLocalDateTimeEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/persistence/JavaTimeLocalDateTimeEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/persistence/JavaTimeLocalDateTimeEntity.java index d18f9e1001d..31c804c5cc8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/persistence/JavaTimeLocalDateTimeEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/persistence/JavaTimeLocalDateTimeEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javatime.javatimelocaldatetime.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javatime.javatimelocaldatetime.holder.JavaTimeLocalDateTimeHolder3; -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalDateTimeEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaTimeLocalDateTimeEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaTimeLocalDateTimeEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/vm/JavaTimeLocalDateTimeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/vm/JavaTimeLocalDateTimeVm.java index c1a0072ee70..4e8deae5de4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/vm/JavaTimeLocalDateTimeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaldatetime/vm/JavaTimeLocalDateTimeVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaldatetime.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,16 +45,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaTimeLocalDateTimeVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaTimeLocalDateTimeVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaTimeLocalDateTimeVm implements HasAsciiDocDescription, JavaTimeLocalDateTimeHolder3 { //end::class[] - public JavaTimeLocalDateTimeVm(java.time.LocalDateTime initialValue) { + public JavaTimeLocalDateTimeVm(final java.time.LocalDateTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/JavaTimeLocalTimes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/JavaTimeLocalTimes.java index b6047a48123..5a08c1ed564 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/JavaTimeLocalTimes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/JavaTimeLocalTimes.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaTimeLocalTimes", editing=Editing.ENABLED) +@Named("demo.JavaTimeLocalTimes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaTimeLocalTimes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/holder/JavaTimeLocalTimeHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/holder/JavaTimeLocalTimeHolder.java index fd922ee0a92..ecef8686452 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/holder/JavaTimeLocalTimeHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/holder/JavaTimeLocalTimeHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javatime.javatimelocaltime.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaTimeLocalTimeHolder") +@Named("demo.JavaTimeLocalTimeHolder") //tag::class[] public interface JavaTimeLocalTimeHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/jdo/JavaTimeLocalTimeJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/jdo/JavaTimeLocalTimeJdo.java index 6a478409257..d50d9b708ce 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/jdo/JavaTimeLocalTimeJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/jdo/JavaTimeLocalTimeJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaltime.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -33,17 +34,17 @@ import org.apache.isis.applib.annotation.PropertyLayout; import org.apache.isis.applib.annotation.Title; -import demoapp.dom.types.javatime.javatimelocaltime.persistence.JavaTimeLocalTimeEntity; import lombok.Getter; import lombok.Setter; +import demoapp.dom.types.javatime.javatimelocaltime.persistence.JavaTimeLocalTimeEntity; + @Profile("demo-jdo") //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalTimeEntity" -) +@Named("demo.JavaTimeLocalTimeEntity") +@DomainObject public class JavaTimeLocalTimeJdo extends JavaTimeLocalTimeEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/jpa/JavaTimeLocalTimeJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/jpa/JavaTimeLocalTimeJpa.java index f6fb6e617c6..f734a888ad2 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/jpa/JavaTimeLocalTimeJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/jpa/JavaTimeLocalTimeJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaltime.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -35,11 +36,12 @@ import org.apache.isis.applib.annotation.Title; import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; -import demoapp.dom.types.javatime.javatimelocaltime.persistence.JavaTimeLocalTimeEntity; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import demoapp.dom.types.javatime.javatimelocaltime.persistence.JavaTimeLocalTimeEntity; + @Profile("demo-jpa") //tag::class[] @Entity @@ -48,9 +50,8 @@ name = "JavaTimeLocalTimeJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalTimeEntity" -) +@Named("demo.JavaTimeLocalTimeEntity") +@DomainObject @NoArgsConstructor public class JavaTimeLocalTimeJpa extends JavaTimeLocalTimeEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/persistence/JavaTimeLocalTimeEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/persistence/JavaTimeLocalTimeEntity.java index fe5248d00ca..d0a6f225d61 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/persistence/JavaTimeLocalTimeEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/persistence/JavaTimeLocalTimeEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javatime.javatimelocaltime.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javatime.javatimelocaltime.holder.JavaTimeLocalTimeHolder3; -@DomainObject( - logicalTypeName = "demo.JavaTimeLocalTimeEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaTimeLocalTimeEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaTimeLocalTimeEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/vm/JavaTimeLocalTimeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/vm/JavaTimeLocalTimeVm.java index 1cb87ab3187..fd5dcc0efc9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/vm/JavaTimeLocalTimeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimelocaltime/vm/JavaTimeLocalTimeVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimelocaltime.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -34,19 +35,19 @@ import org.apache.isis.applib.annotation.Title; import org.apache.isis.applib.jaxb.JavaTimeJaxbAdapters; -import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -import demoapp.dom.types.javatime.javatimelocaltime.holder.JavaTimeLocalTimeHolder3; import lombok.Getter; import lombok.Setter; +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; +import demoapp.dom.types.javatime.javatimelocaltime.holder.JavaTimeLocalTimeHolder3; + //tag::class[] @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaTimeLocalTimeVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaTimeLocalTimeVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaTimeLocalTimeVm implements HasAsciiDocDescription, JavaTimeLocalTimeHolder3 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/JavaTimeOffsetDateTimes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/JavaTimeOffsetDateTimes.java index 868b9622b22..5423cf691d5 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/JavaTimeOffsetDateTimes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/JavaTimeOffsetDateTimes.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -47,7 +48,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaTimeOffsetDateTimes", editing=Editing.ENABLED) +@Named("demo.JavaTimeOffsetDateTimes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaTimeOffsetDateTimes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/holder/JavaTimeOffsetDateTimeHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/holder/JavaTimeOffsetDateTimeHolder.java index 2503ddcc518..10a5e7abb54 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/holder/JavaTimeOffsetDateTimeHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/holder/JavaTimeOffsetDateTimeHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javatime.javatimeoffsetdatetime.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaTimeOffsetDateTimeHolder") +@Named("demo.JavaTimeOffsetDateTimeHolder") //tag::class[] public interface JavaTimeOffsetDateTimeHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/jdo/JavaTimeOffsetDateTimeJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/jdo/JavaTimeOffsetDateTimeJdo.java index 41e95f7bf67..983ff333094 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/jdo/JavaTimeOffsetDateTimeJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/jdo/JavaTimeOffsetDateTimeJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimeoffsetdatetime.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaTimeOffsetDateTimeEntity" -) +@Named("demo.JavaTimeOffsetDateTimeEntity") +@DomainObject public class JavaTimeOffsetDateTimeJdo // <.> extends JavaTimeOffsetDateTimeEntity { //end::class[] - public JavaTimeOffsetDateTimeJdo(java.time.OffsetDateTime initialValue) { + public JavaTimeOffsetDateTimeJdo(final java.time.OffsetDateTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/jpa/JavaTimeOffsetDateTimeJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/jpa/JavaTimeOffsetDateTimeJpa.java index d348aab9775..4a2684002b1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/jpa/JavaTimeOffsetDateTimeJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/jpa/JavaTimeOffsetDateTimeJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimeoffsetdatetime.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaTimeOffsetDateTimeJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaTimeOffsetDateTimeEntity" -) +@Named("demo.JavaTimeOffsetDateTimeEntity") +@DomainObject @NoArgsConstructor public class JavaTimeOffsetDateTimeJpa extends JavaTimeOffsetDateTimeEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/persistence/JavaTimeOffsetDateTimeEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/persistence/JavaTimeOffsetDateTimeEntity.java index 9574de00d25..3992eaa7610 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/persistence/JavaTimeOffsetDateTimeEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/persistence/JavaTimeOffsetDateTimeEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javatime.javatimeoffsetdatetime.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javatime.javatimeoffsetdatetime.holder.JavaTimeOffsetDateTimeHolder3; -@DomainObject( - logicalTypeName = "demo.JavaTimeOffsetTimeEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaTimeOffsetTimeEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaTimeOffsetDateTimeEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/vm/JavaTimeOffsetDateTimeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/vm/JavaTimeOffsetDateTimeVm.java index c64a3477ec7..37a948e5d84 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/vm/JavaTimeOffsetDateTimeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsetdatetime/vm/JavaTimeOffsetDateTimeVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimeoffsetdatetime.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,16 +45,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaTimeOffsetDateTimeVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaTimeOffsetDateTimeVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaTimeOffsetDateTimeVm implements HasAsciiDocDescription, JavaTimeOffsetDateTimeHolder3 { //end::class[] - public JavaTimeOffsetDateTimeVm(java.time.OffsetDateTime initialValue) { + public JavaTimeOffsetDateTimeVm(final java.time.OffsetDateTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/JavaTimeOffsetTimes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/JavaTimeOffsetTimes.java index 727c0051799..d6b582c60d1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/JavaTimeOffsetTimes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/JavaTimeOffsetTimes.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -47,7 +48,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaTimeOffsetTimes", editing=Editing.ENABLED) +@Named("demo.JavaTimeOffsetTimes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaTimeOffsetTimes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/holder/JavaTimeOffsetTimeHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/holder/JavaTimeOffsetTimeHolder.java index 9ba49ea49ce..d8a4f0112f6 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/holder/JavaTimeOffsetTimeHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/holder/JavaTimeOffsetTimeHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javatime.javatimeoffsettime.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaTimeOffsetTimeHolder") +@Named("demo.JavaTimeOffsetTimeHolder") //tag::class[] public interface JavaTimeOffsetTimeHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/jdo/JavaTimeOffsetTimeJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/jdo/JavaTimeOffsetTimeJdo.java index 82512cf280c..7e7eddfd829 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/jdo/JavaTimeOffsetTimeJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/jdo/JavaTimeOffsetTimeJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimeoffsettime.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaTimeOffsetTimeEntity" -) +@Named("demo.JavaTimeOffsetTimeEntity") +@DomainObject public class JavaTimeOffsetTimeJdo // <.> extends JavaTimeOffsetTimeEntity { //end::class[] - public JavaTimeOffsetTimeJdo(java.time.OffsetTime initialValue) { + public JavaTimeOffsetTimeJdo(final java.time.OffsetTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/jpa/JavaTimeOffsetTimeJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/jpa/JavaTimeOffsetTimeJpa.java index 7bd25cc69ae..cbd673b73fd 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/jpa/JavaTimeOffsetTimeJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/jpa/JavaTimeOffsetTimeJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimeoffsettime.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaTimeOffsetTimeJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaTimeOffsetTimeEntity" -) +@Named("demo.JavaTimeOffsetTimeEntity") +@DomainObject @NoArgsConstructor public class JavaTimeOffsetTimeJpa extends JavaTimeOffsetTimeEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/persistence/JavaTimeOffsetTimeEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/persistence/JavaTimeOffsetTimeEntity.java index 2367c838c36..ae4e481844d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/persistence/JavaTimeOffsetTimeEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/persistence/JavaTimeOffsetTimeEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javatime.javatimeoffsettime.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javatime.javatimeoffsettime.holder.JavaTimeOffsetTimeHolder3; -@DomainObject( - logicalTypeName = "demo.JavaTimeOffsetTimeEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaTimeOffsetTimeEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaTimeOffsetTimeEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/vm/JavaTimeOffsetTimeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/vm/JavaTimeOffsetTimeVm.java index ae29fe1e0f0..1f7c0d54c9f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/vm/JavaTimeOffsetTimeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimeoffsettime/vm/JavaTimeOffsetTimeVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimeoffsettime.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,16 +45,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaTimeOffsetTimeVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaTimeOffsetTimeVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaTimeOffsetTimeVm implements HasAsciiDocDescription, JavaTimeOffsetTimeHolder3 { //end::class[] - public JavaTimeOffsetTimeVm(java.time.OffsetTime initialValue) { + public JavaTimeOffsetTimeVm(final java.time.OffsetTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/JavaTimeZonedDateTimes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/JavaTimeZonedDateTimes.java index 9adcd135f19..ab391b61f1c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/JavaTimeZonedDateTimes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/JavaTimeZonedDateTimes.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -47,7 +48,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaTimeZonedDateTimes", editing=Editing.ENABLED) +@Named("demo.JavaTimeZonedDateTimes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaTimeZonedDateTimes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/holder/JavaTimeZonedDateTimeHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/holder/JavaTimeZonedDateTimeHolder.java index 6f3fdd4b7d7..42ac354f2c3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/holder/JavaTimeZonedDateTimeHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/holder/JavaTimeZonedDateTimeHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javatime.javatimezoneddatetime.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaTimeZonedDateTimeHolder") +@Named("demo.JavaTimeZonedDateTimeHolder") //tag::class[] public interface JavaTimeZonedDateTimeHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/jdo/JavaTimeZonedDateTimeJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/jdo/JavaTimeZonedDateTimeJdo.java index c1c675b802a..ed2c0e2a2eb 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/jdo/JavaTimeZonedDateTimeJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/jdo/JavaTimeZonedDateTimeJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimezoneddatetime.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaTimeZonedDateTimeEntity" -) +@Named("demo.JavaTimeZonedDateTimeEntity") +@DomainObject public class JavaTimeZonedDateTimeJdo // <.> extends JavaTimeZonedDateTimeEntity { //end::class[] - public JavaTimeZonedDateTimeJdo(java.time.ZonedDateTime initialValue) { + public JavaTimeZonedDateTimeJdo(final java.time.ZonedDateTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/jpa/JavaTimeZonedDateTimeJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/jpa/JavaTimeZonedDateTimeJpa.java index e0f7cfc6f2b..c22525a0606 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/jpa/JavaTimeZonedDateTimeJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/jpa/JavaTimeZonedDateTimeJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimezoneddatetime.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaTimeZonedDateTimeJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaTimeZonedDateTimeEntity" -) +@Named("demo.JavaTimeZonedDateTimeEntity") +@DomainObject @NoArgsConstructor public class JavaTimeZonedDateTimeJpa extends JavaTimeZonedDateTimeEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/persistence/JavaTimeZonedDateTimeEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/persistence/JavaTimeZonedDateTimeEntity.java index f6baf95e260..a691438e42e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/persistence/JavaTimeZonedDateTimeEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/persistence/JavaTimeZonedDateTimeEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javatime.javatimezoneddatetime.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javatime.javatimezoneddatetime.holder.JavaTimeZonedDateTimeHolder3; -@DomainObject( - logicalTypeName = "demo.JavaTimeZonedDateTimeEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaTimeZonedDateTimeEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaTimeZonedDateTimeEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/vm/JavaTimeZonedDateTimeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/vm/JavaTimeZonedDateTimeVm.java index 8d51038ad31..724711a2300 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/vm/JavaTimeZonedDateTimeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javatime/javatimezoneddatetime/vm/JavaTimeZonedDateTimeVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javatime.javatimezoneddatetime.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,16 +45,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaTimeZonedDateTimeVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaTimeZonedDateTimeVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaTimeZonedDateTimeVm implements HasAsciiDocDescription, JavaTimeZonedDateTimeHolder3 { //end::class[] - public JavaTimeZonedDateTimeVm(java.time.ZonedDateTime initialValue) { + public JavaTimeZonedDateTimeVm(final java.time.ZonedDateTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/JavaUtilDates.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/JavaUtilDates.java index d6a954daf67..a2bd63f694f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/JavaUtilDates.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/JavaUtilDates.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,7 +47,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaUtilDates", editing=Editing.ENABLED) +@Named("demo.JavaUtilDates") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaUtilDates implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/holder/JavaUtilDateHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/holder/JavaUtilDateHolder.java index 6fc2ac322e1..f75dbc505a0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/holder/JavaUtilDateHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/holder/JavaUtilDateHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javautil.javautildate.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaUtilDateHolder") +@Named("demo.JavaUtilDateHolder") //tag::class[] public interface JavaUtilDateHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/jdo/JavaUtilDateJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/jdo/JavaUtilDateJdo.java index bcb8660d83e..06c067a0b17 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/jdo/JavaUtilDateJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/jdo/JavaUtilDateJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javautil.javautildate.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaUtilDateEntity" -) +@Named("demo.JavaUtilDateEntity") +@DomainObject public class JavaUtilDateJdo // <.> extends JavaUtilDateEntity { //end::class[] - public JavaUtilDateJdo(java.util.Date initialValue) { + public JavaUtilDateJdo(final java.util.Date initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/jpa/JavaUtilDateJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/jpa/JavaUtilDateJpa.java index 6dd8eea7a74..bd55832e188 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/jpa/JavaUtilDateJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/jpa/JavaUtilDateJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javautil.javautildate.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaUtilDateJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaUtilDateEntity" -) +@Named("demo.JavaUtilDateEntity") +@DomainObject @NoArgsConstructor public class JavaUtilDateJpa extends JavaUtilDateEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/persistence/JavaUtilDateEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/persistence/JavaUtilDateEntity.java index 0b9cb5241ad..05036be9410 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/persistence/JavaUtilDateEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/persistence/JavaUtilDateEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javautil.javautildate.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javautil.javautildate.holder.JavaUtilDateHolder3; -@DomainObject( - logicalTypeName = "demo.JavaUtilDateEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaUtilDateEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaUtilDateEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/vm/JavaUtilDateVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/vm/JavaUtilDateVm.java index adeaca5a8c1..1bca2f1795e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/vm/JavaUtilDateVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/javautildate/vm/JavaUtilDateVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javautil.javautildate.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -44,16 +45,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaUtilDateVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaUtilDateVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaUtilDateVm implements HasAsciiDocDescription, JavaUtilDateHolder3 { //end::class[] - public JavaUtilDateVm(java.util.Date initialValue) { + public JavaUtilDateVm(final java.util.Date initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/JavaUtilUuids.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/JavaUtilUuids.java index 1660a602406..ffb0f42e2a8 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/JavaUtilUuids.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/JavaUtilUuids.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -47,7 +48,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JavaUtilUuids", editing=Editing.ENABLED) +@Named("demo.JavaUtilUuids") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JavaUtilUuids implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/holder/JavaUtilUuidHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/holder/JavaUtilUuidHolder.java index feb616bdfaa..50e2c9a04a4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/holder/JavaUtilUuidHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/holder/JavaUtilUuidHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.javautil.uuids.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JavaUtilUuidHolder") +@Named("demo.JavaUtilUuidHolder") //tag::class[] public interface JavaUtilUuidHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/jdo/JavaUtilUuidJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/jdo/JavaUtilUuidJdo.java index 208bcd7ac55..a471ff84816 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/jdo/JavaUtilUuidJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/jdo/JavaUtilUuidJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javautil.uuids.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JavaUtilUuidEntity" -) +@Named("demo.JavaUtilUuidEntity") +@DomainObject public class JavaUtilUuidJdo // <.> extends JavaUtilUuidEntity { //end::class[] - public JavaUtilUuidJdo(java.util.UUID initialValue) { + public JavaUtilUuidJdo(final java.util.UUID initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/jpa/JavaUtilUuidJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/jpa/JavaUtilUuidJpa.java index 5a9aafa3a7c..4a6a9324a48 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/jpa/JavaUtilUuidJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/jpa/JavaUtilUuidJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javautil.uuids.jpa; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -49,9 +50,8 @@ name = "JavaUtilUuidJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.JavaUtilUuidEntity" -) +@Named("demo.JavaUtilUuidEntity") +@DomainObject @NoArgsConstructor public class JavaUtilUuidJpa extends JavaUtilUuidEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/persistence/JavaUtilUuidEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/persistence/JavaUtilUuidEntity.java index 70933662243..445e9754f1b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/persistence/JavaUtilUuidEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/persistence/JavaUtilUuidEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.javautil.uuids.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.javautil.uuids.holder.JavaUtilUuidHolder2; -@DomainObject( - logicalTypeName = "demo.JavaUtilUuidEntity" // shared permissions with concrete sub class -) +@Named("demo.JavaUtilUuidEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JavaUtilUuidEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/vm/JavaUtilUuidVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/vm/JavaUtilUuidVm.java index dda1dea5bae..91f93d8e1f5 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/vm/JavaUtilUuidVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/javautil/uuids/vm/JavaUtilUuidVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.javautil.uuids.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -42,16 +43,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JavaUtilUuidVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JavaUtilUuidVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JavaUtilUuidVm implements HasAsciiDocDescription, JavaUtilUuidHolder2 { //end::class[] - public JavaUtilUuidVm(java.util.UUID initialValue) { + public JavaUtilUuidVm(final java.util.UUID initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/JodaDateTimes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/JodaDateTimes.java index 7bd6e4739ff..4a1b57e4ad9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/JodaDateTimes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/JodaDateTimes.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -50,7 +51,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JodaDateTimes", editing=Editing.ENABLED) +@Named("demo.JodaDateTimes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JodaDateTimes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/holder/JodaDateTimeHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/holder/JodaDateTimeHolder.java index 549b213b45d..8519a71e588 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/holder/JodaDateTimeHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/holder/JodaDateTimeHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.jodatime.jodadatetime.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JodaDateTimeHolder") +@Named("demo.JodaDateTimeHolder") //tag::class[] public interface JodaDateTimeHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/jdo/JodaDateTimeJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/jdo/JodaDateTimeJdo.java index bd81adca51f..65441b15578 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/jdo/JodaDateTimeJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/jdo/JodaDateTimeJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.jodatime.jodadatetime.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JodaDateTimeEntity" -) +@Named("demo.JodaDateTimeEntity") +@DomainObject public class JodaDateTimeJdo // <.> extends JodaDateTimeEntity { //end::class[] - public JodaDateTimeJdo(org.joda.time.DateTime initialValue) { + public JodaDateTimeJdo(final org.joda.time.DateTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/persistence/JodaDateTimeEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/persistence/JodaDateTimeEntity.java index 69d944818b5..610f0e88d36 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/persistence/JodaDateTimeEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/persistence/JodaDateTimeEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.jodatime.jodadatetime.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.jodatime.jodadatetime.holder.JodaDateTimeHolder3; -@DomainObject( - logicalTypeName = "demo.JodaDateTimeEntity" // shared permissions with concrete sub class -) +@Named("demo.JodaDateTimeEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JodaDateTimeEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/vm/JodaDateTimeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/vm/JodaDateTimeVm.java index ba3b673dc06..87e208126b3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/vm/JodaDateTimeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodadatetime/vm/JodaDateTimeVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.jodatime.jodadatetime.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -34,19 +35,19 @@ import org.apache.isis.applib.annotation.Title; import org.apache.isis.valuetypes.jodatime.applib.jaxb.JodaTimeJaxbAdapters; -import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -import demoapp.dom.types.jodatime.jodadatetime.holder.JodaDateTimeHolder3; import lombok.Getter; import lombok.Setter; +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; +import demoapp.dom.types.jodatime.jodadatetime.holder.JodaDateTimeHolder3; + //tag::class[] @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JodaDateTimeVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JodaDateTimeVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JodaDateTimeVm implements HasAsciiDocDescription, JodaDateTimeHolder3 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/JodaLocalDates.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/JodaLocalDates.java index c42dba9543d..a589e866442 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/JodaLocalDates.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/JodaLocalDates.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -51,7 +52,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JodaLocalDates", editing=Editing.ENABLED) +@Named("demo.JodaLocalDates") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JodaLocalDates implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/holder/JodaLocalDateHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/holder/JodaLocalDateHolder.java index bde3c85f1f6..4a86031be3e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/holder/JodaLocalDateHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/holder/JodaLocalDateHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.jodatime.jodalocaldate.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JodaLocalDateHolder") +@Named("demo.JodaLocalDateHolder") //tag::class[] public interface JodaLocalDateHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/jdo/JodaLocalDateJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/jdo/JodaLocalDateJdo.java index 234b5659839..a58117c7190 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/jdo/JodaLocalDateJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/jdo/JodaLocalDateJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.jodatime.jodalocaldate.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JodaLocalDateEntity" -) +@Named("demo.JodaLocalDateEntity") +@DomainObject public class JodaLocalDateJdo // <.> extends JodaLocalDateEntity { //end::class[] - public JodaLocalDateJdo(org.joda.time.LocalDate initialValue) { + public JodaLocalDateJdo(final org.joda.time.LocalDate initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/persistence/JodaLocalDateEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/persistence/JodaLocalDateEntity.java index b0650a3854a..ca89a8a2a6e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/persistence/JodaLocalDateEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/persistence/JodaLocalDateEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.jodatime.jodalocaldate.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.jodatime.jodalocaldate.holder.JodaLocalDateHolder3; -@DomainObject( - logicalTypeName = "demo.JodaLocalDateEntity" // shared permissions with concrete sub class -) +@Named("demo.JodaLocalDateEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JodaLocalDateEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/vm/JodaLocalDateVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/vm/JodaLocalDateVm.java index d487fd9f264..04dd51dd510 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/vm/JodaLocalDateVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldate/vm/JodaLocalDateVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.jodatime.jodalocaldate.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -34,19 +35,19 @@ import org.apache.isis.applib.annotation.Title; import org.apache.isis.valuetypes.jodatime.applib.jaxb.JodaTimeJaxbAdapters; -import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -import demoapp.dom.types.jodatime.jodalocaldate.holder.JodaLocalDateHolder3; import lombok.Getter; import lombok.Setter; +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; +import demoapp.dom.types.jodatime.jodalocaldate.holder.JodaLocalDateHolder3; + //tag::class[] @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JodaLocalDateVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JodaLocalDateVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JodaLocalDateVm implements HasAsciiDocDescription, JodaLocalDateHolder3 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/JodaLocalDateTimes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/JodaLocalDateTimes.java index f81226afff9..0874ed96848 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/JodaLocalDateTimes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/JodaLocalDateTimes.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -51,7 +52,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JodaLocalDateTimes", editing=Editing.ENABLED) +@Named("demo.JodaLocalDateTimes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JodaLocalDateTimes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/holder/JodaLocalDateTimeHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/holder/JodaLocalDateTimeHolder.java index c7741b318e1..78dfb413e59 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/holder/JodaLocalDateTimeHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/holder/JodaLocalDateTimeHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.jodatime.jodalocaldatetime.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JodaLocalDateTimeHolder") +@Named("demo.JodaLocalDateTimeHolder") //tag::class[] public interface JodaLocalDateTimeHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/jdo/JodaLocalDateTimeJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/jdo/JodaLocalDateTimeJdo.java index 7198a5c5adf..c272cb346f0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/jdo/JodaLocalDateTimeJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/jdo/JodaLocalDateTimeJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.jodatime.jodalocaldatetime.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JodaLocalDateTimeEntity" -) +@Named("demo.JodaLocalDateTimeEntity") +@DomainObject public class JodaLocalDateTimeJdo // <.> extends JodaLocalDateTimeEntity { //end::class[] - public JodaLocalDateTimeJdo(org.joda.time.LocalDateTime initialValue) { + public JodaLocalDateTimeJdo(final org.joda.time.LocalDateTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/persistence/JodaLocalDateTimeEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/persistence/JodaLocalDateTimeEntity.java index 66712971d4c..98b3f77479b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/persistence/JodaLocalDateTimeEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/persistence/JodaLocalDateTimeEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.jodatime.jodalocaldatetime.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.jodatime.jodalocaldatetime.holder.JodaLocalDateTimeHolder3; -@DomainObject( - logicalTypeName = "demo.JodaLocalDateTimeEntity" // shared permissions with concrete sub class -) +@Named("demo.JodaLocalDateTimeEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JodaLocalDateTimeEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/vm/JodaLocalDateTimeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/vm/JodaLocalDateTimeVm.java index f093f0a29a9..83a4df6e2e7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/vm/JodaLocalDateTimeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaldatetime/vm/JodaLocalDateTimeVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.jodatime.jodalocaldatetime.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -34,19 +35,19 @@ import org.apache.isis.applib.annotation.Title; import org.apache.isis.valuetypes.jodatime.applib.jaxb.JodaTimeJaxbAdapters; -import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -import demoapp.dom.types.jodatime.jodalocaldatetime.holder.JodaLocalDateTimeHolder3; import lombok.Getter; import lombok.Setter; +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; +import demoapp.dom.types.jodatime.jodalocaldatetime.holder.JodaLocalDateTimeHolder3; + //tag::class[] @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JodaLocalDateTimeVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JodaLocalDateTimeVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JodaLocalDateTimeVm implements HasAsciiDocDescription, JodaLocalDateTimeHolder3 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/JodaLocalTimes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/JodaLocalTimes.java index 2467b9f5b94..7edeea03663 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/JodaLocalTimes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/JodaLocalTimes.java @@ -22,6 +22,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -51,7 +52,8 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "demo.JodaLocalTimes", editing=Editing.ENABLED) +@Named("demo.JodaLocalTimes") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) //@Log4j2 public class JodaLocalTimes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/holder/JodaLocalTimeHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/holder/JodaLocalTimeHolder.java index bf3ceda63c2..627399006ed 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/holder/JodaLocalTimeHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/holder/JodaLocalTimeHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.jodatime.jodalocaltime.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.JodaLocalTimeHolder") +@Named("demo.JodaLocalTimeHolder") //tag::class[] public interface JodaLocalTimeHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/jdo/JodaLocalTimeJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/jdo/JodaLocalTimeJdo.java index e824f8a2f4b..4c731aabcc1 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/jdo/JodaLocalTimeJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/jdo/JodaLocalTimeJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.jodatime.jodalocaltime.jdo; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -42,14 +43,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.JodaLocalTimeEntity" -) +@Named("demo.JodaLocalTimeEntity") +@DomainObject public class JodaLocalTimeJdo // <.> extends JodaLocalTimeEntity { //end::class[] - public JodaLocalTimeJdo(org.joda.time.LocalTime initialValue) { + public JodaLocalTimeJdo(final org.joda.time.LocalTime initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/persistence/JodaLocalTimeEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/persistence/JodaLocalTimeEntity.java index 4aceb7f67dc..eed28da20dd 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/persistence/JodaLocalTimeEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/persistence/JodaLocalTimeEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.jodatime.jodalocaltime.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.jodatime.jodalocaltime.holder.JodaLocalTimeHolder2; -@DomainObject( - logicalTypeName = "demo.JodaLocalTimeEntity" // shared permissions with concrete sub class -) +@Named("demo.JodaLocalTimeEntity") // shared permissions with concrete sub class +@DomainObject public abstract class JodaLocalTimeEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/vm/JodaLocalTimeVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/vm/JodaLocalTimeVm.java index ced3bcfd272..a93c9aeb5cc 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/vm/JodaLocalTimeVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/jodatime/jodalocaltime/vm/JodaLocalTimeVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.jodatime.jodalocaltime.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -34,19 +35,19 @@ import org.apache.isis.applib.annotation.Title; import org.apache.isis.valuetypes.jodatime.applib.jaxb.JodaTimeJaxbAdapters; -import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; -import demoapp.dom.types.jodatime.jodalocaltime.holder.JodaLocalTimeHolder2; import lombok.Getter; import lombok.Setter; +import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; +import demoapp.dom.types.jodatime.jodalocaltime.holder.JodaLocalTimeHolder2; + //tag::class[] @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.JodaLocalTimeVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.JodaLocalTimeVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class JodaLocalTimeVm implements HasAsciiDocDescription, JodaLocalTimeHolder2 { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/PrimitiveBooleans.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/PrimitiveBooleans.java index a6da5ca7564..a1da1e497c4 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/PrimitiveBooleans.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/PrimitiveBooleans.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveBooleans") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveBooleans", - editing=Editing.ENABLED -) + editing=Editing.ENABLED) //@Log4j2 public class PrimitiveBooleans implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/holder/PrimitiveBooleanHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/holder/PrimitiveBooleanHolder.java index 28c96099657..fff8dee8de3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/holder/PrimitiveBooleanHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/holder/PrimitiveBooleanHolder.java @@ -18,11 +18,12 @@ */ package demoapp.dom.types.primitive.booleans.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.annotation.Property; import org.apache.isis.applib.annotation.PropertyLayout; -@LogicalTypeName("demo.PrimitiveBooleanHolder") +@Named("demo.PrimitiveBooleanHolder") //tag::class[] public interface PrimitiveBooleanHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/jdo/PrimitiveBooleanJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/jdo/PrimitiveBooleanJdo.java index f0e3b8b8bef..2a39dd129f7 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/jdo/PrimitiveBooleanJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/jdo/PrimitiveBooleanJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.booleans.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -40,9 +41,8 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.PrimitiveBooleanEntity" -) +@Named("demo.PrimitiveBooleanEntity") +@DomainObject public class PrimitiveBooleanJdo // <.> extends PrimitiveBooleanEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/jpa/PrimitiveBooleanJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/jpa/PrimitiveBooleanJpa.java index 4e86ac3b29f..adc5f89302d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/jpa/PrimitiveBooleanJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/jpa/PrimitiveBooleanJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.booleans.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,9 +48,8 @@ name = "PrimitiveBooleanJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.PrimitiveBooleanEntity" -) +@Named("demo.PrimitiveBooleanEntity") +@DomainObject @NoArgsConstructor public class PrimitiveBooleanJpa extends PrimitiveBooleanEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/persistence/PrimitiveBooleanEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/persistence/PrimitiveBooleanEntity.java index b5afeaffb97..10020604d1b 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/persistence/PrimitiveBooleanEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/persistence/PrimitiveBooleanEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.primitive.booleans.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.primitive.booleans.holder.PrimitiveBooleanHolder2; -@DomainObject( - logicalTypeName = "demo.PrimitiveBooleanEntity" // shared permissions with concrete sub class -) +@Named("demo.PrimitiveBooleanEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PrimitiveBooleanEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/vm/PrimitiveBooleanVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/vm/PrimitiveBooleanVm.java index e175f9c3e88..e203124e710 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/vm/PrimitiveBooleanVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/booleans/vm/PrimitiveBooleanVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.booleans.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -40,16 +41,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveBooleanVm") @DomainObject( - nature= Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveBooleanVm" -) + nature= Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class PrimitiveBooleanVm implements HasAsciiDocDescription, PrimitiveBooleanHolder2 { //end::class[] - public PrimitiveBooleanVm(boolean initialValue) { + public PrimitiveBooleanVm(final boolean initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/PrimitiveBytes.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/PrimitiveBytes.java index 20a6e22d1c4..8e98f092067 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/PrimitiveBytes.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/PrimitiveBytes.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveBytes") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveBytes", - editing=Editing.ENABLED -) + editing=Editing.ENABLED) //@Log4j2 public class PrimitiveBytes implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/holder/PrimitiveByteHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/holder/PrimitiveByteHolder.java index 04a922cae6d..20065a03d7d 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/holder/PrimitiveByteHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/holder/PrimitiveByteHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.primitive.bytes.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.PrimitiveByteHolder") +@Named("demo.PrimitiveByteHolder") //tag::class[] public interface PrimitiveByteHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/jdo/PrimitiveByteJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/jdo/PrimitiveByteJdo.java index cd99e72e41c..aa571e1f685 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/jdo/PrimitiveByteJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/jdo/PrimitiveByteJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.bytes.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -40,14 +41,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.PrimitiveByteEntity" -) +@Named("demo.PrimitiveByteEntity") +@DomainObject public class PrimitiveByteJdo // <.> extends PrimitiveByteEntity { //end::class[] - public PrimitiveByteJdo(byte initialValue) { + public PrimitiveByteJdo(final byte initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/jpa/PrimitiveByteJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/jpa/PrimitiveByteJpa.java index 0232b67daf8..5b613b45b03 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/jpa/PrimitiveByteJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/jpa/PrimitiveByteJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.bytes.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,9 +48,8 @@ name = "PrimitiveByteJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.PrimitiveByteEntity" -) +@Named("demo.PrimitiveByteEntity") +@DomainObject @NoArgsConstructor public class PrimitiveByteJpa extends PrimitiveByteEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/persistence/PrimitiveByteEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/persistence/PrimitiveByteEntity.java index e639e0373a4..5e76861246a 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/persistence/PrimitiveByteEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/persistence/PrimitiveByteEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.primitive.bytes.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.primitive.bytes.holder.PrimitiveByteHolder2; -@DomainObject( - logicalTypeName = "demo.PrimitiveByteEntity" // shared permissions with concrete sub class -) +@Named("demo.PrimitiveByteEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PrimitiveByteEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/vm/PrimitiveByteVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/vm/PrimitiveByteVm.java index b18f0ba6652..77914c6bd72 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/vm/PrimitiveByteVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/bytes/vm/PrimitiveByteVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.bytes.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -40,16 +41,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveByteVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveByteVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class PrimitiveByteVm implements HasAsciiDocDescription, PrimitiveByteHolder2 { //end::class[] - public PrimitiveByteVm(byte initialValue) { + public PrimitiveByteVm(final byte initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/PrimitiveChars.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/PrimitiveChars.java index 52890494327..1a3b4540db3 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/PrimitiveChars.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/PrimitiveChars.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveChars") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveChars", - editing=Editing.ENABLED -) + editing=Editing.ENABLED) //@Log4j2 public class PrimitiveChars implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/holder/PrimitiveCharHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/holder/PrimitiveCharHolder.java index 692da423f92..64841e76bea 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/holder/PrimitiveCharHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/holder/PrimitiveCharHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.primitive.chars.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.PrimitiveCharHolder") +@Named("demo.PrimitiveCharHolder") //tag::class[] public interface PrimitiveCharHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/jdo/PrimitiveCharJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/jdo/PrimitiveCharJdo.java index 2bedb68c409..13b65ec7f2c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/jdo/PrimitiveCharJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/jdo/PrimitiveCharJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.chars.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -40,14 +41,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.PrimitiveCharEntity" -) +@Named("demo.PrimitiveCharEntity") +@DomainObject public class PrimitiveCharJdo // <.> extends PrimitiveCharEntity { //end::class[] - public PrimitiveCharJdo(char initialValue) { + public PrimitiveCharJdo(final char initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/jpa/PrimitiveCharJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/jpa/PrimitiveCharJpa.java index 550c50cf2ad..4eced079b23 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/jpa/PrimitiveCharJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/jpa/PrimitiveCharJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.chars.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,9 +48,8 @@ name = "PrimitiveCharJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.PrimitiveCharEntity" -) +@Named("demo.PrimitiveCharEntity") +@DomainObject @NoArgsConstructor public class PrimitiveCharJpa extends PrimitiveCharEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/persistence/PrimitiveCharEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/persistence/PrimitiveCharEntity.java index aad863b886c..fc1dd15f3f0 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/persistence/PrimitiveCharEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/persistence/PrimitiveCharEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.primitive.chars.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.primitive.chars.holder.PrimitiveCharHolder2; -@DomainObject( - logicalTypeName = "demo.PrimitiveCharEntity" // shared permissions with concrete sub class -) +@Named("demo.PrimitiveCharEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PrimitiveCharEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/vm/PrimitiveCharVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/vm/PrimitiveCharVm.java index 383d327ac30..f485e96fcab 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/vm/PrimitiveCharVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/chars/vm/PrimitiveCharVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.chars.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -40,16 +41,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveCharVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveCharVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class PrimitiveCharVm implements HasAsciiDocDescription, PrimitiveCharHolder2 { //end::class[] - public PrimitiveCharVm(char initialValue) { + public PrimitiveCharVm(final char initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/PrimitiveDoubles.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/PrimitiveDoubles.java index dd88ec30479..738817d7cdb 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/PrimitiveDoubles.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/PrimitiveDoubles.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveDoubles") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveDoubles", - editing=Editing.ENABLED -) + editing=Editing.ENABLED) //@Log4j2 public class PrimitiveDoubles implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/holder/PrimitiveDoubleHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/holder/PrimitiveDoubleHolder.java index 2379b50dfe8..7de58944034 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/holder/PrimitiveDoubleHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/holder/PrimitiveDoubleHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.primitive.doubles.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.PrimitiveDoubleHolder") +@Named("demo.PrimitiveDoubleHolder") //tag::class[] public interface PrimitiveDoubleHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/jdo/PrimitiveDoubleJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/jdo/PrimitiveDoubleJdo.java index 28052d9f9e7..74592c55464 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/jdo/PrimitiveDoubleJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/jdo/PrimitiveDoubleJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.doubles.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -40,14 +41,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.PrimitiveDoubleEntity" -) +@Named("demo.PrimitiveDoubleEntity") +@DomainObject public class PrimitiveDoubleJdo // <.> extends PrimitiveDoubleEntity { //end::class[] - public PrimitiveDoubleJdo(double initialValue) { + public PrimitiveDoubleJdo(final double initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/jpa/PrimitiveDoubleJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/jpa/PrimitiveDoubleJpa.java index 082bb21cf25..2162324ce9e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/jpa/PrimitiveDoubleJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/jpa/PrimitiveDoubleJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.doubles.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,9 +48,8 @@ name = "PrimitiveDoubleJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.PrimitiveDoubleEntity" -) +@Named("demo.PrimitiveDoubleEntity") +@DomainObject @NoArgsConstructor public class PrimitiveDoubleJpa extends PrimitiveDoubleEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/persistence/PrimitiveDoubleEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/persistence/PrimitiveDoubleEntity.java index a74c27a2070..36fef4e6770 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/persistence/PrimitiveDoubleEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/persistence/PrimitiveDoubleEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.primitive.doubles.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.primitive.doubles.holder.PrimitiveDoubleHolder2; -@DomainObject( - logicalTypeName = "demo.PrimitiveDoubleEntity" // shared permissions with concrete sub class -) +@Named("demo.PrimitiveDoubleEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PrimitiveDoubleEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/vm/PrimitiveDoubleVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/vm/PrimitiveDoubleVm.java index 4180116d85f..31914c8d465 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/vm/PrimitiveDoubleVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/doubles/vm/PrimitiveDoubleVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.doubles.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -40,16 +41,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveDoubleVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveDoubleVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class PrimitiveDoubleVm implements HasAsciiDocDescription, PrimitiveDoubleHolder2 { //end::class[] - public PrimitiveDoubleVm(double initialValue) { + public PrimitiveDoubleVm(final double initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/PrimitiveFloats.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/PrimitiveFloats.java index 3e159101ba5..22bac31ce60 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/PrimitiveFloats.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/PrimitiveFloats.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveFloats") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveFloats", - editing=Editing.ENABLED -) + editing=Editing.ENABLED) //@Log4j2 public class PrimitiveFloats implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/holder/PrimitiveFloatHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/holder/PrimitiveFloatHolder.java index f3a03db2819..ee95abcfe89 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/holder/PrimitiveFloatHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/holder/PrimitiveFloatHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.primitive.floats.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.PrimitiveFloatHolder") +@Named("demo.PrimitiveFloatHolder") //tag::class[] public interface PrimitiveFloatHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/jdo/PrimitiveFloatJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/jdo/PrimitiveFloatJdo.java index 7fafdc549bf..79e9339c99e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/jdo/PrimitiveFloatJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/jdo/PrimitiveFloatJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.floats.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -40,14 +41,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.PrimitiveFloatEntity" -) +@Named("demo.PrimitiveFloatEntity") +@DomainObject public class PrimitiveFloatJdo // <.> extends PrimitiveFloatEntity { //end::class[] - public PrimitiveFloatJdo(float initialValue) { + public PrimitiveFloatJdo(final float initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/jpa/PrimitiveFloatJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/jpa/PrimitiveFloatJpa.java index 2039da6e8ff..7ceb6a9bbbe 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/jpa/PrimitiveFloatJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/jpa/PrimitiveFloatJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.floats.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,9 +48,8 @@ name = "PrimitiveFloatJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.PrimitiveFloatEntity" -) +@Named("demo.PrimitiveFloatEntity") +@DomainObject @NoArgsConstructor public class PrimitiveFloatJpa extends PrimitiveFloatEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/persistence/PrimitiveFloatEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/persistence/PrimitiveFloatEntity.java index 326d3d8acbf..84af9ee2b48 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/persistence/PrimitiveFloatEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/persistence/PrimitiveFloatEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.primitive.floats.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.primitive.floats.holder.PrimitiveFloatHolder2; -@DomainObject( - logicalTypeName = "demo.PrimitiveFloatEntity" // shared permissions with concrete sub class -) +@Named("demo.PrimitiveFloatEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PrimitiveFloatEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/vm/PrimitiveFloatVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/vm/PrimitiveFloatVm.java index cfe8811de8e..2f48be2e510 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/vm/PrimitiveFloatVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/floats/vm/PrimitiveFloatVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.floats.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -40,16 +41,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveFloatVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveFloatVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class PrimitiveFloatVm implements HasAsciiDocDescription, PrimitiveFloatHolder2 { //end::class[] - public PrimitiveFloatVm(float initialValue) { + public PrimitiveFloatVm(final float initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/PrimitiveInts.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/PrimitiveInts.java index bc312f928d2..7eb5625fdea 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/PrimitiveInts.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/PrimitiveInts.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveInts") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveInts", - editing=Editing.ENABLED -) + editing=Editing.ENABLED) //@Log4j2 public class PrimitiveInts implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/holder/PrimitiveIntHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/holder/PrimitiveIntHolder.java index f6aad7795c6..475ce72575e 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/holder/PrimitiveIntHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/holder/PrimitiveIntHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.primitive.ints.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.PrimitiveIntHolder") +@Named("demo.PrimitiveIntHolder") //tag::class[] public interface PrimitiveIntHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/jdo/PrimitiveIntJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/jdo/PrimitiveIntJdo.java index 0f2adfdeb41..2b5f80972cf 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/jdo/PrimitiveIntJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/jdo/PrimitiveIntJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.ints.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -40,14 +41,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.PrimitiveIntEntity" -) +@Named("demo.PrimitiveIntEntity") +@DomainObject public class PrimitiveIntJdo // <.> extends PrimitiveIntEntity { //end::class[] - public PrimitiveIntJdo(int initialValue) { + public PrimitiveIntJdo(final int initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/jpa/PrimitiveIntJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/jpa/PrimitiveIntJpa.java index 5674f937b7c..5bacec5a43c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/jpa/PrimitiveIntJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/jpa/PrimitiveIntJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.ints.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,9 +48,8 @@ name = "PrimitiveIntJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.PrimitiveIntEntity" -) +@Named("demo.PrimitiveIntEntity") +@DomainObject @NoArgsConstructor public class PrimitiveIntJpa extends PrimitiveIntEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/persistence/PrimitiveIntEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/persistence/PrimitiveIntEntity.java index a5ff64a3756..cdcadb97647 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/persistence/PrimitiveIntEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/persistence/PrimitiveIntEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.primitive.ints.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.primitive.ints.holder.PrimitiveIntHolder2; -@DomainObject( - logicalTypeName = "demo.PrimitiveIntEntity" // shared permissions with concrete sub class -) +@Named("demo.PrimitiveIntEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PrimitiveIntEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/vm/PrimitiveIntVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/vm/PrimitiveIntVm.java index 7f9f4568d71..07bad29fedd 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/vm/PrimitiveIntVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/ints/vm/PrimitiveIntVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.ints.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -40,16 +41,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveIntVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveIntVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class PrimitiveIntVm implements HasAsciiDocDescription, PrimitiveIntHolder2 { //end::class[] - public PrimitiveIntVm(int initialValue) { + public PrimitiveIntVm(final int initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/PrimitiveLongs.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/PrimitiveLongs.java index 8c4f2b53c3a..78ceff61b56 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/PrimitiveLongs.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/PrimitiveLongs.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveLongs") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveLongs", - editing=Editing.ENABLED -) + editing=Editing.ENABLED) //@Log4j2 public class PrimitiveLongs implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/holder/PrimitiveLongHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/holder/PrimitiveLongHolder.java index d295627831a..2b04da6ae21 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/holder/PrimitiveLongHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/holder/PrimitiveLongHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.primitive.longs.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.PrimitiveLongHolder") +@Named("demo.PrimitiveLongHolder") //tag::class[] public interface PrimitiveLongHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/jdo/PrimitiveLongJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/jdo/PrimitiveLongJdo.java index 737042a62f4..79b3d4d6075 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/jdo/PrimitiveLongJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/jdo/PrimitiveLongJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.longs.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -40,14 +41,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.PrimitiveLongEntity" -) +@Named("demo.PrimitiveLongEntity") +@DomainObject public class PrimitiveLongJdo // <.> extends PrimitiveLongEntity { //end::class[] - public PrimitiveLongJdo(long initialValue) { + public PrimitiveLongJdo(final long initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/jpa/PrimitiveLongJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/jpa/PrimitiveLongJpa.java index 160467cc601..c37afeaf009 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/jpa/PrimitiveLongJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/jpa/PrimitiveLongJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.longs.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,9 +48,8 @@ name = "PrimitiveLongJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.PrimitiveLongEntity" -) +@Named("demo.PrimitiveLongEntity") +@DomainObject @NoArgsConstructor public class PrimitiveLongJpa extends PrimitiveLongEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/persistence/PrimitiveLongEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/persistence/PrimitiveLongEntity.java index 3c989f9733e..0ed64aefb69 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/persistence/PrimitiveLongEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/persistence/PrimitiveLongEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.primitive.longs.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.primitive.longs.holder.PrimitiveLongHolder2; -@DomainObject( - logicalTypeName = "demo.PrimitiveLongEntity" // shared permissions with concrete sub class -) +@Named("demo.PrimitiveLongEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PrimitiveLongEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/vm/PrimitiveLongVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/vm/PrimitiveLongVm.java index 177103c9990..1dfd0f07d92 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/vm/PrimitiveLongVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/longs/vm/PrimitiveLongVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.longs.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -40,16 +41,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveLongVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveLongVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class PrimitiveLongVm implements HasAsciiDocDescription, PrimitiveLongHolder2 { //end::class[] - public PrimitiveLongVm(long initialValue) { + public PrimitiveLongVm(final long initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/PrimitiveShorts.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/PrimitiveShorts.java index 5aa70952335..c4ee7aa5155 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/PrimitiveShorts.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/PrimitiveShorts.java @@ -21,6 +21,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -46,11 +47,10 @@ @XmlRootElement(name = "Demo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveShorts") @DomainObject( nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveShorts", - editing=Editing.ENABLED -) + editing=Editing.ENABLED) //@Log4j2 public class PrimitiveShorts implements HasAsciiDocDescription { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/holder/PrimitiveShortHolder.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/holder/PrimitiveShortHolder.java index fa3f2711753..77fee112034 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/holder/PrimitiveShortHolder.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/holder/PrimitiveShortHolder.java @@ -18,9 +18,9 @@ */ package demoapp.dom.types.primitive.shorts.holder; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; -@LogicalTypeName("demo.PrimitiveShortHolder") +@Named("demo.PrimitiveShortHolder") //tag::class[] public interface PrimitiveShortHolder { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/jdo/PrimitiveShortJdo.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/jdo/PrimitiveShortJdo.java index f9fef72054b..f466a850051 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/jdo/PrimitiveShortJdo.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/jdo/PrimitiveShortJdo.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.shorts.jdo; +import javax.inject.Named; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; @@ -40,14 +41,13 @@ //tag::class[] @PersistenceCapable(identityType = IdentityType.DATASTORE, schema = "demo") @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") -@DomainObject( - logicalTypeName = "demo.PrimitiveShortEntity" -) +@Named("demo.PrimitiveShortEntity") +@DomainObject public class PrimitiveShortJdo // <.> extends PrimitiveShortEntity { //end::class[] - public PrimitiveShortJdo(short initialValue) { + public PrimitiveShortJdo(final short initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/jpa/PrimitiveShortJpa.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/jpa/PrimitiveShortJpa.java index c3135f63e71..fa1a186f1a9 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/jpa/PrimitiveShortJpa.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/jpa/PrimitiveShortJpa.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.shorts.jpa; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.GeneratedValue; @@ -47,9 +48,8 @@ name = "PrimitiveShortJpa" ) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = "demo.PrimitiveShortEntity" -) +@Named("demo.PrimitiveShortEntity") +@DomainObject @NoArgsConstructor public class PrimitiveShortJpa extends PrimitiveShortEntity { diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/persistence/PrimitiveShortEntity.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/persistence/PrimitiveShortEntity.java index 1f90b496455..ff6522ffd6c 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/persistence/PrimitiveShortEntity.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/persistence/PrimitiveShortEntity.java @@ -18,15 +18,16 @@ */ package demoapp.dom.types.primitive.shorts.persistence; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import demoapp.dom._infra.asciidocdesc.HasAsciiDocDescription; import demoapp.dom._infra.values.ValueHolder; import demoapp.dom.types.primitive.shorts.holder.PrimitiveShortHolder2; -@DomainObject( - logicalTypeName = "demo.PrimitiveShortEntity" // shared permissions with concrete sub class -) +@Named("demo.PrimitiveShortEntity") // shared permissions with concrete sub class +@DomainObject public abstract class PrimitiveShortEntity implements HasAsciiDocDescription, diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/vm/PrimitiveShortVm.java b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/vm/PrimitiveShortVm.java index cc94b6fecfc..e5d5808e63f 100644 --- a/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/vm/PrimitiveShortVm.java +++ b/examples/demo/domain/src/main/java/demoapp/dom/types/primitive/shorts/vm/PrimitiveShortVm.java @@ -18,6 +18,7 @@ */ package demoapp.dom.types.primitive.shorts.vm; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -40,16 +41,15 @@ @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) +@Named("demo.PrimitiveShortVm") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "demo.PrimitiveShortVm" -) + nature=Nature.VIEW_MODEL) @lombok.NoArgsConstructor // <.> public class PrimitiveShortVm implements HasAsciiDocDescription, PrimitiveShortHolder2 { //end::class[] - public PrimitiveShortVm(short initialValue) { + public PrimitiveShortVm(final short initialValue) { this.readOnlyProperty = initialValue; this.readWriteProperty = initialValue; } diff --git a/examples/demo/domain/src/main/resources/config/application-primary.properties b/examples/demo/domain/src/main/resources/config/application-primary.properties index 96ea38d4832..2c3d2b37787 100644 --- a/examples/demo/domain/src/main/resources/config/application-primary.properties +++ b/examples/demo/domain/src/main/resources/config/application-primary.properties @@ -18,4 +18,4 @@ # server.port=8080 -isis.extensions.command-replay.secondary-access.base-url-wicket=http://localhost:9090/wicket/ \ No newline at end of file +isis.extensions.commandreplay.secondary-access.base-url-wicket=http://localhost:9090/wicket/ diff --git a/examples/demo/domain/src/main/resources/config/application-secondary.properties b/examples/demo/domain/src/main/resources/config/application-secondary.properties index 6fbef59336f..5f6ef71dad6 100644 --- a/examples/demo/domain/src/main/resources/config/application-secondary.properties +++ b/examples/demo/domain/src/main/resources/config/application-secondary.properties @@ -17,9 +17,9 @@ # under the License. # -isis.extensions.command-replay.primary-access.base-url-restful=http://localhost:8080/restful/ -isis.extensions.command-replay.primary-access.user=sven -isis.extensions.command-replay.primary-access.password=pass -isis.extensions.command-replay.primary-access.base-url-wicket=http://localhost:8080/wicket/ +isis.extensions.commandreplay.primary-access.base-url-restful=http://localhost:8080/restful/ +isis.extensions.commandreplay.primary-access.user=sven +isis.extensions.commandreplay.primary-access.password=pass +isis.extensions.commandreplay.primary-access.base-url-wicket=http://localhost:8080/wicket/ -server.port=9090 \ No newline at end of file +server.port=9090 diff --git a/examples/demo/web/pom.xml b/examples/demo/web/pom.xml index 251ef75fec0..34ae97a5e7d 100644 --- a/examples/demo/web/pom.xml +++ b/examples/demo/web/pom.xml @@ -60,11 +60,11 @@ org.apache.isis.extensions - isis-extensions-command-replay-primary + isis-extensions-commandreplay-primary org.apache.isis.extensions - isis-extensions-command-replay-secondary + isis-extensions-commandreplay-secondary diff --git a/examples/demo/web/src/main/java/demoapp/web/replay/DemoReplayController.java b/examples/demo/web/src/main/java/demoapp/web/replay/DemoReplayController.java index 5fe1d841f56..bfe6a74b8bc 100644 --- a/examples/demo/web/src/main/java/demoapp/web/replay/DemoReplayController.java +++ b/examples/demo/web/src/main/java/demoapp/web/replay/DemoReplayController.java @@ -35,7 +35,7 @@ nature = NatureOfService.VIEW ) @javax.annotation.Priority(PriorityPrecedence.EARLY) -@Profile("command-replay-secondary") +@Profile("commandreplay-secondary") public class DemoReplayController implements ReplayCommandExecutionController { private State state = State.PAUSED; diff --git a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.java b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.java index cc72081a95e..c5d7868a0b7 100644 --- a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.java +++ b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateLineItemForDemoToDoItem.java @@ -22,6 +22,7 @@ import java.time.LocalDate; import javax.inject.Inject; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -49,10 +50,9 @@ import lombok.NoArgsConstructor; import lombok.Setter; +@Named("libExcelFixture.BulkUpdateLineItemForDemoToDoItem") @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = "libExcelFixture.BulkUpdateLineItemForDemoToDoItem" -) + nature = Nature.VIEW_MODEL) @DomainObjectLayout( named = "Bulk update line item", bookmarking = BookmarkPolicy.AS_ROOT @@ -75,7 +75,7 @@ public class BulkUpdateLineItemForDemoToDoItem implements Comparable { - public BulkUpdateLineItemForDemoToDoItem(ExcelDemoToDoItem toDoItem) { + public BulkUpdateLineItemForDemoToDoItem(final ExcelDemoToDoItem toDoItem) { modifyToDoItem(toDoItem); } diff --git a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.java b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.java index 704fd9cd1a0..a1904d15b60 100644 --- a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.java +++ b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/bulkupdate/BulkUpdateManagerForDemoToDoItem.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -60,10 +61,9 @@ import lombok.Setter; import lombok.val; +@Named("libExcelFixture.BulkUpdateManagerForDemoToDoItem") @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = "libExcelFixture.BulkUpdateManagerForDemoToDoItem" -) + nature = Nature.VIEW_MODEL) @DomainObjectLayout( named ="Import/export manager", bookmarking = BookmarkPolicy.AS_ROOT diff --git a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategory.java b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategory.java index 019fc6daeef..d8a45d3b2bf 100644 --- a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategory.java +++ b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/dom/pivot/ExcelPivotByCategoryAndSubcategory.java @@ -20,6 +20,8 @@ import java.math.BigDecimal; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; import org.apache.isis.extensions.excel.applib.AggregationType; @@ -32,10 +34,9 @@ import lombok.Getter; import lombok.Setter; +@Named("libExcelFixture.ExcelPivotByCategoryAndSubcategory") @DomainObject( - logicalTypeName = "libExcelFixture.ExcelPivotByCategoryAndSubcategory", - nature = Nature.VIEW_MODEL -) + nature = Nature.VIEW_MODEL) public class ExcelPivotByCategoryAndSubcategory { public ExcelPivotByCategoryAndSubcategory( diff --git a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadRowHandler4ToDoItem.java b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadRowHandler4ToDoItem.java index 74a44dee3ba..9698f92c77f 100644 --- a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadRowHandler4ToDoItem.java +++ b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/fixturehandlers/excelupload/ExcelUploadRowHandler4ToDoItem.java @@ -24,6 +24,7 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -35,21 +36,20 @@ import org.apache.isis.applib.annotation.Nature; import org.apache.isis.applib.jaxb.JavaTimeJaxbAdapters; import org.apache.isis.applib.services.wrapper.WrapperFactory; -import org.apache.isis.extensions.excel.testing.ExcelFixture; -import org.apache.isis.extensions.excel.testing.ExcelFixtureRowHandler; import org.apache.isis.extensions.excel.fixtures.demoapp.todomodule.dom.Category; import org.apache.isis.extensions.excel.fixtures.demoapp.todomodule.dom.ExcelDemoToDoItem; import org.apache.isis.extensions.excel.fixtures.demoapp.todomodule.dom.ExcelDemoToDoItemMenu; import org.apache.isis.extensions.excel.fixtures.demoapp.todomodule.dom.Subcategory; +import org.apache.isis.extensions.excel.testing.ExcelFixture; +import org.apache.isis.extensions.excel.testing.ExcelFixtureRowHandler; import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript; import lombok.Getter; import lombok.Setter; +@Named("libExcelFixture.ExcelUploadRowHandler4ToDoItem") @DomainObject( - logicalTypeName = "libExcelFixture.ExcelUploadRowHandler4ToDoItem", - nature = Nature.VIEW_MODEL -) + nature = Nature.VIEW_MODEL) @XmlRootElement(name = "BulkUpdateLineItemForDemoToDoItem") @XmlType( propOrder = { diff --git a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/fixturescripts/DemoFixture_extending_ExcelFixture2.java b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/fixturescripts/DemoFixture_extending_ExcelFixture2.java index 1430fd1e298..dae80c03618 100644 --- a/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/fixturescripts/DemoFixture_extending_ExcelFixture2.java +++ b/extensions/applib/excel/fixture/src/main/java/org/apache/isis/extensions/excel/fixtures/demoapp/demomodule/fixturescripts/DemoFixture_extending_ExcelFixture2.java @@ -18,19 +18,20 @@ */ package org.apache.isis.extensions.excel.fixtures.demoapp.demomodule.fixturescripts; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.commons.internal.resources._Resources; -import org.apache.isis.extensions.excel.applib.WorksheetSpec; import org.apache.isis.extensions.excel.applib.Mode; +import org.apache.isis.extensions.excel.applib.WorksheetSpec; import org.apache.isis.extensions.excel.fixtures.demoapp.demomodule.fixturehandlers.demotodoitem.DemoToDoItemRowHandler2; import org.apache.isis.extensions.excel.testing.ExcelFixture2; import lombok.Getter; import lombok.Setter; -@DomainObject( - logicalTypeName = "isis.sub.excel.DemoFixture_extending_ExcelFixture2" -) +@Named("isis.sub.excel.DemoFixture_extending_ExcelFixture2") +@DomainObject public class DemoFixture_extending_ExcelFixture2 extends ExcelFixture2 { public DemoFixture_extending_ExcelFixture2(){ diff --git a/extensions/applib/excel/testing/src/main/java/org/apache/isis/extensions/excel/testing/ExcelFixture.java b/extensions/applib/excel/testing/src/main/java/org/apache/isis/extensions/excel/testing/ExcelFixture.java index edf59c7492a..dc516ac578c 100644 --- a/extensions/applib/excel/testing/src/main/java/org/apache/isis/extensions/excel/testing/ExcelFixture.java +++ b/extensions/applib/excel/testing/src/main/java/org/apache/isis/extensions/excel/testing/ExcelFixture.java @@ -26,6 +26,7 @@ import java.util.Optional; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Programmatic; @@ -40,8 +41,8 @@ import org.apache.isis.commons.internal.collections._Maps; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.specloader.SpecificationLoader; -import org.apache.isis.extensions.excel.applib.IsisModuleExtExcelApplib; import org.apache.isis.extensions.excel.applib.ExcelService; +import org.apache.isis.extensions.excel.applib.IsisModuleExtExcelApplib; import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureResultList; import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript; @@ -56,9 +57,8 @@ * * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ExcelFixture.LOGICAL_TYPE_NAME -) +@Named(ExcelFixture.LOGICAL_TYPE_NAME) +@DomainObject public class ExcelFixture extends FixtureScript { public final static String LOGICAL_TYPE_NAME = IsisModuleExtExcelApplib.NAMESPACE + ".ExcelFixture"; diff --git a/extensions/applib/excel/testing/src/main/java/org/apache/isis/extensions/excel/testing/ExcelFixture2.java b/extensions/applib/excel/testing/src/main/java/org/apache/isis/extensions/excel/testing/ExcelFixture2.java index a63e5f35752..1c168361f7e 100644 --- a/extensions/applib/excel/testing/src/main/java/org/apache/isis/extensions/excel/testing/ExcelFixture2.java +++ b/extensions/applib/excel/testing/src/main/java/org/apache/isis/extensions/excel/testing/ExcelFixture2.java @@ -23,14 +23,15 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.PropertyLayout; import org.apache.isis.applib.services.factory.FactoryService; import org.apache.isis.applib.value.Blob; import org.apache.isis.commons.internal.base._Bytes; -import org.apache.isis.extensions.excel.applib.IsisModuleExtExcelApplib; import org.apache.isis.extensions.excel.applib.ExcelService; +import org.apache.isis.extensions.excel.applib.IsisModuleExtExcelApplib; import org.apache.isis.extensions.excel.applib.WorksheetSpec; import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript; @@ -45,9 +46,8 @@ * * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ExcelFixture2.LOGICAL_TYPE_NAME -) +@Named(ExcelFixture2.LOGICAL_TYPE_NAME) +@DomainObject public class ExcelFixture2 extends FixtureScript { public final static String LOGICAL_TYPE_NAME = IsisModuleExtExcelApplib.NAMESPACE + ".ExcelFixture2"; diff --git a/extensions/core/command-log/adoc/modules/command-log/partials/module-nav.adoc b/extensions/core/command-log/adoc/modules/command-log/partials/module-nav.adoc deleted file mode 100644 index 4bf59e2f6ad..00000000000 --- a/extensions/core/command-log/adoc/modules/command-log/partials/module-nav.adoc +++ /dev/null @@ -1,6 +0,0 @@ - - - -** xref:userguide:command-log:about.adoc[Command Log] - - diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java deleted file mode 100644 index 30255bddf14..00000000000 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.applib.command; - -import java.math.BigDecimal; -import java.sql.Timestamp; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.function.Consumer; - -import javax.persistence.Column; -import javax.persistence.Transient; - -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Service; - -import org.apache.isis.applib.annotation.DomainObject; -import org.apache.isis.applib.annotation.DomainObjectLayout; -import org.apache.isis.applib.annotation.Editing; -import org.apache.isis.applib.annotation.MemberSupport; -import org.apache.isis.applib.annotation.PriorityPrecedence; -import org.apache.isis.applib.annotation.Programmatic; -import org.apache.isis.applib.annotation.Property; -import org.apache.isis.applib.annotation.PropertyLayout; -import org.apache.isis.applib.annotation.Where; -import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling; -import org.apache.isis.applib.mixins.system.DomainChangeRecord; -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.command.Command; -import org.apache.isis.applib.services.command.CommandOutcomeHandler; -import org.apache.isis.applib.services.commanddto.conmap.UserDataKeys; -import org.apache.isis.applib.services.tablecol.TableColumnOrderForCollectionTypeAbstract; -import org.apache.isis.applib.util.TitleBuffer; -import org.apache.isis.commons.functional.Try; -import org.apache.isis.commons.internal.base._Strings; -import org.apache.isis.commons.internal.exceptions._Exceptions; -import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.util.BigDecimalUtils; -import org.apache.isis.extensions.commandlog.applib.util.StringUtils; -import org.apache.isis.schema.cmd.v2.CommandDto; -import org.apache.isis.schema.cmd.v2.MapDto; - -import lombok.NoArgsConstructor; -import lombok.val; - -/** - * A persistent representation of a {@link Command}. - * - *

- * Use cases requiring persistence including auditing, and for replay of - * commands for regression testing purposes. - *

- * - * Note that this class doesn't subclass from {@link Command} ({@link Command} - * is not an interface). - */ -@DomainObject( - logicalTypeName = CommandLog.LOGICAL_TYPE_NAME, - editing = Editing.DISABLED -) -@DomainObjectLayout( - named = "Command", - titleUiEvent = ICommandLog.TitleUiEvent.class, - iconUiEvent = ICommandLog.IconUiEvent.class, - cssClassUiEvent = ICommandLog.CssClassUiEvent.class, - layoutUiEvent = ICommandLog.LayoutUiEvent.class -) -//@Log4j2 -@NoArgsConstructor -public abstract class CommandLog -implements - ICommandLog, - DomainChangeRecord { - - public final static String LOGICAL_TYPE_NAME = IsisModuleExtCommandLogApplib.NAMESPACE + ".CommandLog"; - - /** - * Intended for use on primary system. - * - * @param command - */ - public CommandLog(final Command command) { - - setInteractionIdStr(command.getInteractionId().toString()); - setUsername(command.getUsername()); - setTimestamp(command.getTimestamp()); - - setCommandDto(command.getCommandDto()); - setTarget(command.getTarget()); - setLogicalMemberIdentifier(command.getLogicalMemberIdentifier()); - - setStartedAt(command.getStartedAt()); - setCompletedAt(command.getCompletedAt()); - - setResult(command.getResult()); - setException(command.getException()); - - setReplayState(ReplayState.UNDEFINED); - } - - - /** - * Intended for use on secondary (replay) system. - * - * @param commandDto - obtained from the primary system as a representation of a command invocation - * @param replayState - controls whether this is to be replayed - * @param targetIndex - if the command represents a bulk action, then it is flattened out when replayed; this indicates which target to execute against. - */ - public CommandLog( - final CommandDto commandDto, - final ReplayState replayState, - final int targetIndex) { - - setInteractionIdStr(commandDto.getInteractionId()); - setUsername(commandDto.getUser()); - setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimestamp())); - - setCommandDto(commandDto); - setTarget(Bookmark.forOidDto(commandDto.getTargets().getOid().get(targetIndex))); - setLogicalMemberIdentifier(commandDto.getMember().getLogicalMemberIdentifier()); - - // the hierarchy of commands calling other commands is only available on the primary system, and is - setParent(null); - - setStartedAt(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimings().getStartedAt())); - setCompletedAt(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimings().getCompletedAt())); - - copyOver(commandDto, UserDataKeys.RESULT, value -> this.setResult(Bookmark.parse(value).orElse(null))); - copyOver(commandDto, UserDataKeys.EXCEPTION, this::setException); - - setReplayState(replayState); - } - - static void copyOver( - final CommandDto commandDto, - final String key, final Consumer consume) { - commandDto.getUserData().getEntry() - .stream() - .filter(x -> Objects.equals(x.getKey(), key)) - .map(MapDto.Entry::getValue) - .filter(Objects::nonNull) - .filter(x -> x.length() > 0) - .findFirst() - .ifPresent(consume); - } - - @Service - public static class TitleProvider { - - private final DateTimeFormatter formatter = - DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); - - @EventListener(TitleUiEvent.class) - public void on(final TitleUiEvent ev) { - if(ev.getTranslatableTitle() != null - && ev.getSource() != null - && ev.getSource().getTimestamp() != null - && (Objects.equals(ev.getTitle(), "Command Jdo") - || Objects.equals(ev.getTitle(), "Command Jpa") - )) { - ev.setTitle(title((CommandLog)ev.getSource())); - } - } - - private String title(final CommandLog source) { - return new TitleBuffer() - .append(formatter.format(source.getTimestamp().toLocalDateTime())) - .append(" ").append(source.getLogicalMemberIdentifier()) - .toString(); - } - } - - - public static class InteractionIdDomainEvent extends PropertyDomainEvent { } - /** - * Implementation note: persisted as a string rather than a UUID as fails - * to persist if using h2 (perhaps would need to be mapped differently). - * @see www.datanucleus.org - */ - @Property(domainEvent = InteractionIdDomainEvent.class) - @PropertyLayout(named = "Interaction Id") - public abstract String getInteractionIdStr(); - public abstract void setInteractionIdStr(String interactionIdStr); - - @Transient - @javax.jdo.annotations.NotPersistent - @Programmatic - @Override - public UUID getInteractionId() {return UUID.fromString(getInteractionIdStr());} - - - public static class UsernameDomainEvent extends PropertyDomainEvent { } - @Property(domainEvent = UsernameDomainEvent.class) - @Override - public abstract String getUsername(); - public abstract void setUsername(String userName); - - - public static class TimestampDomainEvent extends PropertyDomainEvent { } - @Property(domainEvent = TimestampDomainEvent.class) - @Override - public abstract Timestamp getTimestamp(); - public abstract void setTimestamp(Timestamp timestamp); - - - @Transient - @javax.jdo.annotations.NotPersistent - @Override - public ChangeType getType() { - return ChangeType.COMMAND; - } - - public static class ReplayStateDomainEvent extends PropertyDomainEvent { } - /** - * For a replayed command, what the outcome was. - */ - @Property(domainEvent = ReplayStateDomainEvent.class) - @Override - public abstract ReplayState getReplayState(); - - public static class ReplayStateFailureReasonDomainEvent extends PropertyDomainEvent { } - /** - * For a {@link ReplayState#FAILED failed} replayed command, what the reason was for the failure. - */ - @Column(nullable=true, length=255) - @Property(domainEvent = ReplayStateFailureReasonDomainEvent.class) - @PropertyLayout(hidden = Where.ALL_TABLES, multiLine = 5) - public abstract String getReplayStateFailureReason(); - public abstract void setReplayStateFailureReason(String replayStateFailureReason); - @MemberSupport public boolean hideReplayStateFailureReason() { - return getReplayState() == null || !getReplayState().isFailed(); - } - - public static class ParentDomainEvent extends PropertyDomainEvent { } - @Property(domainEvent = ParentDomainEvent.class) - @PropertyLayout(hidden = Where.ALL_TABLES) - public abstract C getParent(); - public abstract void setParent(CommandLog parent); - - public static class TargetDomainEvent extends PropertyDomainEvent { } - @Override - @Property(domainEvent = TargetDomainEvent.class) - @PropertyLayout(named = "Object") - public abstract Bookmark getTarget(); - public abstract void setTarget(Bookmark target); - - @Transient - @javax.jdo.annotations.NotPersistent - public String getTargetStr() { - return Optional.ofNullable(getTarget()).map(Bookmark::toString).orElse(null); - } - - @Transient - @javax.jdo.annotations.NotPersistent - @Override - public String getTargetMember() { - return getCommandDto().getMember().getLogicalMemberIdentifier(); - } - - @Transient - @javax.jdo.annotations.NotPersistent - @Property(domainEvent = TargetDomainEvent.class) - @PropertyLayout(named = "Member") - public String getLocalMember() { - val targetMember = getTargetMember(); - return targetMember.substring(targetMember.indexOf("#") + 1); - } - - public static class LogicalMemberIdentifierDomainEvent extends PropertyDomainEvent { } - @Override - @Property(domainEvent = LogicalMemberIdentifierDomainEvent.class) - @PropertyLayout(hidden = Where.ALL_TABLES) - public abstract String getLogicalMemberIdentifier(); - public abstract void setLogicalMemberIdentifier(String logicalMemberIdentifier); - - public static class CommandDtoDomainEvent extends PropertyDomainEvent { } - @Property(domainEvent = CommandDtoDomainEvent.class) - @PropertyLayout(multiLine = 9) - @Override - public abstract CommandDto getCommandDto(); - public abstract void setCommandDto(CommandDto commandDto); - - public static class StartedAtDomainEvent extends PropertyDomainEvent { } - @Override - @Property(domainEvent = StartedAtDomainEvent.class) - public abstract Timestamp getStartedAt(); - public abstract void setStartedAt(Timestamp startedAt); - - public static class CompletedAtDomainEvent extends PropertyDomainEvent { } - @Override - @Property(domainEvent = CompletedAtDomainEvent.class) - public abstract Timestamp getCompletedAt(); - public abstract void setCompletedAt(Timestamp completedAt); - - public static class DurationDomainEvent extends PropertyDomainEvent { } - /** - * The number of seconds (to 3 decimal places) that this interaction lasted. - * - *

- * Populated only if it has {@link #getCompletedAt() completed}. - */ - @Transient - @javax.jdo.annotations.NotPersistent - @javax.validation.constraints.Digits(integer=5, fraction=3) - @Property(domainEvent = DurationDomainEvent.class) - public BigDecimal getDuration() { - return BigDecimalUtils.durationBetween(getStartedAt(), getCompletedAt()); - } - - - public static class IsCompleteDomainEvent extends PropertyDomainEvent { } - @Transient - @javax.jdo.annotations.NotPersistent - @Property(domainEvent = IsCompleteDomainEvent.class) - @PropertyLayout(hidden = Where.OBJECT_FORMS) - public boolean isComplete() { - return getCompletedAt() != null; - } - - - public static class ResultSummaryDomainEvent extends PropertyDomainEvent { } - @Transient - @javax.jdo.annotations.NotPersistent - @Property(domainEvent = ResultSummaryDomainEvent.class) - @PropertyLayout(hidden = Where.OBJECT_FORMS, named = "Result") - public String getResultSummary() { - if(getCompletedAt() == null) { - return ""; - } - if(!_Strings.isNullOrEmpty(getException())) { - return "EXCEPTION"; - } - if(getResult() != null) { - return "OK"; - } else { - return "OK (VOID)"; - } - } - - public static class ResultDomainEvent extends PropertyDomainEvent { } - @Override - @Property(domainEvent = ResultDomainEvent.class) - @PropertyLayout(hidden = Where.ALL_TABLES, named = "Result Bookmark") - public abstract Bookmark getResult(); - public abstract void setResult(Bookmark result); - - public static class ExceptionDomainEvent extends PropertyDomainEvent { } - /** - * Stack trace of any exception that might have occurred if this interaction/transaction aborted. - * - *

- * Not part of the applib API, because the default implementation is not persistent - * and so there's no object that can be accessed to be annotated. - */ - @Override - @Property(domainEvent = ExceptionDomainEvent.class) - @PropertyLayout(hidden = Where.ALL_TABLES, multiLine = 5, named = "Exception (if any)") - public abstract String getException(); - public abstract void setException(final String exception); - @Transient - @javax.jdo.annotations.NotPersistent - public void setException(final Throwable exception) { - setException(_Exceptions.asStacktrace(exception)); - } - - public static class IsCausedExceptionDomainEvent extends PropertyDomainEvent { } - @Transient - @javax.jdo.annotations.NotPersistent - @Property(domainEvent = IsCausedExceptionDomainEvent.class) - @PropertyLayout(hidden = Where.OBJECT_FORMS) - public boolean isCausedException() { - return getException() != null; - } - - @Transient - @javax.jdo.annotations.NotPersistent - @Override - public String getPreValue() { - return null; - } - - @Transient - @javax.jdo.annotations.NotPersistent - @Override - public String getPostValue() { - return null; - } - - - @Override - public void saveAnalysis(final String analysis) { - if (analysis == null) { - setReplayState(ReplayState.OK); - } else { - setReplayState(ReplayState.FAILED); - setReplayStateFailureReason(StringUtils.trimmed(analysis, 255)); - } - - } - - @Override - public String toString() { - return toFriendlyString(); - } - - @Override - public CommandOutcomeHandler outcomeHandler() { - return new CommandOutcomeHandler() { - @Override - public Timestamp getStartedAt() { - return CommandLog.this.getStartedAt(); - } - - @Override - public void setStartedAt(final Timestamp startedAt) { - CommandLog.this.setStartedAt(startedAt); - } - - @Override - public void setCompletedAt(final Timestamp completedAt) { - CommandLog.this.setCompletedAt(completedAt); - } - - @Override - public void setResult(final Try resultBookmark) { - CommandLog.this.setResult(resultBookmark.getValue().orElse(null)); - CommandLog.this.setException(resultBookmark.getFailure().orElse(null)); - } - - }; - } - - - @Service - @javax.annotation.Priority(PriorityPrecedence.LATE - 10) // before the framework's own default. - public static class TableColumnOrderDefault extends TableColumnOrderForCollectionTypeAbstract { - - public TableColumnOrderDefault() { super(CommandLog.class); } - - @Override - protected List orderParented(final Object parent, final String collectionId, final List propertyIds) { - return ordered(propertyIds); - } - - @Override - protected List orderStandalone(final List propertyIds) { - return ordered(propertyIds); - } - - private List ordered(final List propertyIds) { - return Arrays.asList( - "timestamp", "target", "targetMember", "username", "complete", "resultSummary", "interactionIdStr" - ); - } - } -} - diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java deleted file mode 100644 index 8a597512298..00000000000 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.applib.command; - -import java.sql.Timestamp; -import java.util.UUID; - -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.command.CommandOutcomeHandler; -import org.apache.isis.applib.services.commanddto.HasCommandDto; -import org.apache.isis.applib.util.ObjectContracts; -import org.apache.isis.applib.util.ToString; -import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; - -public interface ICommandLog -extends - HasCommandDto, - Comparable { - - public static class TitleUiEvent extends IsisModuleExtCommandLogApplib.TitleUiEvent { } - public static class IconUiEvent extends IsisModuleExtCommandLogApplib.IconUiEvent { } - public static class CssClassUiEvent extends IsisModuleExtCommandLogApplib.CssClassUiEvent { } - public static class LayoutUiEvent extends IsisModuleExtCommandLogApplib.LayoutUiEvent { } - - public static abstract class PropertyDomainEvent extends IsisModuleExtCommandLogApplib.PropertyDomainEvent { } - public static abstract class CollectionDomainEvent extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } - public static abstract class ActionDomainEvent extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } - - - Bookmark getResult(); - - String getException(); - - Timestamp getStartedAt(); - Timestamp getCompletedAt(); - Timestamp getTimestamp(); - - Bookmark getTarget(); - - String getLogicalMemberIdentifier(); - - String getUsername(); - - void saveAnalysis(String analysis); - - UUID getInteractionId(); - - ReplayState getReplayState(); - - CommandOutcomeHandler outcomeHandler(); - - void setReplayState(ReplayState excluded); - - static final ToString stringifier = ObjectContracts - .toString("interactionId", ICommandLog::getInteractionId) - .thenToString("username", ICommandLog::getUsername) - .thenToString("timestamp", ICommandLog::getTimestamp) - .thenToString("target", ICommandLog::getTarget) - .thenToString("logicalMemberIdentifier", ICommandLog::getLogicalMemberIdentifier) - .thenToStringOmitIfAbsent("startedAt", ICommandLog::getStartedAt) - .thenToStringOmitIfAbsent("completedAt", ICommandLog::getCompletedAt); - - default String toFriendlyString() { - return stringifier.toString(this); - } - - @Override - default int compareTo(final ICommandLog other) { - return this.getTimestamp().compareTo(other.getTimestamp()); - } - -} diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java deleted file mode 100644 index 1f659ae88da..00000000000 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.applib.command; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -import org.springframework.lang.Nullable; - -import org.apache.isis.applib.exceptions.RecoverableException; -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.command.Command; -import org.apache.isis.schema.cmd.v2.CommandDto; -import org.apache.isis.schema.cmd.v2.CommandsDto; - -import lombok.Getter; - -public interface ICommandLogRepository { - - /** Creates a transient (yet not persisted) {@link ICommandLog} instance. */ - C createCommandLog(Command command); - - Optional findByInteractionId(UUID interactionId); - - List findByParent(ICommandLog parent); - - List findByFromAndTo(LocalDate from, LocalDate to); - - List findCurrent(); - - List findCompleted(); - - List findByTargetAndFromAndTo(Bookmark target, LocalDate from, LocalDate to); - - List findRecentByUsername(String username); - - List findRecentByTarget(Bookmark target); - - /** - * Intended to support the replay of commands on a secondary instance of - * the application. - * - * This finder returns all (completed) {@link ICommandLog}s started after - * the command with the specified interactionId. The number of commands - * returned can be limited so that they can be applied in batches. - * - * If the provided interactionId is null, then only a single - * {@link ICommandLog command} is returned. This is intended to support - * the case when the secondary does not yet have any - * {@link ICommandLog command}s replicated. In practice this is unlikely; - * typically we expect that the secondary will be set up to run against a - * copy of the primary instance's DB (restored from a backup), in which - * case there will already be a {@link ICommandLog command} representing the - * current high water mark on the secondary system. - * - * If the interactionId is not null but the corresponding - * {@link ICommandLog command} is not found, then null is returned. - * In the replay scenario the caller will probably interpret this as an - * error because it means that the high water mark on the secondary is - * inaccurate, referring to a non-existent {@link ICommandLog command} on - * the primary. - * - * @param interactionId - the identifier of the {@link ICommandLog command} being - * the replay HWM (using {@link #findMostRecentReplayed()} on the - * secondary), or null if no HWM was found there. - * @param batchSize - to restrict the number returned (so that replay - * commands can be batched). - */ - List findSince(UUID interactionId, Integer batchSize); - - /** - * The most recent replayed command previously replicated from primary to - * secondary. - * - *

- * This should always exist except for the very first times - * (after restored the prod DB to secondary). - *

- */ - Optional findMostRecentReplayed(); - - /** - * The most recent completed command, as queried on the - * secondary. - * - *

- * After a restart following the production database being restored - * from primary to secondary, would correspond to the last command - * run on primary before the production database was restored to the - * secondary. - *

- */ - Optional findMostRecentCompleted(); - - List findNotYetReplayed(); - - List findReplayedOnSecondary(); - - C saveForReplay(CommandDto dto); - - List saveForReplay(CommandsDto commandsDto); - - void persist(C commandLog); - - void truncateLog(); - - // -- - - public static class NotFoundException extends RecoverableException { - private static final long serialVersionUID = 1L; - @Getter - private final UUID interactionId; - public NotFoundException(final UUID interactionId) { - super("Command not found"); - this.interactionId = interactionId; - } - } - - default List findCommandsOnPrimaryElseFail( - final @Nullable UUID interactionId, - final @Nullable Integer batchSize) throws NotFoundException { - - final List commands = findSince(interactionId, batchSize); - if(commands == null) { - throw new NotFoundException(interactionId); - } - return commands; - } - - - -} diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java deleted file mode 100644 index 32a8183fcca..00000000000 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.applib.command.ui; - -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.List; -import java.util.UUID; - -import javax.inject.Inject; -import javax.inject.Named; - -import org.springframework.beans.factory.annotation.Qualifier; - -import org.apache.isis.applib.annotation.Action; -import org.apache.isis.applib.annotation.ActionLayout; -import org.apache.isis.applib.annotation.BookmarkPolicy; -import org.apache.isis.applib.annotation.DomainService; -import org.apache.isis.applib.annotation.DomainServiceLayout; -import org.apache.isis.applib.annotation.MemberSupport; -import org.apache.isis.applib.annotation.NatureOfService; -import org.apache.isis.applib.annotation.Optionality; -import org.apache.isis.applib.annotation.Parameter; -import org.apache.isis.applib.annotation.ParameterLayout; -import org.apache.isis.applib.annotation.PriorityPrecedence; -import org.apache.isis.applib.annotation.RestrictTo; -import org.apache.isis.applib.annotation.SemanticsOf; -import org.apache.isis.applib.services.clock.ClockService; -import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; - -import lombok.RequiredArgsConstructor; - -/** - * @since 2.0 {@index} - */ -@Named(IsisModuleExtCommandLogApplib.NAMESPACE + ".CommandLogServiceMenu") -@DomainService( - nature = NatureOfService.VIEW -) -@DomainServiceLayout( - named = "Activity", - menuBar = DomainServiceLayout.MenuBar.SECONDARY -) -@javax.annotation.Priority(PriorityPrecedence.EARLY) -@Qualifier("Jdo") -@RequiredArgsConstructor(onConstructor_ = { @Inject }) -public class CommandLogServiceMenu { - - public static abstract class PropertyDomainEvent - extends IsisModuleExtCommandLogApplib.PropertyDomainEvent { } - public static abstract class CollectionDomainEvent - extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } - public static abstract class ActionDomainEvent - extends IsisModuleExtCommandLogApplib.ActionDomainEvent { - } - - final ICommandLogRepository commandLogRepository; - final ClockService clockService; - - public static class ActiveCommandsDomainEvent extends ActionDomainEvent { } - @Action(domainEvent = ActiveCommandsDomainEvent.class, semantics = SemanticsOf.SAFE, - typeOf = CommandLog.class) - @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT, cssClassFa = "fa-bolt", sequence="10") - public List activeCommands() { - return commandLogRepository.findCurrent(); - } - @MemberSupport public boolean hideActiveCommands() { - return commandLogRepository == null; - } - - - public static class FindCommandsDomainEvent extends ActionDomainEvent { } - @Action(domainEvent = FindCommandsDomainEvent.class, semantics = SemanticsOf.SAFE, - typeOf = CommandLog.class) - @ActionLayout(cssClassFa = "fa-search", sequence="20") - public List findCommands( - @Parameter(optionality= Optionality.OPTIONAL) - @ParameterLayout(named="From") - final LocalDate from, - @Parameter(optionality= Optionality.OPTIONAL) - @ParameterLayout(named="To") - final LocalDate to) { - return commandLogRepository.findByFromAndTo(from, to); - } - @MemberSupport public boolean hideFindCommands() { - return commandLogRepository == null; - } - @MemberSupport public LocalDate default0FindCommands() { - return now().minusDays(7); - } - @MemberSupport public LocalDate default1FindCommands() { - return now(); - } - - - public static class FindCommandByIdDomainEvent extends ActionDomainEvent { } - @Action(domainEvent = FindCommandByIdDomainEvent.class, semantics = SemanticsOf.SAFE) - @ActionLayout(cssClassFa = "fa-crosshairs", sequence="30") - public CommandLog findCommandById( - @ParameterLayout(named="Transaction Id") - final UUID transactionId) { - return commandLogRepository.findByInteractionId(transactionId).orElse(null); - } - @MemberSupport public boolean hideFindCommandById() { - return commandLogRepository == null; - } - - - public static class TruncateLogDomainEvent extends ActionDomainEvent { } - @Action(domainEvent = TruncateLogDomainEvent.class, semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE, restrictTo = RestrictTo.PROTOTYPING) - @ActionLayout(cssClassFa = "fa-trash", sequence="40") - public void truncateLog() { - commandLogRepository.truncateLog(); - } - - - private LocalDate now() { - return clockService.getClock().nowAsLocalDate(ZoneId.systemDefault()); - } - -} - diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java deleted file mode 100644 index 813227f862d..00000000000 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.applib.util; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.sql.Timestamp; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class BigDecimalUtils { - - /** - * @return in seconds, to 3 decimal places. - */ - public static BigDecimal durationBetween(Timestamp startedAt, Timestamp completedAt) { - if (completedAt == null) { - return null; - } else { - long millis = completedAt.getTime() - startedAt.getTime(); - return toSeconds(millis); - } - } - - private static final BigDecimal DIVISOR = new BigDecimal(1000); - - private static BigDecimal toSeconds(long millis) { - return new BigDecimal(millis) - .divide(DIVISOR, RoundingMode.HALF_EVEN) - .setScale(3, RoundingMode.HALF_EVEN); - } - -} diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java b/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java deleted file mode 100644 index 21cb229b9ac..00000000000 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.applib.util; - -import lombok.experimental.UtilityClass; - -@UtilityClass -public class StringUtils { - - public static String trimmed(final String str, final int lengthOfField) { - if (str == null) { - return null; - } - if (str.length() > lengthOfField) { - return str.substring(0, lengthOfField - 3) + "..."; - } - return str; - } -} diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java deleted file mode 100644 index 9afbe85be02..00000000000 --- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.jdo.entities; - -import java.sql.Timestamp; - -import javax.jdo.annotations.IdentityType; - -import org.apache.isis.applib.annotation.DomainObject; -import org.apache.isis.applib.annotation.Editing; -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.command.Command; -import org.apache.isis.applib.types.MemberIdentifierType; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ReplayState; -import org.apache.isis.extensions.commandlog.jdo.IsisModuleExtCommandLogJdo; -import org.apache.isis.schema.cmd.v2.CommandDto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@javax.jdo.annotations.PersistenceCapable( - identityType = IdentityType.APPLICATION, - schema = "isisExtensionsCommandLog", - table = "Command") -@javax.jdo.annotations.Queries( { - @javax.jdo.annotations.Query( - name="findByInteractionIdStr", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE interactionIdStr == :interactionIdStr "), - @javax.jdo.annotations.Query( - name="findByParent", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE parent == :parent "), - @javax.jdo.annotations.Query( - name="findCurrent", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE completedAt == null " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findCompleted", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE completedAt != null " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findRecentByTarget", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE target == :target " - + "ORDER BY this.timestamp DESC " - + "RANGE 0,30"), - @javax.jdo.annotations.Query( - name="findByTargetAndTimestampBetween", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE target == :target " - + "&& timestamp >= :from " - + "&& timestamp <= :to " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findByTargetAndTimestampAfter", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE target == :target " - + "&& timestamp >= :from " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findByTargetAndTimestampBefore", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE target == :target " - + "&& timestamp <= :to " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findByTarget", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE target == :target " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findByTimestampBetween", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE timestamp >= :from " - + "&& timestamp <= :to " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findByTimestampAfter", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE timestamp >= :from " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findByTimestampBefore", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE timestamp <= :to " - + "ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="find", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " ORDER BY this.timestamp DESC"), - @javax.jdo.annotations.Query( - name="findRecentByUsername", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE username == :username " - + "ORDER BY this.timestamp DESC " - + "RANGE 0,30"), - @javax.jdo.annotations.Query( - name="findFirst", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE startedAt != null " - + " && completedAt != null " - + "ORDER BY this.timestamp ASC " - + "RANGE 0,2"), - // this should be RANGE 0,1 but results in DataNucleus submitting "FETCH NEXT ROW ONLY" - // which SQL Server doesn't understand. However, as workaround, SQL Server *does* understand FETCH NEXT 2 ROWS ONLY - @javax.jdo.annotations.Query( - name="findSince", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE timestamp > :timestamp " - + " && startedAt != null " - + " && completedAt != null " - + "ORDER BY this.timestamp ASC"), - // most recent (replayed) command previously replicated from primary to - // secondary. This should always exist except for the very first times - // (after restored the prod DB to secondary). - @javax.jdo.annotations.Query( - name="findMostRecentReplayed", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE (replayState == 'OK' || replayState == 'FAILED') " - + "ORDER BY this.timestamp DESC " - + "RANGE 0,2"), // this should be RANGE 0,1 but results in DataNucleus submitting "FETCH NEXT ROW ONLY" - // which SQL Server doesn't understand. However, as workaround, SQL Server *does* understand FETCH NEXT 2 ROWS ONLY - // the most recent completed command, as queried on the - // secondary, corresponding to the last command run on primary before the - // production database was restored to the secondary - @javax.jdo.annotations.Query( - name="findMostRecentCompleted", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE startedAt != null " - + " && completedAt != null " - + "ORDER BY this.timestamp DESC " - + "RANGE 0,2"), - // this should be RANGE 0,1 but results in DataNucleus submitting "FETCH NEXT ROW ONLY" - // which SQL Server doesn't understand. However, as workaround, SQL Server *does* understand FETCH NEXT 2 ROWS ONLY - @javax.jdo.annotations.Query( - name="findNotYetReplayed", - value="SELECT " - + "FROM " + CommandJdo.FQCN - + " WHERE replayState == 'PENDING' " - + "ORDER BY this.timestamp ASC " - + "RANGE 0,10"), // same as batch size -// @javax.jdo.annotations.Query( -// name="findReplayableInErrorMostRecent", -// value="SELECT " -// + "FROM " + CommandJdo.FQCN -// + " WHERE replayState == 'FAILED' " -// + "ORDER BY this.timestamp DESC " -// + "RANGE 0,2"), -// @javax.jdo.annotations.Query( -// name="findReplayableMostRecentStarted", -// value="SELECT " -// + "FROM " + CommandJdo.FQCN -// + " WHERE replayState = 'PENDING' " -// + "ORDER BY this.timestamp DESC " -// + "RANGE 0,20"), -}) -@javax.jdo.annotations.Indices({ - @javax.jdo.annotations.Index(name = "CommandJdo__startedAt__timestamp__IDX", members = { "startedAt", "timestamp" }), - @javax.jdo.annotations.Index(name = "CommandJdo__timestamp__IDX", members = { "timestamp" }), -// @javax.jdo.annotations.Index(name = "CommandJdo__replayState__timestamp__startedAt_IDX", members = { "replayState", "timestamp", "startedAt"}), -// @javax.jdo.annotations.Index(name = "CommandJdo__replayState__startedAt__completedAt_IDX", members = {"startedAt", "replayState", "completedAt"}), -}) - -// @javax.jdo.annotations.Query( -// name="findReplayableInErrorMostRecent", -// value="SELECT " -// + "FROM " + CommandJdo.FQCN -// + " WHERE replayState == 'FAILED' " -// + "ORDER BY this.timestamp DESC " -// + "RANGE 0,2"), -// @javax.jdo.annotations.Query( -// name="findReplayableMostRecentStarted", -// value="SELECT " -// + "FROM " + CommandJdo.FQCN -// + " WHERE replayState = 'PENDING' " -// + "ORDER BY this.timestamp DESC " -// + "RANGE 0,20"), -@DomainObject( - logicalTypeName = CommandJdo.LOGICAL_TYPE_NAME, - editing = Editing.DISABLED -) -//@Log4j2 -@NoArgsConstructor -public class CommandJdo -extends CommandLog { - - protected final static String LOGICAL_TYPE_NAME = IsisModuleExtCommandLogJdo.NAMESPACE + ".CommandJdo"; - protected final static String FQCN = "org.apache.isis.extensions.commandlog.jdo.entities.CommandJdo"; - - /** - * Intended for use on primary system. - * - * @param command - */ - public CommandJdo(final Command command) { - super(command); - } - - /** - * Intended for use on secondary (replay) system. - * - * @param commandDto - obtained from the primary system as a representation of a command invocation - * @param replayState - controls whether this is to be replayed - * @param targetIndex - if the command represents a bulk action, then it is flattened out when replayed; this indicates which target to execute against. - */ - public CommandJdo( - final CommandDto commandDto, - final ReplayState replayState, - final int targetIndex) { - super(commandDto, replayState, targetIndex); - } - - @javax.jdo.annotations.PrimaryKey - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="false", name = "interactionId", length = 36) - @Getter @Setter - private String interactionIdStr; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="false", length = 50) - @Getter @Setter - private String username; - - @javax.jdo.annotations.Column(allowsNull="false") - @Getter @Setter - private Timestamp timestamp; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="true", length=10) - @Getter @Setter - private ReplayState replayState; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="true", length=255) - @Getter @Setter - private String replayStateFailureReason; - - @javax.jdo.annotations.Column(name="parentId", allowsNull="true") - @Getter @Setter - private CommandLog parent; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="true", length = 2000, name="target") - @Getter @Setter - private Bookmark target; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="false", length = MemberIdentifierType.Meta.MAX_LEN) - @Getter @Setter - private String logicalMemberIdentifier; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="true", jdbcType="CLOB") - @Getter @Setter - private CommandDto commandDto; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="true") - @Getter @Setter - private Timestamp startedAt; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="true") - @Getter @Setter - private Timestamp completedAt; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="true", length = 2000, name="result") - @Getter @Setter - private Bookmark result; - - @javax.jdo.annotations.Persistent - @javax.jdo.annotations.Column(allowsNull="true", jdbcType="CLOB") - @Getter @Setter - private String exception; - -} - diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java b/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java deleted file mode 100644 index 5096f51b678..00000000000 --- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.jdo.entities; - -import java.sql.Timestamp; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Provider; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Service; - -import org.apache.isis.applib.annotation.PriorityPrecedence; -import org.apache.isis.applib.annotation.Programmatic; -import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling; -import org.apache.isis.applib.query.Query; -import org.apache.isis.applib.query.QueryRange; -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.command.Command; -import org.apache.isis.applib.services.iactn.InteractionProvider; -import org.apache.isis.applib.services.repository.RepositoryService; -import org.apache.isis.applib.util.schema.CommandDtoUtils; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; -import org.apache.isis.extensions.commandlog.applib.command.ReplayState; -import org.apache.isis.extensions.commandlog.jdo.IsisModuleExtCommandLogJdo; -import org.apache.isis.persistence.jdo.applib.services.JdoSupportService; -import org.apache.isis.schema.cmd.v2.CommandDto; -import org.apache.isis.schema.cmd.v2.CommandsDto; -import org.apache.isis.schema.cmd.v2.MapDto; -import org.apache.isis.schema.common.v2.InteractionType; -import org.apache.isis.schema.common.v2.OidDto; - -import lombok.RequiredArgsConstructor; -import lombok.val; - -/** - * Provides supporting functionality for querying and persisting - * {@link CommandJdo command} entities. - */ -@Service -@Named(IsisModuleExtCommandLogJdo.NAMESPACE + ".CommandJdoRepository") -@javax.annotation.Priority(PriorityPrecedence.MIDPOINT) -@Qualifier("Jdo") -@RequiredArgsConstructor -//@Log4j2 -public class CommandJdoRepository -implements ICommandLogRepository { - - @Inject final Provider interactionProviderProvider; - @Inject final Provider repositoryServiceProvider; - @Inject final JdoSupportService jdoSupport; - - @Override - public CommandJdo createCommandLog(final Command command) { - return new CommandJdo(command); - } - - @Override - public List findByFromAndTo( - final @Nullable LocalDate from, - final @Nullable LocalDate to) { - final Timestamp fromTs = toTimestampStartOfDayWithOffset(from, 0); - final Timestamp toTs = toTimestampStartOfDayWithOffset(to, 1); - - final Query query; - if(from != null) { - if(to != null) { - query = Query.named(CommandJdo.class, "findByTimestampBetween") - .withParameter("from", fromTs) - .withParameter("to", toTs); - } else { - query = Query.named(CommandJdo.class, "findByTimestampAfter") - .withParameter("from", fromTs); - } - } else { - if(to != null) { - query = Query.named(CommandJdo.class, "findByTimestampBefore") - .withParameter("to", toTs); - } else { - query = Query.named(CommandJdo.class, "find"); - } - } - return repositoryService().allMatches(query); - } - - @Override - public Optional findByInteractionId(final UUID interactionId) { - return repositoryService().firstMatch( - Query.named(CommandJdo.class, "findByInteractionIdStr") - .withParameter("interactionIdStr", interactionId.toString())); - } - - @Override - public List findByParent(final ICommandLog parent) { - return repositoryService().allMatches( - Query.named(CommandJdo.class, "findByParent") - .withParameter("parent", parent)); - } - - @Override - public List findCurrent() { - return repositoryService().allMatches( - Query.named(CommandJdo.class, "findCurrent")); - } - - @Override - public List findCompleted() { - return repositoryService().allMatches( - Query.named(CommandJdo.class, "findCompleted")); - } - - @Override - public List findByTargetAndFromAndTo( - final Bookmark target, - final @Nullable LocalDate from, - final @Nullable LocalDate to) { - - final Timestamp fromTs = toTimestampStartOfDayWithOffset(from, 0); - final Timestamp toTs = toTimestampStartOfDayWithOffset(to, 1); - - final Query query; - if(from != null) { - if(to != null) { - query = Query.named(CommandJdo.class, "findByTargetAndTimestampBetween") - .withParameter("target", target) - .withParameter("from", fromTs) - .withParameter("to", toTs); - } else { - query = Query.named(CommandJdo.class, "findByTargetAndTimestampAfter") - .withParameter("target", target) - .withParameter("from", fromTs); - } - } else { - if(to != null) { - query = Query.named(CommandJdo.class, "findByTargetAndTimestampBefore") - .withParameter("target", target) - .withParameter("to", toTs); - } else { - query = Query.named(CommandJdo.class, "findByTarget") - .withParameter("target", target); - } - } - return repositoryService().allMatches(query); - } - - private static Timestamp toTimestampStartOfDayWithOffset( - final @Nullable LocalDate dt, - final int daysOffset) { - - return dt!=null - ? new java.sql.Timestamp( - Instant.from(dt.atStartOfDay().plusDays(daysOffset).atZone(ZoneId.systemDefault())) - .toEpochMilli()) - : null; - } - - @Override - public List findRecentByUsername(final String username) { - return repositoryService().allMatches( - Query.named(CommandJdo.class, "findRecentByUsername") - .withParameter("username", username)); - } - - @Override - public List findRecentByTarget(final Bookmark target) { - return repositoryService().allMatches( - Query.named(CommandJdo.class, "findRecentByTarget") - .withParameter("target", target)); - } - - @Override - public List findSince(final UUID interactionId, final Integer batchSize) { - if(interactionId == null) { - return findFirst(); - } - final CommandJdo from = findByInteractionIdElseNull(interactionId); - if(from == null) { - return Collections.emptyList(); - } - return findSince(from.getTimestamp(), batchSize); - } - - private List findFirst() { - Optional firstCommandIfAny = repositoryService().firstMatch( - Query.named(CommandJdo.class, "findFirst")); - return firstCommandIfAny - .map(Collections::singletonList) - .orElse(Collections.emptyList()); - } - - - private CommandJdo findByInteractionIdElseNull(final UUID interactionId) { - val q = Query.named(CommandJdo.class, "findByInteractionIdStr") - .withParameter("interactionIdStr", interactionId.toString()); - return repositoryService().uniqueMatch(q).orElse(null); - } - - private List findSince( - final Timestamp timestamp, - final Integer batchSize) { - - // DN generates incorrect SQL for SQL Server if count set to 1; so we set to 2 and then trim - // XXX that's a historic workaround, should rather be fixed upstream - val needsTrimFix = batchSize != null && batchSize == 1; - - val q = Query.named(CommandJdo.class, "findSince") - .withParameter("timestamp", timestamp) - .withRange(QueryRange.limit( - needsTrimFix ? 2L : batchSize - )); - - final List commandJdos = repositoryService().allMatches(q); - return needsTrimFix && commandJdos.size() > 1 - ? commandJdos.subList(0,1) - : commandJdos; - } - - - @Override - public Optional findMostRecentReplayed() { - - return repositoryService().firstMatch( - Query.named(CommandJdo.class, "findMostRecentReplayed")); - } - - @Override - public Optional findMostRecentCompleted() { - return repositoryService().firstMatch( - Query.named(CommandJdo.class, "findMostRecentCompleted")); - } - - @Override - public List findNotYetReplayed() { - return repositoryService().allMatches( - Query.named(CommandJdo.class, "findNotYetReplayed").withLimit(10)); - } - - @Override - public List findReplayedOnSecondary() { - return repositoryService().allMatches( - Query.named(CommandJdo.class, "findReplayableMostRecentStarted")); - } - - @Override - public List saveForReplay(final CommandsDto commandsDto) { - List commandDto = commandsDto.getCommandDto(); - List commands = new ArrayList<>(); - for (final CommandDto dto : commandDto) { - commands.add(saveForReplay(dto)); - } - return commands; - } - - @Programmatic - @Override - public CommandJdo saveForReplay(final CommandDto dto) { - - if(dto.getMember().getInteractionType() == InteractionType.ACTION_INVOCATION) { - final MapDto userData = dto.getUserData(); - if (userData == null ) { - throw new IllegalStateException(String.format( - "Can only persist action DTOs with additional userData; got: \n%s", - CommandDtoUtils.toXml(dto))); - } - } - - final CommandJdo commandJdo = new CommandJdo(); - - commandJdo.setInteractionIdStr(dto.getInteractionId()); - commandJdo.setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(dto.getTimestamp())); - commandJdo.setUsername(dto.getUser()); - - commandJdo.setReplayState(ReplayState.PENDING); - - final OidDto firstTarget = dto.getTargets().getOid().get(0); - commandJdo.setTarget(Bookmark.forOidDto(firstTarget)); - commandJdo.setCommandDto(dto); - commandJdo.setLogicalMemberIdentifier(dto.getMember().getLogicalMemberIdentifier()); - - persist(commandJdo); - - return commandJdo; - } - - @Override - public void persist(final CommandJdo commandJdo) { - repositoryService().persist(commandJdo); - } - - @Override - public void truncateLog() { - repositoryService().removeAll(CommandJdo.class); - } - - private RepositoryService repositoryService() { - return repositoryServiceProvider.get(); - } - -} diff --git a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java b/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java deleted file mode 100644 index fdad490d967..00000000000 --- a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.jpa.entities; - -import java.sql.Timestamp; - -import javax.persistence.Basic; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EntityListeners; -import javax.persistence.FetchType; -import javax.persistence.Id; -import javax.persistence.Index; -import javax.persistence.JoinColumn; -import javax.persistence.Lob; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.Table; - -import org.apache.isis.applib.annotation.DomainObject; -import org.apache.isis.applib.annotation.Editing; -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.command.Command; -import org.apache.isis.applib.types.MemberIdentifierType; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ReplayState; -import org.apache.isis.extensions.commandlog.jpa.IsisModuleExtCommandLogJpa; -import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; -import org.apache.isis.schema.cmd.v2.CommandDto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@Table( - schema = "isisExtensionsCommandLog", - name = "Command", - indexes = { - @Index(name = "CommandJdo__startedAt__timestamp__IDX", columnList = "startedAt, timestamp" ), - @Index(name = "CommandJdo__timestamp__IDX", columnList = "timestamp"), -// @javax.jdo.annotations.Index(name = "CommandJdo__replayState__timestamp__startedAt_IDX", members = { "replayState", "timestamp", "startedAt"}), -// @javax.jdo.annotations.Index(name = "CommandJdo__replayState__startedAt__completedAt_IDX", members = {"startedAt", "replayState", "completedAt"}), - } -) -@NamedQueries({ - @NamedQuery( - name="findByInteractionIdStr", - query=CommandJpa.SELECT_FROM - + "WHERE cl.interactionIdStr = :interactionIdStr"), - @NamedQuery( - name="findByParent", - query=CommandJpa.SELECT_FROM - + "WHERE cl.parent = :parent "), - @NamedQuery( - name="findCurrent", - query=CommandJpa.SELECT_FROM - + "WHERE cl.completedAt is null " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findCompleted", - query=CommandJpa.SELECT_FROM - + "WHERE cl.completedAt is not null " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findRecentByTarget", - query=CommandJpa.SELECT_FROM - + "WHERE cl.target = :target " - + "ORDER BY cl.timestamp DESC"), // programmatic LIMIT 30 - @NamedQuery( - name="findByTargetAndTimestampBetween", - query=CommandJpa.SELECT_FROM - + "WHERE cl.target = :target " - + " AND cl.timestamp >= :from " - + " AND cl.timestamp <= :to " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findByTargetAndTimestampAfter", - query=CommandJpa.SELECT_FROM - + "WHERE cl.target = :target " - + " AND cl.timestamp >= :from " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findByTargetAndTimestampBefore", - query=CommandJpa.SELECT_FROM - + "WHERE cl.target = :target " - + " AND cl.timestamp <= :to " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findByTarget", - query=CommandJpa.SELECT_FROM - + "WHERE cl.target = :target " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findByTimestampBetween", - query=CommandJpa.SELECT_FROM - + "WHERE cl.timestamp >= :from " - + " AND cl.timestamp <= :to " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findByTimestampAfter", - query=CommandJpa.SELECT_FROM - + "WHERE cl.timestamp >= :from " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findByTimestampBefore", - query=CommandJpa.SELECT_FROM - + "WHERE cl.timestamp <= :to " - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="find", - query=CommandJpa.SELECT_FROM - + "ORDER BY cl.timestamp DESC"), - @NamedQuery( - name="findRecentByUsername", - query=CommandJpa.SELECT_FROM - + "WHERE cl.username = :username " - + "ORDER BY cl.timestamp DESC"), // programmatic LIMIT 30 - @NamedQuery( - name="findFirst", - query=CommandJpa.SELECT_FROM - + "WHERE cl.startedAt is not null " - + " AND cl.completedAt is not null " - + "ORDER BY cl.timestamp ASC"), // programmatic LIMIT 1 - @NamedQuery( - name="findSince", - query=CommandJpa.SELECT_FROM - + "WHERE cl.timestamp > :timestamp " - + " AND cl.startedAt is not null " - + " AND cl.completedAt is not null " - + "ORDER BY cl.timestamp ASC"), - // most recent (replayed) command previously replicated from primary to - // secondary. This should always exist except for the very first times - // (after restored the prod DB to secondary). - @NamedQuery( - name="findMostRecentReplayed", - query=CommandJpa.SELECT_FROM - + "WHERE (cl.replayState = 'OK' OR cl.replayState = 'FAILED') " - + "ORDER BY cl.timestamp DESC"), // programmatic LIMIT 1 - @NamedQuery( - name="findMostRecentCompleted", - query=CommandJpa.SELECT_FROM - + "WHERE cl.startedAt is not null " - + " AND cl.completedAt is not null " - + "ORDER BY cl.timestamp DESC"), // programmatic LIMIT 1 - @NamedQuery( - name="findNotYetReplayed", - query=CommandJpa.SELECT_FROM - + "WHERE cl.replayState = 'PENDING' " - + "ORDER BY cl.timestamp ASC"), // programmatic LIMIT 10 -}) - -// @javax.jdo.annotations.Query( -// name="findReplayableInErrorMostRecent", -// value="SELECT " -// + "FROM " + CommandJdo.FQCN -// + " WHERE replayState == 'FAILED' " -// + "ORDER BY this.timestamp DESC " -// + "RANGE 0,2"), -// @javax.jdo.annotations.Query( -// name="findReplayableMostRecentStarted", -// value="SELECT " -// + "FROM " + CommandJdo.FQCN -// + " WHERE replayState = 'PENDING' " -// + "ORDER BY this.timestamp DESC " -// + "RANGE 0,20"), - -@DomainObject( - logicalTypeName = CommandJpa.LOGICAL_TYPE_NAME, - editing = Editing.DISABLED) -@EntityListeners(IsisEntityListener.class) -@NoArgsConstructor -public class CommandJpa extends CommandLog { - - public final static String LOGICAL_TYPE_NAME = IsisModuleExtCommandLogJpa.NAMESPACE + ".CommandJpa"; - - public final static String SELECT_FROM = "SELECT cl FROM CommandJpa cl "; - - /** - * Intended for use on primary system. - * - * @param command - */ - public CommandJpa(final Command command) { - super(command); - } - - /** - * Intended for use on secondary (replay) system. - * - * @param commandDto - obtained from the primary system as a representation of a command invocation - * @param replayState - controls whether this is to be replayed - * @param targetIndex - if the command represents a bulk action, then it is flattened out when replayed; this indicates which target to execute against. - */ - public CommandJpa( - final CommandDto commandDto, - final ReplayState replayState, - final int targetIndex) { - super(commandDto, replayState, targetIndex); - } - - @Id - @Column(nullable=false, name = "interactionId", length = 36) - @Getter @Setter - private String interactionIdStr; - - @Column(nullable=false, length = 50) - @Getter @Setter - private String username; - - @Column(nullable=false) - @Getter @Setter - private Timestamp timestamp; - - @Column(nullable=true, length=10) - @Getter @Setter - private ReplayState replayState; - - @Column(nullable=true, length=255) - @Getter @Setter - private String replayStateFailureReason; - - @ManyToOne - @JoinColumn(name="parentId", nullable=true) - private CommandJpa parent; - @Override - public CommandJpa getParent() { - return parent; - } - @Override - public void setParent(final CommandLog parent) { - this.parent = (CommandJpa)parent; - } - - @Column(nullable=true, length = 2000, name="target") - @Getter @Setter - private Bookmark target; - - @Column(nullable=false, length = MemberIdentifierType.Meta.MAX_LEN) - @Getter @Setter - private String logicalMemberIdentifier; - - @Lob @Basic(fetch=FetchType.LAZY) - @Column(nullable=true, columnDefinition="CLOB") - @Getter @Setter - private CommandDto commandDto; - - @Column(nullable=true) - @Getter @Setter - private Timestamp startedAt; - - @Column(nullable=true) - @Getter @Setter - private Timestamp completedAt; - - @Column(nullable=true, length = 2000, name="result") - @Getter @Setter - private Bookmark result; - - @Lob @Basic(fetch=FetchType.LAZY) - @Column(nullable=true, columnDefinition="CLOB") - @Getter @Setter - private String exception; - -} diff --git a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java b/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java deleted file mode 100644 index 54cfc9a053e..00000000000 --- a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.extensions.commandlog.jpa.entities; - -import java.sql.Timestamp; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Provider; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Service; - -import org.apache.isis.applib.annotation.PriorityPrecedence; -import org.apache.isis.applib.annotation.Programmatic; -import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling; -import org.apache.isis.applib.query.Query; -import org.apache.isis.applib.query.QueryRange; -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.command.Command; -import org.apache.isis.applib.services.iactn.InteractionProvider; -import org.apache.isis.applib.services.repository.RepositoryService; -import org.apache.isis.applib.util.schema.CommandDtoUtils; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; -import org.apache.isis.extensions.commandlog.applib.command.ReplayState; -import org.apache.isis.extensions.commandlog.jpa.IsisModuleExtCommandLogJpa; -import org.apache.isis.schema.cmd.v2.CommandDto; -import org.apache.isis.schema.cmd.v2.CommandsDto; -import org.apache.isis.schema.cmd.v2.MapDto; -import org.apache.isis.schema.common.v2.InteractionType; -import org.apache.isis.schema.common.v2.OidDto; - -import lombok.RequiredArgsConstructor; -import lombok.val; - -/** - * Provides supporting functionality for querying and persisting - * {@link CommandJpa command} entities. - */ -@Service -@Named(IsisModuleExtCommandLogJpa.NAMESPACE + ".CommandJpaRepository") -@javax.annotation.Priority(PriorityPrecedence.MIDPOINT) -@Qualifier("Jpa") -@RequiredArgsConstructor -//@Log4j2 -public class CommandJpaRepository -implements ICommandLogRepository { - - @Inject final Provider interactionProviderProvider; - @Inject final Provider repositoryServiceProvider; - - @Override - public CommandJpa createCommandLog(final Command command) { - return new CommandJpa(command); - } - - @Override - public List findByFromAndTo( - final @Nullable LocalDate from, - final @Nullable LocalDate to) { - final Timestamp fromTs = toTimestampStartOfDayWithOffset(from, 0); - final Timestamp toTs = toTimestampStartOfDayWithOffset(to, 1); - - final Query query; - if(from != null) { - if(to != null) { - query = Query.named(CommandJpa.class, "findByTimestampBetween") - .withParameter("from", fromTs) - .withParameter("to", toTs); - } else { - query = Query.named(CommandJpa.class, "findByTimestampAfter") - .withParameter("from", fromTs); - } - } else { - if(to != null) { - query = Query.named(CommandJpa.class, "findByTimestampBefore") - .withParameter("to", toTs); - } else { - query = Query.named(CommandJpa.class, "find"); - } - } - return repositoryService().allMatches(query); - } - - @Override - public Optional findByInteractionId(final UUID interactionId) { - return repositoryService().firstMatch( - Query.named(CommandJpa.class, "findByInteractionIdStr") - .withParameter("interactionIdStr", interactionId.toString())); - } - - @Override - public List findByParent(final ICommandLog parent) { - return repositoryService().allMatches( - Query.named(CommandJpa.class, "findByParent") - .withParameter("parent", parent)); - } - - @Override - public List findCurrent() { - return repositoryService().allMatches( - Query.named(CommandJpa.class, "findCurrent")); - } - - @Override - public List findCompleted() { - return repositoryService().allMatches( - Query.named(CommandJpa.class, "findCompleted")); - } - - @Override - public List findByTargetAndFromAndTo( - final Bookmark target, - final @Nullable LocalDate from, - final @Nullable LocalDate to) { - - final Timestamp fromTs = toTimestampStartOfDayWithOffset(from, 0); - final Timestamp toTs = toTimestampStartOfDayWithOffset(to, 1); - - final Query query; - if(from != null) { - if(to != null) { - query = Query.named(CommandJpa.class, "findByTargetAndTimestampBetween") - .withParameter("target", target) - .withParameter("from", fromTs) - .withParameter("to", toTs); - } else { - query = Query.named(CommandJpa.class, "findByTargetAndTimestampAfter") - .withParameter("target", target) - .withParameter("from", fromTs); - } - } else { - if(to != null) { - query = Query.named(CommandJpa.class, "findByTargetAndTimestampBefore") - .withParameter("target", target) - .withParameter("to", toTs); - } else { - query = Query.named(CommandJpa.class, "findByTarget") - .withParameter("target", target); - } - } - return repositoryService().allMatches(query); - } - - private static Timestamp toTimestampStartOfDayWithOffset( - final @Nullable LocalDate dt, - final int daysOffset) { - - return dt!=null - ? new java.sql.Timestamp( - Instant.from(dt.atStartOfDay().plusDays(daysOffset).atZone(ZoneId.systemDefault())) - .toEpochMilli()) - : null; - } - - @Override - public List findRecentByUsername(final String username) { - return repositoryService().allMatches( - Query.named(CommandJpa.class, "findRecentByUsername") - .withParameter("username", username) - .withLimit(30)); - } - - @Override - public List findRecentByTarget(final Bookmark target) { - return repositoryService().allMatches( - Query.named(CommandJpa.class, "findRecentByTarget") - .withParameter("target", target) - .withLimit(30)); - } - - @Override - public List findSince(final UUID interactionId, final Integer batchSize) { - if(interactionId == null) { - return findFirst(); - } - final CommandJpa from = findByInteractionIdElseNull(interactionId); - if(from == null) { - return Collections.emptyList(); - } - return findSince(from.getTimestamp(), batchSize); - } - - private List findFirst() { - Optional firstCommandIfAny = repositoryService().firstMatch( - Query.named(CommandJpa.class, "findFirst")); - return firstCommandIfAny - .map(Collections::singletonList) - .orElse(Collections.emptyList()); - } - - - private CommandJpa findByInteractionIdElseNull(final UUID interactionId) { - return null; - //TODO migrate to JPA -// val tsq = jdoSupport.newTypesafeQuery(CommandJpa.class); -// val cand = QCommandJdo.candidate(); -// val q = tsq.filter( -// cand.interactionIdStr.eq(tsq.parameter("interactionIdStr", String.class)) -// ); -// q.setParameter("interactionIdStr", interactionId.toString()); -// return q.executeUnique(); - } - - private List findSince( - final Timestamp timestamp, - final Integer batchSize) { - - // DN generates incorrect SQL for SQL Server if count set to 1; so we set to 2 and then trim - // XXX that's a historic workaround, should rather be fixed upstream - val needsTrimFix = batchSize != null && batchSize == 1; - - val q = Query.named(CommandJpa.class, "findSince") - .withParameter("timestamp", timestamp) - .withRange(QueryRange.limit( - needsTrimFix ? 2L : batchSize - )); - - final List commandJdos = repositoryService().allMatches(q); - return needsTrimFix && commandJdos.size() > 1 - ? commandJdos.subList(0,1) - : commandJdos; - } - - - @Override - public Optional findMostRecentReplayed() { - return repositoryService().firstMatch( - Query.named(CommandJpa.class, "findMostRecentReplayed")); - } - - @Override - public Optional findMostRecentCompleted() { - return repositoryService().firstMatch( - Query.named(CommandJpa.class, "findMostRecentCompleted")); - } - - @Override - public List findNotYetReplayed() { - return repositoryService().allMatches( - Query.named(CommandJpa.class, "findNotYetReplayed")); - } - - @Override - public List findReplayedOnSecondary() { - return repositoryService().allMatches( - Query.named(CommandJpa.class, "findReplayableMostRecentStarted")); - } - - @Override - public List saveForReplay(final CommandsDto commandsDto) { - List commandDto = commandsDto.getCommandDto(); - List commands = new ArrayList<>(); - for (final CommandDto dto : commandDto) { - commands.add(saveForReplay(dto)); - } - return commands; - } - - @Programmatic - @Override - public CommandJpa saveForReplay(final CommandDto dto) { - - if(dto.getMember().getInteractionType() == InteractionType.ACTION_INVOCATION) { - final MapDto userData = dto.getUserData(); - if (userData == null ) { - throw new IllegalStateException(String.format( - "Can only persist action DTOs with additional userData; got: \n%s", - CommandDtoUtils.toXml(dto))); - } - } - - final CommandJpa commandJdo = new CommandJpa(); - - commandJdo.setInteractionIdStr(dto.getInteractionId()); - commandJdo.setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(dto.getTimestamp())); - commandJdo.setUsername(dto.getUser()); - - commandJdo.setReplayState(ReplayState.PENDING); - - final OidDto firstTarget = dto.getTargets().getOid().get(0); - commandJdo.setTarget(Bookmark.forOidDto(firstTarget)); - commandJdo.setCommandDto(dto); - commandJdo.setLogicalMemberIdentifier(dto.getMember().getLogicalMemberIdentifier()); - - persist(commandJdo); - - return commandJdo; - } - - @Override - public void persist(final CommandJpa commandJdo) { - repositoryService().persist(commandJdo); - } - - @Override - public void truncateLog() { - repositoryService().removeAll(CommandJpa.class); - } - - private RepositoryService repositoryService() { - return repositoryServiceProvider.get(); - } - - -} diff --git a/extensions/core/command-replay/adoc/modules/command-replay/partials/module-nav.adoc b/extensions/core/command-replay/adoc/modules/command-replay/partials/module-nav.adoc deleted file mode 100644 index 7dcc4c7634d..00000000000 --- a/extensions/core/command-replay/adoc/modules/command-replay/partials/module-nav.adoc +++ /dev/null @@ -1,5 +0,0 @@ - - -** xref:userguide:command-replay:about.adoc[Command Replay] - - diff --git a/extensions/core/command-log/adoc/antora.yml b/extensions/core/commandlog/adoc/antora.yml similarity index 100% rename from extensions/core/command-log/adoc/antora.yml rename to extensions/core/commandlog/adoc/antora.yml diff --git a/extensions/core/command-log/adoc/modules/command-log/nav.adoc b/extensions/core/commandlog/adoc/modules/command-log/nav.adoc similarity index 100% rename from extensions/core/command-log/adoc/modules/command-log/nav.adoc rename to extensions/core/commandlog/adoc/modules/command-log/nav.adoc diff --git a/extensions/core/command-log/adoc/modules/command-log/pages/about.adoc b/extensions/core/commandlog/adoc/modules/command-log/pages/about.adoc similarity index 87% rename from extensions/core/command-log/adoc/modules/command-log/pages/about.adoc rename to extensions/core/commandlog/adoc/modules/command-log/pages/about.adoc index f29d3d62219..0df1ae270fb 100644 --- a/extensions/core/command-log/adoc/modules/command-log/pages/about.adoc +++ b/extensions/core/commandlog/adoc/modules/command-log/pages/about.adoc @@ -1,4 +1,4 @@ -[[command-log]] +[[commandlog]] = Command Log :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. @@ -6,7 +6,7 @@ WARNING: TODO: v2 - this code has not yet been brought into the framework. -The _command-log_ module provides an implementation that persists xref:refguide:applib:index/services/command/Command.adoc[Command]s using the xref:pjdo:ROOT:about.adoc[JDO/DataNucleus] object store. +The _commandlog_ module provides an implementation that persists xref:refguide:applib:index/services/command/Command.adoc[Command]s using the xref:pjdo:ROOT:about.adoc[JDO/DataNucleus] object store. //It further provides a number of supporting services: // diff --git a/extensions/core/commandlog/adoc/modules/command-log/partials/module-nav.adoc b/extensions/core/commandlog/adoc/modules/command-log/partials/module-nav.adoc new file mode 100644 index 00000000000..c5a20ea7af4 --- /dev/null +++ b/extensions/core/commandlog/adoc/modules/command-log/partials/module-nav.adoc @@ -0,0 +1,6 @@ + + + +** xref:userguide:commandlog:about.adoc[Command Log] + + diff --git a/extensions/core/command-log/applib/pom.xml b/extensions/core/commandlog/applib/pom.xml similarity index 92% rename from extensions/core/command-log/applib/pom.xml rename to extensions/core/commandlog/applib/pom.xml index d2a7401edf5..714c146b543 100644 --- a/extensions/core/command-log/applib/pom.xml +++ b/extensions/core/commandlog/applib/pom.xml @@ -15,11 +15,11 @@ org.apache.isis.extensions - isis-extensions-command-log + isis-extensions-commandlog 2.0.0-SNAPSHOT - isis-extensions-command-log-applib + isis-extensions-commandlog-applib Apache Isis Ext - Command Log API @@ -65,20 +65,16 @@ org.apache.isis.core isis-core-runtimeservices - - - org.datanucleus - javax.jdo - + - + org.apache.isis.testing isis-testing-unittestsupport-applib test - + org.apache.isis.testing isis-testing-integtestsupport-applib diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java similarity index 80% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java index c8190ff094e..b83122a8f78 100644 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java @@ -18,13 +18,20 @@ */ package org.apache.isis.extensions.commandlog.applib; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + import org.apache.isis.core.config.util.SpringProfileUtil; import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures; -public interface IsisModuleExtCommandLogApplib -extends ModuleWithFixtures { +@Configuration +@Import({ +}) +public class IsisModuleExtCommandLogApplib +implements ModuleWithFixtures { public static final String NAMESPACE = "isis.ext.commandLog"; + public static final String SCHEMA = "isisExtCommandLog"; public abstract static class TitleUiEvent extends org.apache.isis.applib.events.ui.TitleUiEvent { } @@ -55,11 +62,11 @@ public abstract static class PropertyDomainEvent public static void honorSystemEnvironment() { if("true".equalsIgnoreCase(System.getenv("PRIMARY"))) { - SpringProfileUtil.removeActiveProfile("command-replay-secondary"); // just in case - SpringProfileUtil.addActiveProfile("command-replay-primary"); + SpringProfileUtil.removeActiveProfile("commandreplay-secondary"); // just in case + SpringProfileUtil.addActiveProfile("commandreplay-primary"); } else if("true".equalsIgnoreCase(System.getenv("SECONDARY"))) { - SpringProfileUtil.removeActiveProfile("command-replay-primary"); // just in case - SpringProfileUtil.addActiveProfile("command-replay-secondary"); + SpringProfileUtil.removeActiveProfile("commandreplay-primary"); // just in case + SpringProfileUtil.addActiveProfile("commandreplay-secondary"); } } diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/app/CommandLogServiceMenu.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/app/CommandLogServiceMenu.java new file mode 100644 index 00000000000..feda33b9134 --- /dev/null +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/app/CommandLogServiceMenu.java @@ -0,0 +1,149 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.extensions.commandlog.applib.app; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.List; +import java.util.UUID; + +import javax.annotation.Nullable; +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.BookmarkPolicy; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.DomainServiceLayout; +import org.apache.isis.applib.annotation.MemberSupport; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.PriorityPrecedence; +import org.apache.isis.applib.annotation.RestrictTo; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.services.clock.ClockService; +import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; + +import lombok.RequiredArgsConstructor; + +/** + * @since 2.0 {@index} + */ +@Named(CommandLogServiceMenu.LOGICAL_TYPE_NAME) +@DomainService( + nature = NatureOfService.VIEW +) +@DomainServiceLayout( + named = "Activity", + menuBar = DomainServiceLayout.MenuBar.SECONDARY +) +@javax.annotation.Priority(PriorityPrecedence.EARLY) +@RequiredArgsConstructor(onConstructor_ = { @Inject }) +public class CommandLogServiceMenu { + + public static final String LOGICAL_TYPE_NAME = + IsisModuleExtCommandLogApplib.NAMESPACE + ".CommandLogServiceMenu"; + + public static abstract class ActionDomainEvent + extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } + + + final CommandLogEntryRepository commandLogEntryRepository; + final ClockService clockService; + + + @Action( + domainEvent = activeCommands.DomainEvent.class, + semantics = SemanticsOf.SAFE, + typeOf = CommandLogEntry.class + ) + @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT, cssClassFa = "fa-bolt", sequence="10") + public class activeCommands { + public class DomainEvent extends ActionDomainEvent { } + + @MemberSupport public List act() { + return commandLogEntryRepository.findCurrent(); + } + } + + + + @Action( + domainEvent = findCommands.DomainEvent.class, + semantics = SemanticsOf.SAFE, + typeOf = CommandLogEntry.class + ) + @ActionLayout(cssClassFa = "fa-search", sequence="20") + public class findCommands { + + public class DomainEvent extends ActionDomainEvent { } + + @MemberSupport public List act( + final @Nullable LocalDate from, + final @Nullable LocalDate to) { + return commandLogEntryRepository.findByFromAndTo(from, to); + } + @MemberSupport public LocalDate default0Act() { + return now().minusDays(7); + } + @MemberSupport public LocalDate default1Act() { + return now(); + } + } + + + @Action( + domainEvent = findCommandById.DomainEvent.class, + semantics = SemanticsOf.SAFE + ) + @ActionLayout(cssClassFa = "fa-crosshairs", sequence="30") + public class findCommandById { + public class DomainEvent extends ActionDomainEvent { } + + @MemberSupport public CommandLogEntry act(final UUID transactionId) { + return commandLogEntryRepository.findByInteractionId(transactionId).orElse(null); + } + } + + + @Action( + domainEvent = truncateLog.DomainEvent.class, + semantics = SemanticsOf.IDEMPOTENT_ARE_YOU_SURE, + restrictTo = RestrictTo.PROTOTYPING + ) + @ActionLayout( + cssClassFa = "fa-trash", + sequence="40" + ) + public class truncateLog { + public class DomainEvent extends ActionDomainEvent { } + + public void act() { + commandLogEntryRepository.truncateLog(); + } + } + + + private LocalDate now() { + return clockService.getClock().nowAsLocalDate(ZoneId.systemDefault()); + } +} + diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasInteractionId_command.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasInteractionId_command.java similarity index 80% rename from extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasInteractionId_command.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasInteractionId_command.java index 44b3b047663..079f5e5c662 100644 --- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasInteractionId_command.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasInteractionId_command.java @@ -16,8 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.jdo.mixins; +package org.apache.isis.extensions.commandlog.applib.contributions; +import java.util.Optional; import java.util.UUID; import javax.inject.Inject; @@ -28,10 +29,11 @@ import org.apache.isis.applib.mixins.system.HasInteractionId; import org.apache.isis.applib.services.command.Command; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdo; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdoRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import lombok.RequiredArgsConstructor; +import lombok.val; /** @@ -54,7 +56,7 @@ public static class ActionDomainEvent private final HasInteractionId hasInteractionId; - public CommandJdo act() { + public CommandLogEntry act() { return findCommand(); } /** @@ -62,18 +64,18 @@ public CommandJdo act() { * {@link Command#getParent() parent} property. */ public boolean hideAct() { - return (hasInteractionId instanceof CommandJdo); + return (hasInteractionId instanceof CommandLogEntry); } public String disableAct() { return findCommand() == null ? "No command found for unique Id": null; } - private CommandJdo findCommand() { - final UUID transactionId = hasInteractionId.getInteractionId(); - return commandServiceRepository + private CommandLogEntry findCommand() { + val transactionId = hasInteractionId.getInteractionId(); + return commandLogEntryRepository .findByInteractionId(transactionId) .orElse(null); } - @Inject CommandJdoRepository commandServiceRepository; + @Inject CommandLogEntryRepository commandLogEntryRepository; } diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasUsername_recentCommandsByUser.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasUsername_recentCommandsByUser.java similarity index 76% rename from extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasUsername_recentCommandsByUser.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasUsername_recentCommandsByUser.java index 540f379c461..98039c225a1 100644 --- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasUsername_recentCommandsByUser.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/HasUsername_recentCommandsByUser.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.jdo.mixins; +package org.apache.isis.extensions.commandlog.applib.contributions; import java.util.Collections; import java.util.List; @@ -27,8 +27,10 @@ import org.apache.isis.applib.annotation.CollectionLayout; import org.apache.isis.applib.mixins.security.HasUsername; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdo; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdoRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; + +import lombok.val; /** @@ -44,22 +46,22 @@ public class HasUsername_recentCommandsByUser { public static class CollectionDomainEvent - extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } + extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } private final HasUsername hasUsername; public HasUsername_recentCommandsByUser(final HasUsername hasUsername) { this.hasUsername = hasUsername; } - public List coll() { - final String username = hasUsername.getUsername(); + public List coll() { + val username = hasUsername.getUsername(); return username != null - ? commandServiceRepository.findRecentByUsername(username) + ? commandLogEntryRepository.findRecentByUsername(username) : Collections.emptyList(); } public boolean hideColl() { return hasUsername.getUsername() == null; } - @Inject CommandJdoRepository commandServiceRepository; + @Inject CommandLogEntryRepository commandLogEntryRepository; } diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/T_recent.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/Object_recent.java similarity index 66% rename from extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/T_recent.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/Object_recent.java index cc0c686a2e2..dc06ea89928 100644 --- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/T_recent.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/Object_recent.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.jdo.mixins; +package org.apache.isis.extensions.commandlog.applib.contributions; import java.util.Collections; import java.util.List; @@ -25,43 +25,44 @@ import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.CollectionLayout; +import org.apache.isis.applib.annotation.MemberSupport; import org.apache.isis.applib.services.bookmark.BookmarkService; import org.apache.isis.applib.services.queryresultscache.QueryResultsCache; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdo; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdoRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; + +import lombok.RequiredArgsConstructor; @Collection( - domainEvent = T_recent.CollectionDomainEvent.class + domainEvent = Object_recent.CollectionDomainEvent.class ) @CollectionLayout( defaultView = "table" ) -public abstract class T_recent { +@RequiredArgsConstructor +public abstract class Object_recent { public static class CollectionDomainEvent - extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } + extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } - private final T domainObject; - public T_recent(final T domainObject) { - this.domainObject = domainObject; - } + private final Object domainObject; - public List coll() { + @MemberSupport public List coll() { return findRecent(); } - private List findRecent() { + private List findRecent() { return bookmarkService.bookmarkFor(domainObject) .map(bookmark->queryResultsCache.execute( - () -> commandJdoRepository.findRecentByTarget(bookmark) - , T_recent.class - , "findRecentByTarget" + () -> commandLogEntryRepository.findRecentByTarget(bookmark) + , Object_recent.class + , "findRecent" , domainObject)) .orElse(Collections.emptyList()); } - @Inject CommandJdoRepository commandJdoRepository; + @Inject CommandLogEntryRepository commandLogEntryRepository; @Inject BookmarkService bookmarkService; @Inject QueryResultsCache queryResultsCache; diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/Object_recentCommands.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/Object_recentCommands.java similarity index 87% rename from extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/Object_recentCommands.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/Object_recentCommands.java index 09862ad0039..ce692a8c332 100644 --- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/Object_recentCommands.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/Object_recentCommands.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.jdo.mixins; +package org.apache.isis.extensions.commandlog.applib.contributions; import java.util.Collections; import java.util.List; @@ -33,8 +33,8 @@ import org.apache.isis.applib.mixins.system.HasInteractionId; import org.apache.isis.applib.services.bookmark.BookmarkService; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdo; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdoRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import lombok.RequiredArgsConstructor; @@ -65,9 +65,9 @@ public static class ActionDomainEvent private final Object domainObject; // mixee - @MemberSupport public List act() { + @MemberSupport public List act() { return bookmarkService.bookmarkFor(domainObject) - .map(commandServiceRepository::findRecentByTarget) + .map(commandLogEntryRepository::findRecentByTarget) .orElse(Collections.emptyList()); } @@ -79,7 +79,7 @@ public static class ActionDomainEvent return (domainObject instanceof HasInteractionId); } - @Inject CommandJdoRepository commandServiceRepository; + @Inject CommandLogEntryRepository commandLogEntryRepository; @Inject BookmarkService bookmarkService; } diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.java new file mode 100644 index 00000000000..7a466f56836 --- /dev/null +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.java @@ -0,0 +1,763 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.extensions.commandlog.applib.dom; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.math.BigDecimal; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Consumer; + +import javax.annotation.Priority; +import javax.inject.Named; +import javax.validation.constraints.Digits; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainObjectLayout; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.MemberSupport; +import org.apache.isis.applib.annotation.Optionality; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.PriorityPrecedence; +import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.PropertyLayout; +import org.apache.isis.applib.annotation.Where; +import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling; +import org.apache.isis.applib.mixins.system.DomainChangeRecord; +import org.apache.isis.applib.mixins.system.HasInteractionId; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.command.Command; +import org.apache.isis.applib.services.command.CommandOutcomeHandler; +import org.apache.isis.applib.services.commanddto.HasCommandDto; +import org.apache.isis.applib.services.commanddto.conmap.UserDataKeys; +import org.apache.isis.applib.services.tablecol.TableColumnOrderForCollectionTypeAbstract; +import org.apache.isis.applib.util.ObjectContracts; +import org.apache.isis.applib.util.TitleBuffer; +import org.apache.isis.applib.util.ToString; +import org.apache.isis.commons.functional.Try; +import org.apache.isis.commons.internal.base._Strings; +import org.apache.isis.commons.internal.exceptions._Exceptions; +import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; +import org.apache.isis.extensions.commandlog.applib.util.BigDecimalUtils; +import org.apache.isis.extensions.commandlog.applib.util.StringUtils; +import org.apache.isis.schema.cmd.v2.CommandDto; +import org.apache.isis.schema.cmd.v2.MapDto; + +import lombok.NoArgsConstructor; +import lombok.val; +import lombok.experimental.UtilityClass; + +/** + * A persistent representation of a {@link Command}. + * + *

+ * Use cases requiring persistence including auditing, and for replay of + * commands for regression testing purposes. + *

+ * + * Note that this class doesn't subclass from {@link Command} ({@link Command} + * is not an interface). + */ +@Named(CommandLogEntry.LOGICAL_TYPE_NAME) +@DomainObject( + editing = Editing.DISABLED +) +@DomainObjectLayout( + named = "Command", + titleUiEvent = CommandLogEntry.TitleUiEvent.class, + iconUiEvent = CommandLogEntry.IconUiEvent.class, + cssClassUiEvent = CommandLogEntry.CssClassUiEvent.class, + layoutUiEvent = CommandLogEntry.LayoutUiEvent.class +) +@NoArgsConstructor +public abstract class CommandLogEntry +implements HasCommandDto, Comparable, DomainChangeRecord { + + public final static String LOGICAL_TYPE_NAME = IsisModuleExtCommandLogApplib.NAMESPACE + ".CommandLog"; + public static final String SCHEMA = "isisExtensionsCommandLog"; + public static final String TABLE = "Command"; + + public static class TitleUiEvent extends IsisModuleExtCommandLogApplib.TitleUiEvent { } + public static class IconUiEvent extends IsisModuleExtCommandLogApplib.IconUiEvent { } + public static class CssClassUiEvent extends IsisModuleExtCommandLogApplib.CssClassUiEvent { } + public static class LayoutUiEvent extends IsisModuleExtCommandLogApplib.LayoutUiEvent { } + + public static abstract class PropertyDomainEvent extends IsisModuleExtCommandLogApplib.PropertyDomainEvent { } + public static abstract class CollectionDomainEvent extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } + public static abstract class ActionDomainEvent extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } + + @UtilityClass + public static class Nq { + public static final String FIND_BY_INTERACTION_ID_STR = LOGICAL_TYPE_NAME + ".findByInteractionIdStr"; + public static final String FIND_BY_PARENT = LOGICAL_TYPE_NAME + ".findByParent"; + public static final String FIND_CURRENT = LOGICAL_TYPE_NAME + ".findCurrent"; + public static final String FIND_COMPLETED = LOGICAL_TYPE_NAME + ".findCompleted"; + public static final String FIND_RECENT_BY_TARGET = LOGICAL_TYPE_NAME + ".findRecentByTarget"; + public static final String FIND_BY_TARGET_AND_TIMESTAMP_BETWEEN = LOGICAL_TYPE_NAME + ".findByTargetAndTimestampBetween"; + public static final String FIND_BY_TARGET_AND_TIMESTAMP_AFTER = LOGICAL_TYPE_NAME + ".findByTargetAndTimestampAfter"; + public static final String FIND_BY_TARGET_AND_TIMESTAMP_BEFORE = LOGICAL_TYPE_NAME + ".findByTargetAndTimestampBefore"; + public static final String FIND_BY_TARGET = LOGICAL_TYPE_NAME + ".findByTarget"; + public static final String FIND_BY_TIMESTAMP_BETWEEN = LOGICAL_TYPE_NAME + ".findByTimestampBetween"; + public static final String FIND_BY_TIMESTAMP_AFTER = LOGICAL_TYPE_NAME + ".findByTimestampAfter"; + public static final String FIND_BY_TIMESTAMP_BEFORE = LOGICAL_TYPE_NAME + ".findByTimestampBefore"; + public static final String FIND = LOGICAL_TYPE_NAME + ".find"; + public static final String FIND_RECENT_BY_USERNAME = LOGICAL_TYPE_NAME + ".findRecentByUsername"; + public static final String FIND_FIRST = LOGICAL_TYPE_NAME + ".findFirst"; + public static final String FIND_SINCE = LOGICAL_TYPE_NAME + ".findSince"; + public static final String FIND_MOST_RECENT_REPLAYED = LOGICAL_TYPE_NAME + ".findMostRecentReplayed"; + public static final String FIND_MOST_RECENT_COMPLETED = LOGICAL_TYPE_NAME + ".findMostRecentCompleted"; + public static final String FIND_NOT_YET_REPLAYED = LOGICAL_TYPE_NAME + ".findNotYetReplayed"; + } + + /** + * Intended for use on primary system. + * + * @param command + */ + public CommandLogEntry(final Command command) { + + setInteractionIdStr(command.getInteractionId().toString()); + setUsername(command.getUsername()); + setTimestamp(command.getTimestamp()); + + setCommandDto(command.getCommandDto()); + setTarget(command.getTarget()); + setLogicalMemberIdentifier(command.getLogicalMemberIdentifier()); + + setStartedAt(command.getStartedAt()); + setCompletedAt(command.getCompletedAt()); + + setResult(command.getResult()); + setException(command.getException()); + + setReplayState(org.apache.isis.extensions.commandlog.applib.dom.ReplayState.UNDEFINED); + } + + + /** + * Intended for use on secondary (replay) system. + * + * @param commandDto - obtained from the primary system as a representation of a command invocation + * @param replayState - controls whether this is to be replayed + * @param targetIndex - if the command represents a bulk action, then it is flattened out when replayed; this indicates which target to execute against. + */ + public CommandLogEntry( + final CommandDto commandDto, + final org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState, + final int targetIndex) { + + setInteractionIdStr(commandDto.getInteractionId()); + setUsername(commandDto.getUser()); + setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimestamp())); + + setCommandDto(commandDto); + setTarget(Bookmark.forOidDto(commandDto.getTargets().getOid().get(targetIndex))); + setLogicalMemberIdentifier(commandDto.getMember().getLogicalMemberIdentifier()); + + // the hierarchy of commands calling other commands is only available on the primary system, and is + setParent(null); + + setStartedAt(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimings().getStartedAt())); + setCompletedAt(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimings().getCompletedAt())); + + copyOver(commandDto, UserDataKeys.RESULT, value -> this.setResult(Bookmark.parse(value).orElse(null))); + copyOver(commandDto, UserDataKeys.EXCEPTION, this::setException); + + setReplayState(replayState); + } + + static void copyOver( + final CommandDto commandDto, + final String key, final Consumer consume) { + commandDto.getUserData().getEntry() + .stream() + .filter(x -> Objects.equals(x.getKey(), key)) + .map(MapDto.Entry::getValue) + .filter(Objects::nonNull) + .filter(x -> x.length() > 0) + .findFirst() + .ifPresent(consume); + } + + + private static final DateTimeFormatter formatter = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + + public String title() { + return new TitleBuffer() + .append(formatter.format(getTimestamp().toLocalDateTime())) + .append(" ") + .append(getLogicalMemberIdentifier()) + .toString(); + } + + + @DomainChangeRecord.Type + @Override + public ChangeType getType() { + return ChangeType.COMMAND; + } + + + + @InteractionIdStr + public abstract String getInteractionIdStr(); + public abstract void setInteractionIdStr(String interactionIdStr); + + + + @Property( + domainEvent = InteractionId.DomainEvent.class + ) + @DomainChangeRecord.InteractionId + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface InteractionId { + class DomainEvent extends PropertyDomainEvent {} + } + @Override + @InteractionId + public UUID getInteractionId() { + return UUID.fromString(getInteractionIdStr()); + } + + + + @Property( + domainEvent = Username.DomainEvent.class + ) + @DomainChangeRecord.Username + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Username { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = DomainChangeRecord.Username.MAX_LENGTH; + boolean NULLABLE = DomainChangeRecord.Username.NULLABLE; + String ALLOWS_NULL = DomainChangeRecord.Username.ALLOWS_NULL; + } + @Override + @Username + public abstract String getUsername(); + public abstract void setUsername(String userName); + + + + @Property( + domainEvent = Timestamp.DomainEvent.class + ) + @DomainChangeRecord.Timestamp + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Timestamp { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = DomainChangeRecord.Timestamp.NULLABLE; + String ALLOWS_NULL = DomainChangeRecord.Timestamp.ALLOWS_NULL; + } + @Timestamp + @Override + public abstract java.sql.Timestamp getTimestamp(); + public abstract void setTimestamp(java.sql.Timestamp timestamp); + + + + @Property( + domainEvent = ReplayState.DomainEvent.class + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface ReplayState { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 10; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + /** + * For a replayed command, what the outcome was. + */ + @ReplayState + public abstract org.apache.isis.extensions.commandlog.applib.dom.ReplayState getReplayState(); + public abstract void setReplayState(org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState); + + + + @Property( + domainEvent = ReplayStateFailureReason.DomainEvent.class, + optionality = Optionality.OPTIONAL, + maxLength = ReplayStateFailureReason.MAX_LENGTH + ) + @PropertyLayout(hidden = Where.ALL_TABLES, multiLine = 5) + @Parameter( + optionality = Optionality.OPTIONAL, + maxLength = ReplayStateFailureReason.MAX_LENGTH + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface ReplayStateFailureReason { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 255; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + /** + * For a {@link org.apache.isis.extensions.commandlog.applib.dom.ReplayState#FAILED failed} replayed command, what the reason was for the failure. + */ + @ReplayStateFailureReason + public abstract String getReplayStateFailureReason(); + public abstract void setReplayStateFailureReason(String replayStateFailureReason); + @MemberSupport public boolean hideReplayStateFailureReason() { + return getReplayState() == null || !getReplayState().isFailed(); + } + + + + @Property( + domainEvent = Parent.DomainEvent.class, + optionality = Optionality.OPTIONAL + ) + @PropertyLayout( + hidden = Where.ALL_TABLES + ) + @Parameter( + optionality = Optionality.OPTIONAL + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Parent { + class DomainEvent extends PropertyDomainEvent {} + String NAME = "parentId"; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + @Parent + public abstract C getParent(); + public abstract void setParent(CommandLogEntry parent); + + + + @Property( + domainEvent = Target.DomainEvent.class + ) + @DomainChangeRecord.Target + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Target { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = DomainChangeRecord.Target.MAX_LENGTH; + boolean NULLABLE = DomainChangeRecord.Target.NULLABLE; + String ALLOWS_NULL = DomainChangeRecord.Target.ALLOWS_NULL; + } + @Override + @Target + public abstract Bookmark getTarget(); + public abstract void setTarget(Bookmark target); + + + + @Deprecated // TO DELETE IF UNUSED + private String getTargetStr() { + return Optional.ofNullable(getTarget()).map(Bookmark::toString).orElse(null); + } + + + + @Property( + domainEvent = TargetMember.DomainEvent.class + ) + @PropertyLayout( + hidden = Where.ALL_TABLES + ) + @DomainChangeRecord.TargetMember + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface TargetMember { + class DomainEvent extends PropertyDomainEvent {} + } + @TargetMember + @Override + public String getTargetMember() { + return getCommandDto().getMember().getLogicalMemberIdentifier(); + } + + + + @Property( + domainEvent = LocalMember.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + named = "Member" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface LocalMember { + class DomainEvent extends PropertyDomainEvent {} + } + @LocalMember + public String getLocalMember() { + val targetMember = getTargetMember(); + return targetMember.substring(targetMember.indexOf("#") + 1); + } + + + + @Property( + domainEvent = LogicalMemberIdentifier.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + hidden = Where.ALL_TABLES + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface LogicalMemberIdentifier { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 255; + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + @LogicalMemberIdentifier + public abstract String getLogicalMemberIdentifier(); + public abstract void setLogicalMemberIdentifier(String logicalMemberIdentifier); + + + + + + @Property( + domainEvent = CommandDtoAnnot.DomainEvent.class + ) + @HasCommandDto.CommandDtoAnnot + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface CommandDtoAnnot { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = HasCommandDto.CommandDtoAnnot.NULLABLE; + String ALLOWS_NULL = HasCommandDto.CommandDtoAnnot.ALLOWS_NULL; + } + @CommandDtoAnnot + @Override + public abstract CommandDto getCommandDto(); + public abstract void setCommandDto(CommandDto commandDto); + + + + + @Property( + domainEvent = StartedAt.DomainEvent.class, + editing = Editing.DISABLED, + optionality = Optionality.OPTIONAL + ) + @Parameter( + optionality = Optionality.OPTIONAL + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface StartedAt { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + public abstract java.sql.Timestamp getStartedAt(); + public abstract void setStartedAt(java.sql.Timestamp startedAt); + + + + @Property( + domainEvent = CompletedAt.DomainEvent.class, + editing = Editing.DISABLED, + optionality = Optionality.OPTIONAL + ) + @Parameter( + optionality = Optionality.OPTIONAL + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface CompletedAt { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + public abstract java.sql.Timestamp getCompletedAt(); + public abstract void setCompletedAt(java.sql.Timestamp completedAt); + + + + @Property( + domainEvent = Duration.DomainEvent.class, + editing = Editing.DISABLED + ) + @Digits(integer=5, fraction=3) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Duration { + class DomainEvent extends PropertyDomainEvent {} + } + /** + * The number of seconds (to 3 decimal places) that this interaction lasted. + * + *

+ * Populated only if it has {@link #getCompletedAt() completed}. + */ + @Digits(integer=5, fraction=3) + @Duration + public BigDecimal getDuration() { + return BigDecimalUtils.durationBetween(getStartedAt(), getCompletedAt()); + } + + + + @Property( + domainEvent = IsComplete.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + hidden = Where.OBJECT_FORMS + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface IsComplete { + class DomainEvent extends PropertyDomainEvent {} + } + @IsComplete + public boolean isComplete() { + return getCompletedAt() != null; + } + + + + @Property( + domainEvent = ResultSummary.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + hidden = Where.OBJECT_FORMS, + named = "Result" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface ResultSummary { + class DomainEvent extends PropertyDomainEvent {} + } + @ResultSummary + public String getResultSummary() { + if(getCompletedAt() == null) { + return ""; + } + if(!_Strings.isNullOrEmpty(getException())) { + return "EXCEPTION"; + } + if(getResult() != null) { + return "OK"; + } else { + return "OK (VOID)"; + } + } + + + + @Property( + domainEvent = Result.DomainEvent.class + ) + @PropertyLayout( + hidden = Where.ALL_TABLES, + named = "Result Bookmark" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Result { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 2000; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + @Result + public abstract Bookmark getResult(); + public abstract void setResult(Bookmark result); + + + + + @Property( + domainEvent = Exception.DomainEvent.class + ) + @PropertyLayout( + hidden = Where.ALL_TABLES, + multiLine = 5, + named = "Exception (if any)" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Exception { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + /** + * Stack trace of any exception that might have occurred if this interaction/transaction aborted. + * + *

+ * Not part of the applib API, because the default implementation is not persistent + * and so there's no object that can be accessed to be annotated. + */ + @Exception + public abstract String getException(); + public abstract void setException(final String exception); + + public void setException(final Throwable exception) { + setException(_Exceptions.asStacktrace(exception)); + } + + + + @Property( + domainEvent = IsCaused.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + hidden = Where.OBJECT_FORMS + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface IsCaused { + class DomainEvent extends PropertyDomainEvent {} + } + @IsCaused + public boolean isCausedException() { + return getException() != null; + } + + + + @DomainChangeRecord.PreValue + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface PreValue { + class DomainEvent extends PropertyDomainEvent {} + } + @PreValue + @Override + public String getPreValue() { + return null; + } + + + + @DomainChangeRecord.PostValue + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface PostValue { + class DomainEvent extends PropertyDomainEvent {} + } + @PostValue + @Override + public String getPostValue() { + return null; + } + + + public void saveAnalysis(final String analysis) { + if (analysis == null) { + setReplayState(org.apache.isis.extensions.commandlog.applib.dom.ReplayState.OK); + } else { + setReplayState(org.apache.isis.extensions.commandlog.applib.dom.ReplayState.FAILED); + setReplayStateFailureReason(StringUtils.trimmed(analysis, 255)); + } + + } + + @Override + public int compareTo(final CommandLogEntry other) { + return this.getTimestamp().compareTo(other.getTimestamp()); + } + + + static final ToString stringifier = ObjectContracts + .toString("interactionId", CommandLogEntry::getInteractionId) + .thenToString("username", CommandLogEntry::getUsername) + .thenToString("timestamp", CommandLogEntry::getTimestamp) + .thenToString("target", CommandLogEntry::getTarget) + .thenToString("logicalMemberIdentifier", CommandLogEntry::getLogicalMemberIdentifier) + .thenToStringOmitIfAbsent("startedAt", CommandLogEntry::getStartedAt) + .thenToStringOmitIfAbsent("completedAt", CommandLogEntry::getCompletedAt); + + @Override + public String toString() { + return stringifier.toString(this); + } + + public CommandOutcomeHandler outcomeHandler() { + return new CommandOutcomeHandler() { + @Override + public java.sql.Timestamp getStartedAt() { + return CommandLogEntry.this.getStartedAt(); + } + + @Override + public void setStartedAt(final java.sql.Timestamp startedAt) { + CommandLogEntry.this.setStartedAt(startedAt); + } + + @Override + public void setCompletedAt(final java.sql.Timestamp completedAt) { + CommandLogEntry.this.setCompletedAt(completedAt); + } + + @Override + public void setResult(final Try resultBookmark) { + CommandLogEntry.this.setResult(resultBookmark.getValue().orElse(null)); + CommandLogEntry.this.setException(resultBookmark.getFailure().orElse(null)); + } + }; + } + + + @Service + @Priority(PriorityPrecedence.LATE - 10) // before the framework's own default. + public static class TableColumnOrderDefault extends TableColumnOrderForCollectionTypeAbstract { + + public TableColumnOrderDefault() { super(CommandLogEntry.class); } + + @Override + protected List orderParented(final Object parent, final String collectionId, final List propertyIds) { + return ordered(propertyIds); + } + + @Override + protected List orderStandalone(final List propertyIds) { + return ordered(propertyIds); + } + + private List ordered(final List propertyIds) { + return Arrays.asList( + "timestamp", "target", "targetMember", "username", "complete", "resultSummary", "interactionIdStr" + ); + } + } + +} + diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.layout.fallback.xml b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.layout.fallback.xml similarity index 100% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.layout.fallback.xml rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.layout.fallback.xml diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.png b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.png similarity index 100% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.png rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.png diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntryRepository.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntryRepository.java new file mode 100644 index 00000000000..954d5b0f040 --- /dev/null +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntryRepository.java @@ -0,0 +1,376 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.extensions.commandlog.applib.dom; + +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import javax.inject.Inject; +import javax.inject.Provider; + +import org.springframework.lang.Nullable; + +import org.apache.isis.applib.exceptions.RecoverableException; +import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling; +import org.apache.isis.applib.query.Query; +import org.apache.isis.applib.query.QueryRange; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.command.Command; +import org.apache.isis.applib.services.factory.FactoryService; +import org.apache.isis.applib.services.repository.RepositoryService; +import org.apache.isis.applib.util.schema.CommandDtoUtils; +import org.apache.isis.schema.cmd.v2.CommandDto; +import org.apache.isis.schema.cmd.v2.CommandsDto; +import org.apache.isis.schema.cmd.v2.MapDto; +import org.apache.isis.schema.common.v2.InteractionType; +import org.apache.isis.schema.common.v2.OidDto; + +import lombok.Getter; +import lombok.val; + +public abstract class CommandLogEntryRepository { + + public static class NotFoundException extends RecoverableException { + private static final long serialVersionUID = 1L; + @Getter + private final UUID interactionId; + public NotFoundException(final UUID interactionId) { + super("Command not found"); + this.interactionId = interactionId; + } + } + + @Inject Provider repositoryServiceProvider; + @Inject FactoryService factoryService; + + private final Class commandLogClass; + + protected CommandLogEntryRepository(Class commandLogClass) { + this.commandLogClass = commandLogClass; + } + + /** Creates a transient (yet not persisted) {@link CommandLogEntry} instance. */ + public C createCommandLog(final Command command) { + C c = factoryService.detachedEntity(commandLogClass); + c.setCommandDto(command.getCommandDto()); + return c; + } + + public Optional findByInteractionId(final UUID interactionId) { + return repositoryService().firstMatch( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_INTERACTION_ID_STR) + .withParameter("interactionIdStr", interactionId.toString())); + } + + public List findByParent(final CommandLogEntry parent) { + return repositoryService().allMatches( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_PARENT) + .withParameter("parent", parent)); + } + + public List findByFromAndTo( + final @Nullable LocalDate from, + final @Nullable LocalDate to) { + final Timestamp fromTs = toTimestampStartOfDayWithOffset(from, 0); + final Timestamp toTs = toTimestampStartOfDayWithOffset(to, 1); + + final Query query; + if(from != null) { + if(to != null) { + query = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_TIMESTAMP_BETWEEN) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_TIMESTAMP_AFTER) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_TIMESTAMP_BEFORE) + .withParameter("to", toTs); + } else { + query = Query.named(commandLogClass, CommandLogEntry.Nq.FIND); + } + } + return repositoryService().allMatches(query); + } + + public List findCurrent() { + return repositoryService().allMatches( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_CURRENT)); + } + + public List findCompleted() { + return repositoryService().allMatches( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_COMPLETED)); + } + + + public List findByTargetAndFromAndTo( + final Bookmark target, + final @Nullable LocalDate from, + final @Nullable LocalDate to) { + + final Timestamp fromTs = toTimestampStartOfDayWithOffset(from, 0); + final Timestamp toTs = toTimestampStartOfDayWithOffset(to, 1); + + final Query query; + if(from != null) { + if(to != null) { + query = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_TARGET_AND_TIMESTAMP_BETWEEN) + .withParameter("target", target) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_TARGET_AND_TIMESTAMP_AFTER) + .withParameter("target", target) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_TARGET_AND_TIMESTAMP_BEFORE) + .withParameter("target", target) + .withParameter("to", toTs); + } else { + query = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_TARGET) + .withParameter("target", target); + } + } + return repositoryService().allMatches(query); + } + + public List findRecentByUsername(final String username) { + return repositoryService().allMatches( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_RECENT_BY_USERNAME) + .withParameter("username", username)); + } + + + + public List findRecentByTarget(final Bookmark target) { + return repositoryService().allMatches( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_RECENT_BY_TARGET) + .withParameter("target", target)); + } + + + /** + * Intended to support the replay of commands on a secondary instance of + * the application. + * + * This finder returns all (completed) {@link CommandLogEntry}s started after + * the command with the specified interactionId. The number of commands + * returned can be limited so that they can be applied in batches. + * + * If the provided interactionId is null, then only a single + * {@link CommandLogEntry command} is returned. This is intended to support + * the case when the secondary does not yet have any + * {@link CommandLogEntry command}s replicated. In practice this is unlikely; + * typically we expect that the secondary will be set up to run against a + * copy of the primary instance's DB (restored from a backup), in which + * case there will already be a {@link CommandLogEntry command} representing the + * current high water mark on the secondary system. + * + * If the interactionId is not null but the corresponding + * {@link CommandLogEntry command} is not found, then null is returned. + * In the replay scenario the caller will probably interpret this as an + * error because it means that the high water mark on the secondary is + * inaccurate, referring to a non-existent {@link CommandLogEntry command} on + * the primary. + * + * @param interactionId - the identifier of the {@link CommandLogEntry command} being + * the replay HWM (using {@link #findMostRecentReplayed()} on the + * secondary), or null if no HWM was found there. + * @param batchSize - to restrict the number returned (so that replay + * commands can be batched). + */ + public List findSince(final UUID interactionId, final Integer batchSize) { + if(interactionId == null) { + return findFirst(); + } + final C from = findByInteractionIdElseNull(interactionId); + if(from == null) { + return Collections.emptyList(); + } + return findSince(from.getTimestamp(), batchSize); + } + + private List findFirst() { + Optional firstCommandIfAny = repositoryService().firstMatch( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_FIRST)); + return firstCommandIfAny + .map(Collections::singletonList) + .orElse(Collections.emptyList()); + } + + /** + * The most recent replayed command previously replicated from primary to + * secondary. + * + *

+ * This should always exist except for the very first times + * (after restored the prod DB to secondary). + *

+ */ + public Optional findMostRecentReplayed() { + return repositoryService().firstMatch( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_MOST_RECENT_REPLAYED)); + } + + /** + * The most recent completed command, as queried on the + * secondary. + * + *

+ * After a restart following the production database being restored + * from primary to secondary, would correspond to the last command + * run on primary before the production database was restored to the + * secondary. + *

+ */ + public Optional findMostRecentCompleted() { + return repositoryService().firstMatch( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_MOST_RECENT_COMPLETED)); + } + + public List findNotYetReplayed() { + return repositoryService().allMatches( + Query.named(commandLogClass, CommandLogEntry.Nq.FIND_NOT_YET_REPLAYED).withLimit(10)); + } + + + public C saveForReplay(final CommandDto dto) { + + if(dto.getMember().getInteractionType() == InteractionType.ACTION_INVOCATION) { + final MapDto userData = dto.getUserData(); + if (userData == null ) { + throw new IllegalStateException(String.format( + "Can only persist action DTOs with additional userData; got: \n%s", + CommandDtoUtils.toXml(dto))); + } + } + + final C commandJdo = factoryService.detachedEntity(commandLogClass); + + commandJdo.setInteractionIdStr(dto.getInteractionId()); + commandJdo.setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(dto.getTimestamp())); + commandJdo.setUsername(dto.getUser()); + + commandJdo.setReplayState(ReplayState.PENDING); + + final OidDto firstTarget = dto.getTargets().getOid().get(0); + commandJdo.setTarget(Bookmark.forOidDto(firstTarget)); + commandJdo.setCommandDto(dto); + commandJdo.setLogicalMemberIdentifier(dto.getMember().getLogicalMemberIdentifier()); + + persist(commandJdo); + + return commandJdo; + } + + + public List saveForReplay(final CommandsDto commandsDto) { + List commandDto = commandsDto.getCommandDto(); + List commands = new ArrayList<>(); + for (final CommandDto dto : commandDto) { + commands.add(saveForReplay(dto)); + } + return commands; + } + + + public void persist(final C commandLog) { + repositoryService().persist(commandLog); + } + + public void truncateLog() { + repositoryService().removeAll(commandLogClass); + } + + // -- + + + public List findCommandsOnPrimaryElseFail( + final @Nullable UUID interactionId, + final @Nullable Integer batchSize) throws NotFoundException { + + final List commands = findSince(interactionId, batchSize); + if(commands == null) { + throw new NotFoundException(interactionId); + } + return commands; + } + + + + private C findByInteractionIdElseNull(final UUID interactionId) { + val q = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_BY_INTERACTION_ID_STR) + .withParameter("interactionIdStr", interactionId.toString()); + return repositoryService().uniqueMatch(q).orElse(null); + } + + private List findSince( + final Timestamp timestamp, + final Integer batchSize) { + + // DN generates incorrect SQL for SQL Server if count set to 1; so we set to 2 and then trim + // XXX that's a historic workaround, should rather be fixed upstream + val needsTrimFix = batchSize != null && batchSize == 1; + + val q = Query.named(commandLogClass, CommandLogEntry.Nq.FIND_SINCE) + .withParameter("timestamp", timestamp) + .withRange(QueryRange.limit( + needsTrimFix ? 2L : batchSize + )); + + final List commandJdos = repositoryService().allMatches(q); + return needsTrimFix && commandJdos.size() > 1 + ? commandJdos.subList(0,1) + : commandJdos; + } + + + + + + private RepositoryService repositoryService() { + return repositoryServiceProvider.get(); + } + + private static Timestamp toTimestampStartOfDayWithOffset( + final @Nullable LocalDate dt, + final int daysOffset) { + + return dt!=null + ? new java.sql.Timestamp( + Instant.from(dt.atStartOfDay().plusDays(daysOffset).atZone(ZoneId.systemDefault())) + .toEpochMilli()) + : null; + } + + + +} diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ReplayState.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/ReplayState.java similarity index 95% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ReplayState.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/ReplayState.java index 5a52c6ea778..07d0e7e5cf2 100644 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ReplayState.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/ReplayState.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.applib.command; +package org.apache.isis.extensions.commandlog.applib.dom; public enum ReplayState { /** diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_childCommands.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_childCommands.java similarity index 68% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_childCommands.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_childCommands.java index a9e538ee7cf..1954181e689 100644 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_childCommands.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_childCommands.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.applib.command.mixins; +package org.apache.isis.extensions.commandlog.applib.dom.mixins; import java.util.List; @@ -24,34 +24,33 @@ import org.apache.isis.applib.annotation.CollectionLayout; import org.apache.isis.applib.annotation.MemberSupport; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import lombok.RequiredArgsConstructor; @Collection( - domainEvent = CommandLog_childCommands.CollectionDomainEvent.class + domainEvent = CommandLogEntry_childCommands.CollectionDomainEvent.class ) @CollectionLayout( defaultView = "table", sequence = "100.100" ) @RequiredArgsConstructor -public class CommandLog_childCommands { +public class CommandLogEntry_childCommands { public static class CollectionDomainEvent - extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } + extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } - private final CommandLog commandLog; + private final CommandLogEntry commandLogEntry; @MemberSupport - public List coll() { - return commandLogRepository.findByParent(commandLog); + public List coll() { + return commandLogEntryRepository.findByParent(commandLogEntry); } @javax.inject.Inject - private ICommandLogRepository commandLogRepository; + private CommandLogEntryRepository commandLogEntryRepository; } diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_openResultObject.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_openResultObject.java similarity index 79% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_openResultObject.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_openResultObject.java index 663ae1e3f7e..e438ef85a5d 100644 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_openResultObject.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_openResultObject.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.applib.command.mixins; +package org.apache.isis.extensions.commandlog.applib.dom.mixins; import javax.inject.Inject; @@ -27,27 +27,27 @@ import org.apache.isis.applib.services.bookmark.BookmarkService; import org.apache.isis.applib.services.message.MessageService; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; import lombok.RequiredArgsConstructor; import lombok.val; @Action( semantics = SemanticsOf.SAFE, - domainEvent = CommandLog_openResultObject.ActionDomainEvent.class + domainEvent = CommandLogEntry_openResultObject.ActionDomainEvent.class ) @ActionLayout(named = "Open", associateWith = "result", sequence="1") @RequiredArgsConstructor -public class CommandLog_openResultObject { +public class CommandLogEntry_openResultObject { public static class ActionDomainEvent - extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } + extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } - private final CommandLog commandLog; + private final CommandLogEntry commandLogEntry; @MemberSupport public Object act() { - val targetBookmark = bookmarkService.lookup(commandLog.getResult()).orElse(null); + val targetBookmark = bookmarkService.lookup(commandLogEntry.getResult()).orElse(null); if(targetBookmark == null) { messageService.warnUser("Object not found - has it since been deleted?"); return null; @@ -55,7 +55,7 @@ public Object act() { return targetBookmark; } @MemberSupport public boolean hideAct() { - return commandLog.getResult() == null; + return commandLogEntry.getResult() == null; } @Inject BookmarkService bookmarkService; diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_openTargetObject.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_openTargetObject.java similarity index 79% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_openTargetObject.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_openTargetObject.java index a9d680382cb..aafb6432fce 100644 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_openTargetObject.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_openTargetObject.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.applib.command.mixins; +package org.apache.isis.extensions.commandlog.applib.dom.mixins; import javax.inject.Inject; @@ -27,27 +27,27 @@ import org.apache.isis.applib.services.bookmark.BookmarkService; import org.apache.isis.applib.services.message.MessageService; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; import lombok.RequiredArgsConstructor; import lombok.val; @Action( semantics = SemanticsOf.SAFE, - domainEvent = CommandLog_openTargetObject.ActionDomainEvent.class + domainEvent = CommandLogEntry_openTargetObject.ActionDomainEvent.class ) @ActionLayout(named = "Open", associateWith = "target", sequence="1") @RequiredArgsConstructor -public class CommandLog_openTargetObject { +public class CommandLogEntry_openTargetObject { public static class ActionDomainEvent - extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } + extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } - private final CommandLog commandLog; + private final CommandLogEntry commandLogEntry; @MemberSupport public Object act() { - val targetBookmark = bookmarkService.lookup(commandLog.getTarget()).orElse(null); + val targetBookmark = bookmarkService.lookup(commandLogEntry.getTarget()).orElse(null); if(targetBookmark == null) { messageService.warnUser("Object not found - has it since been deleted?"); return null; @@ -55,7 +55,7 @@ public Object act() { return targetBookmark; } @MemberSupport public boolean hideAct() { - return commandLog.getTarget() == null; + return commandLogEntry.getTarget() == null; } @Inject BookmarkService bookmarkService; diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_retry.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_retry.java similarity index 76% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_retry.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_retry.java index 1ff4fa1cd36..a4df00f91f4 100644 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_retry.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_retry.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.applib.command.mixins; +package org.apache.isis.extensions.commandlog.applib.dom.mixins; import javax.inject.Inject; @@ -32,35 +32,35 @@ import org.apache.isis.applib.services.repository.RepositoryService; import org.apache.isis.applib.services.xactn.TransactionService; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ReplayState; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.ReplayState; import lombok.RequiredArgsConstructor; @Action( semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE, - domainEvent = CommandLog_retry.ActionDomainEvent.class, + domainEvent = CommandLogEntry_retry.ActionDomainEvent.class, commandPublishing = Publishing.DISABLED ) @ActionLayout(associateWith = "executeIn", sequence = "1") @RequiredArgsConstructor -public class CommandLog_retry { +public class CommandLogEntry_retry { - private final CommandLog commandLog; + private final CommandLogEntry commandLogEntry; public static class ActionDomainEvent - extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } + extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } @MemberSupport - public CommandLog act() { + public CommandLogEntry act() { - commandLog.setReplayState(ReplayState.PENDING); - commandLog.setResult(null); - commandLog.setException((Exception)null); - commandLog.setStartedAt(null); - commandLog.setCompletedAt(null); + commandLogEntry.setReplayState(ReplayState.PENDING); + commandLogEntry.setResult(null); + commandLogEntry.setException((Exception)null); + commandLogEntry.setStartedAt(null); + commandLogEntry.setCompletedAt(null); - return commandLog; + return commandLogEntry; } @Inject InteractionService interactionService; diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_siblingCommands.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_siblingCommands.java similarity index 66% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_siblingCommands.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_siblingCommands.java index 9e81791c231..8a708c6ef9b 100644 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_siblingCommands.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/mixins/CommandLogEntry_siblingCommands.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.applib.command.mixins; +package org.apache.isis.extensions.commandlog.applib.dom.mixins; import java.util.Collections; import java.util.List; @@ -25,39 +25,39 @@ import org.apache.isis.applib.annotation.CollectionLayout; import org.apache.isis.applib.annotation.MemberSupport; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import lombok.RequiredArgsConstructor; @Collection( - domainEvent = CommandLog_siblingCommands.CollectionDomainEvent.class + domainEvent = CommandLogEntry_siblingCommands.CollectionDomainEvent.class ) @CollectionLayout( defaultView = "table", sequence = "100.110" ) @RequiredArgsConstructor -public class CommandLog_siblingCommands { +public class CommandLogEntry_siblingCommands { public static class CollectionDomainEvent - extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } + extends IsisModuleExtCommandLogApplib.CollectionDomainEvent { } - private final CommandLog commandLog; + private final CommandLogEntry commandLogEntry; @MemberSupport - public List coll() { - final CommandLog parentJdo = commandLog.getParent(); + public List coll() { + final CommandLogEntry parentJdo = commandLogEntry.getParent(); if(parentJdo == null) { return Collections.emptyList(); } - final List siblingCommands = commandLogRepository.findByParent(parentJdo); - siblingCommands.remove(commandLog); + final List siblingCommands = commandLogEntryRepository.findByParent(parentJdo); + siblingCommands.remove(commandLogEntry); return siblingCommands; } @javax.inject.Inject - private ICommandLogRepository commandLogRepository; + private CommandLogEntryRepository commandLogEntryRepository; } diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/subscriber/CommandSubscriberForCommandLog.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java similarity index 81% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/subscriber/CommandSubscriberForCommandLog.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java index 33010c24e86..0b8d2eca6e3 100644 --- a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/subscriber/CommandSubscriberForCommandLog.java +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/subscriber/CommandSubscriberForCommandLog.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.applib.command.subscriber; +package org.apache.isis.extensions.commandlog.applib.subscriber; import javax.inject.Inject; import javax.inject.Named; @@ -30,8 +30,8 @@ import org.apache.isis.applib.util.JaxbUtil; import org.apache.isis.commons.internal.base._Casts; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import lombok.RequiredArgsConstructor; import lombok.val; @@ -43,12 +43,11 @@ @Service @Named(IsisModuleExtCommandLogApplib.NAMESPACE + ".CommandSubscriberForCommandLog") @javax.annotation.Priority(PriorityPrecedence.MIDPOINT) // after JdoPersistenceLifecycleService -@Qualifier("Jdo") -@RequiredArgsConstructor +@RequiredArgsConstructor(onConstructor_ = {@Inject}) @Log4j2 public class CommandSubscriberForCommandLog implements CommandSubscriber { - @Inject final ICommandLogRepository commandLogRepository; + final CommandLogEntryRepository commandLogEntryRepository; @Override public void onCompleted(final Command command) { @@ -58,7 +57,7 @@ public void onCompleted(final Command command) { } val existingCommandJdoIfAny = - commandLogRepository.findByInteractionId(command.getInteractionId()); + commandLogEntryRepository.findByInteractionId(command.getInteractionId()); if(existingCommandJdoIfAny.isPresent()) { if(log.isDebugEnabled()) { // this isn't expected to happen ... we just log the fact if it does @@ -73,19 +72,17 @@ public void onCompleted(final Command command) { log.debug("proposed: \n{}", commandDtoXml); } } else { - val commandLogInstance = commandLogRepository.createCommandLog(command); + val commandLogInstance = commandLogEntryRepository.createCommandLog(command); val parent = command.getParent(); val parentJdo = parent != null - ? commandLogRepository + ? commandLogEntryRepository .findByInteractionId(parent.getInteractionId()) .orElse(null) : null; commandLogInstance.setParent(parentJdo); - commandLogRepository.persist(_Casts.uncheckedCast(commandLogInstance)); + commandLogEntryRepository.persist(_Casts.uncheckedCast(commandLogInstance)); } - - } } diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java new file mode 100644 index 00000000000..92263780838 --- /dev/null +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java @@ -0,0 +1,27 @@ +package org.apache.isis.extensions.commandlog.applib.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.Timestamp; + +public class BigDecimalUtils { + /** + * @return in seconds, to 3 decimal places. + */ + public static BigDecimal durationBetween(Timestamp startedAt, Timestamp completedAt) { + if (completedAt == null) { + return null; + } else { + long millis = completedAt.getTime() - startedAt.getTime(); + return toSeconds(millis); + } + } + + private static final BigDecimal DIVISOR = new BigDecimal(1000); + + private static BigDecimal toSeconds(long millis) { + return new BigDecimal(millis) + .divide(DIVISOR, RoundingMode.HALF_EVEN) + .setScale(3, RoundingMode.HALF_EVEN); + } +} diff --git a/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java new file mode 100644 index 00000000000..f6c80e61e8c --- /dev/null +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java @@ -0,0 +1,17 @@ +package org.apache.isis.extensions.commandlog.applib.util; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class StringUtils { + + public static String trimmed(final String str, final int lengthOfField) { + if (str == null) { + return null; + } + if (str.length() > lengthOfField) { + return str.substring(0, lengthOfField - 3) + "..."; + } + return str; + } +} diff --git a/extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/model/util/StringUtils_trimmed_Test.java b/extensions/core/commandlog/applib/src/test/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils_trimmed_Test.java similarity index 91% rename from extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/model/util/StringUtils_trimmed_Test.java rename to extensions/core/commandlog/applib/src/test/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils_trimmed_Test.java index b6570d65525..7c157fad409 100644 --- a/extensions/core/command-log/applib/src/test/java/org/apache/isis/extensions/commandlog/model/util/StringUtils_trimmed_Test.java +++ b/extensions/core/commandlog/applib/src/test/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils_trimmed_Test.java @@ -16,13 +16,11 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.extensions.commandlog.model.util; +package org.apache.isis.extensions.commandlog.applib.util; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.apache.isis.extensions.commandlog.applib.util.StringUtils; - public class StringUtils_trimmed_Test { @Test @@ -45,4 +43,4 @@ public void when_empty() { Assertions.assertThat(StringUtils.trimmed("", 4)).isEqualTo(""); } -} \ No newline at end of file +} diff --git a/extensions/core/command-log/jdo/logging-dn-enhance.properties b/extensions/core/commandlog/jdo/logging-dn-enhance.properties similarity index 100% rename from extensions/core/command-log/jdo/logging-dn-enhance.properties rename to extensions/core/commandlog/jdo/logging-dn-enhance.properties diff --git a/extensions/core/command-log/jdo/pom.xml b/extensions/core/commandlog/jdo/pom.xml similarity index 93% rename from extensions/core/command-log/jdo/pom.xml rename to extensions/core/commandlog/jdo/pom.xml index d2046adc8f7..a850ba9987b 100644 --- a/extensions/core/command-log/jdo/pom.xml +++ b/extensions/core/commandlog/jdo/pom.xml @@ -15,11 +15,11 @@ org.apache.isis.extensions - isis-extensions-command-log + isis-extensions-commandlog 2.0.0-SNAPSHOT - isis-extensions-command-log-jdo + isis-extensions-commandlog-jdo Apache Isis Ext - Command Log Implementation (JDO) @@ -48,7 +48,7 @@ org.apache.isis.extensions - isis-extensions-command-log-applib + isis-extensions-commandlog-applib @@ -59,13 +59,13 @@
- + org.apache.isis.testing isis-testing-unittestsupport-applib test - + org.apache.isis.testing isis-testing-integtestsupport-applib diff --git a/extensions/core/command-log/jdo/src/main/java/META-INF/persistence.xml b/extensions/core/commandlog/jdo/src/main/java/META-INF/persistence.xml similarity index 100% rename from extensions/core/command-log/jdo/src/main/java/META-INF/persistence.xml rename to extensions/core/commandlog/jdo/src/main/java/META-INF/persistence.xml diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java similarity index 67% rename from extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java rename to extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java index ff0cf14343c..47812eae41e 100644 --- a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java +++ b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java @@ -22,12 +22,11 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; -import org.apache.isis.extensions.commandlog.applib.command.subscriber.CommandSubscriberForCommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ui.CommandLogServiceMenu; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdo; -import org.apache.isis.extensions.commandlog.jdo.entities.CommandJdoRepository; +import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; +import org.apache.isis.extensions.commandlog.applib.subscriber.CommandSubscriberForCommandLog; +import org.apache.isis.extensions.commandlog.applib.app.CommandLogServiceMenu; +import org.apache.isis.extensions.commandlog.jdo.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.jdo.dom.CommandLogEntryRepository; import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript; import org.apache.isis.testing.fixtures.applib.teardown.jdo.TeardownFixtureJdoAbstract; @@ -36,16 +35,19 @@ */ @Configuration @Import({ + // modules + IsisModuleExtCommandLogApplib.class, + // @DomainService's CommandLogServiceMenu.class, // @Service's - CommandJdoRepository.class, - CommandLog.TableColumnOrderDefault.class, + CommandLogEntryRepository.class, + org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry.TableColumnOrderDefault.class, CommandSubscriberForCommandLog.class, // entities - CommandJdo.class + CommandLogEntry.class }) @ComponentScan( basePackageClasses= { @@ -53,17 +55,18 @@ }) public class IsisModuleExtCommandLogJdo { - public static final String NAMESPACE = "isis.ext.commandLog"; + public static final String NAMESPACE = IsisModuleExtCommandLogApplib.NAMESPACE; + public static final String SCHEMA = IsisModuleExtCommandLogApplib.SCHEMA; /** * For tests that need to delete the command table first. - * Should be run in the @Before of the test. + * Should be run in the @BeforeEach of the test. */ public FixtureScript getTeardownFixtureWillDelete() { return new TeardownFixtureJdoAbstract() { @Override protected void execute(final ExecutionContext executionContext) { - deleteFrom(ICommandLog.class); + deleteFrom(CommandLogEntry.class); } }; } diff --git a/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java new file mode 100644 index 00000000000..49aa3de62ab --- /dev/null +++ b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java @@ -0,0 +1,313 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.extensions.commandlog.jdo.dom; + +import javax.inject.Named; +import javax.jdo.annotations.Column; +import javax.jdo.annotations.IdentityType; +import javax.jdo.annotations.Index; +import javax.jdo.annotations.Indices; +import javax.jdo.annotations.PersistenceCapable; +import javax.jdo.annotations.Persistent; +import javax.jdo.annotations.PrimaryKey; +import javax.jdo.annotations.Queries; +import javax.jdo.annotations.Query; + +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.command.Command; +import org.apache.isis.extensions.commandlog.jdo.IsisModuleExtCommandLogJdo; +import org.apache.isis.schema.cmd.v2.CommandDto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@PersistenceCapable( + identityType = IdentityType.APPLICATION, + schema = CommandLogEntry.SCHEMA, + table = CommandLogEntry.TABLE) +@Indices({ + @Index(name = "CommandJdo__startedAt__timestamp__IDX", members = { "startedAt", "timestamp" }), + @Index(name = "CommandJdo__timestamp__IDX", members = { "timestamp" }), +// @javax.jdo.annotations.Index(name = "CommandJdo__replayState__timestamp__startedAt_IDX", members = { "replayState", "timestamp", "startedAt"}), +// @javax.jdo.annotations.Index(name = "CommandJdo__replayState__startedAt__completedAt_IDX", members = {"startedAt", "replayState", "completedAt"}), +}) +@Queries( { + @Query( + name = "findByInteractionIdStr", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE interactionIdStr == :interactionIdStr "), + @Query( + name = "findByParent", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE parent == :parent "), + @Query( + name = "findCurrent", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE completedAt == null " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findCompleted", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE completedAt != null " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findRecentByTarget", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE target == :target " + + " ORDER BY this.timestamp DESC " + + " RANGE 0,30"), + @Query( + name = "findByTargetAndTimestampBetween", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE target == :target " + + " && timestamp >= :from " + + " && timestamp <= :to " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findByTargetAndTimestampAfter", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE target == :target " + + " && timestamp >= :from " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findByTargetAndTimestampBefore", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE target == :target " + + " && timestamp <= :to " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findByTarget", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE target == :target " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findByTimestampBetween", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE timestamp >= :from " + + " && timestamp <= :to " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findByTimestampAfter", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE timestamp >= :from " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findByTimestampBefore", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE timestamp <= :to " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "find", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " ORDER BY this.timestamp DESC"), + @Query( + name = "findRecentByUsername", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE username == :username " + + " ORDER BY this.timestamp DESC " + + " RANGE 0,30"), + @Query( + name = "findFirst", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE startedAt != null " + + " && completedAt != null " + + " ORDER BY this.timestamp ASC " + + " RANGE 0,2"), // this should be RANGE 0,1 but results in DataNucleus submitting "FETCH NEXT ROW ONLY" + // which SQL Server doesn't understand. However, as workaround, SQL Server *does* understand FETCH NEXT 2 ROWS ONLY + @Query( + name = "findSince", + value = "SELECT " + + "FROM " + CommandLogEntry.FQCN + " " + + " WHERE timestamp > :timestamp " + + " && startedAt != null " + + " && completedAt != null " + + "ORDER BY this.timestamp ASC"), + + // most recent (replayed) command previously replicated from primary to + // secondary. This should always exist except for the very first times + // (after restored the prod DB to secondary). + @Query( + name = "findMostRecentReplayed", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE (replayState == 'OK' || replayState == 'FAILED') " + + " ORDER BY this.timestamp DESC " + + " RANGE 0,2"), // this should be RANGE 0,1 but results in DataNucleus submitting "FETCH NEXT ROW ONLY" + // which SQL Server doesn't understand. However, as workaround, SQL Server *does* understand FETCH NEXT 2 ROWS ONLY + + // the most recent completed command, as queried on the + // secondary, corresponding to the last command run on primary before the + // production database was restored to the secondary + @Query( + name = "findMostRecentCompleted", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE startedAt != null " + + " && completedAt != null " + + " ORDER BY this.timestamp DESC " + + " RANGE 0,2"), // this should be RANGE 0,1 but results in DataNucleus submitting "FETCH NEXT ROW ONLY" + // which SQL Server doesn't understand. However, as workaround, SQL Server *does* understand FETCH NEXT 2 ROWS ONLY + + @Query( + name = "findNotYetReplayed", + value = "SELECT " + + " FROM " + CommandLogEntry.FQCN + " " + + " WHERE replayState == 'PENDING' " + + " ORDER BY this.timestamp ASC " + + " RANGE 0,10"), // same as batch size +}) +@Named(CommandLogEntry.LOGICAL_TYPE_NAME) +@DomainObject( + editing = Editing.DISABLED +) +//@Log4j2 +@NoArgsConstructor +public class CommandLogEntry +extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry { + + protected final static String FQCN = "org.apache.isis.extensions.commandlog.jdo.entities.CommandJdo"; + + /** + * Intended for use on primary system. + * + * @param command + */ + public CommandLogEntry(final Command command) { + super(command); + } + + /** + * Intended for use on secondary (replay) system. + * + * @param commandDto - obtained from the primary system as a representation of a command invocation + * @param replayState - controls whether this is to be replayed + * @param targetIndex - if the command represents a bulk action, then it is flattened out when replayed; this indicates which target to execute against. + */ + public CommandLogEntry( + final CommandDto commandDto, + final org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState, + final int targetIndex) { + super(commandDto, replayState, targetIndex); + } + + @PrimaryKey + @Column(allowsNull = InteractionIdStr.ALLOWS_NULL, name = InteractionIdStr.NAME, length = InteractionIdStr.MAX_LENGTH) + @InteractionIdStr + @Getter @Setter + private String interactionIdStr; + + + @Column(allowsNull = Username.ALLOWS_NULL, length = Username.MAX_LENGTH) + @Username + @Getter @Setter + private String username; + + + @Column(allowsNull = Timestamp.ALLOWS_NULL) + @Timestamp + @Getter @Setter + private java.sql.Timestamp timestamp; + + + @Column(allowsNull = ReplayState.ALLOWS_NULL, length=ReplayState.MAX_LENGTH) + @ReplayState + @Getter @Setter + private org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState; + + + @Column(allowsNull = ReplayStateFailureReason.ALLOWS_NULL, length = ReplayStateFailureReason.MAX_LENGTH) + @ReplayStateFailureReason + @Getter @Setter + private String replayStateFailureReason; + + + @Column(name = Parent.NAME, allowsNull = Parent.ALLOWS_NULL) + @Parent + @Getter + private CommandLogEntry parent; + @Override + public void setParent(final org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry parent) { + this.parent = (CommandLogEntry)parent; + } + + + @Persistent + @Column(allowsNull = Target.ALLOWS_NULL, length = Target.MAX_LENGTH) + @Target + @Getter @Setter + private Bookmark target; + + + @Column(allowsNull = LogicalMemberIdentifier.ALLOWS_NULL, length = LogicalMemberIdentifier.MAX_LENGTH) + @LogicalMemberIdentifier + @Getter @Setter + private String logicalMemberIdentifier; + + + @Persistent + @Column(allowsNull = CommandDtoAnnot.ALLOWS_NULL, jdbcType = "CLOB") + @CommandDtoAnnot + @Getter @Setter + private org.apache.isis.schema.cmd.v2.CommandDto commandDto; + + + @Column(allowsNull = StartedAt.ALLOWS_NULL) + @StartedAt + @Getter @Setter + private java.sql.Timestamp startedAt; + + + @Column(allowsNull = CompletedAt.ALLOWS_NULL) + @CompletedAt + @Getter @Setter + private java.sql.Timestamp completedAt; + + + @Persistent + @Column(allowsNull = Result.ALLOWS_NULL, length = Result.MAX_LENGTH) + @Result + @Getter @Setter + private Bookmark result; + + + @Persistent + @Column(allowsNull = Exception.ALLOWS_NULL, jdbcType = "CLOB") + @Getter @Setter + private String exception; + +} + diff --git a/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntryRepository.java b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntryRepository.java new file mode 100644 index 00000000000..77561536d74 --- /dev/null +++ b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntryRepository.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.extensions.commandlog.jdo.dom; + +import javax.inject.Named; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.annotation.PriorityPrecedence; +import org.apache.isis.extensions.commandlog.jdo.IsisModuleExtCommandLogJdo; + +/** + * Provides supporting functionality for querying and persisting + * {@link CommandLogEntry command} entities. + */ +@Service +@Named(CommandLogEntryRepository.LOGICAL_TYPE_NAME) +@javax.annotation.Priority(PriorityPrecedence.MIDPOINT) +@Qualifier("Jdo") +//@Log4j2 +public class CommandLogEntryRepository +extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository { + + public static final String LOGICAL_TYPE_NAME = IsisModuleExtCommandLogJdo.NAMESPACE + ".CommandLogEntryRepository"; + + public CommandLogEntryRepository() { + super(CommandLogEntry.class); + } +} diff --git a/extensions/core/command-log/jpa/pom.xml b/extensions/core/commandlog/jpa/pom.xml similarity index 93% rename from extensions/core/command-log/jpa/pom.xml rename to extensions/core/commandlog/jpa/pom.xml index 0f763a83d25..854366a6a46 100644 --- a/extensions/core/command-log/jpa/pom.xml +++ b/extensions/core/commandlog/jpa/pom.xml @@ -15,11 +15,11 @@ org.apache.isis.extensions - isis-extensions-command-log + isis-extensions-commandlog 2.0.0-SNAPSHOT - isis-extensions-command-log-jpa + isis-extensions-commandlog-jpa Apache Isis Ext - Command Log Implementation (JPA) @@ -45,10 +45,10 @@ - + org.apache.isis.extensions - isis-extensions-command-log-applib + isis-extensions-commandlog-applib @@ -57,21 +57,21 @@ org.apache.isis.persistence isis-persistence-jpa-eclipselink - + - + org.apache.isis.testing isis-testing-unittestsupport-applib test - + org.apache.isis.testing isis-testing-integtestsupport-applib test - + org.apache.isis.testing isis-testing-fixtures-applib diff --git a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java similarity index 61% rename from extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java rename to extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java index 0abb185c9d0..1fdbd4ca7a2 100644 --- a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java +++ b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java @@ -22,34 +22,38 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.subscriber.CommandSubscriberForCommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ui.CommandLogServiceMenu; -import org.apache.isis.extensions.commandlog.jpa.entities.CommandJpa; -import org.apache.isis.extensions.commandlog.jpa.entities.CommandJpaRepository; +import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; +import org.apache.isis.extensions.commandlog.applib.app.CommandLogServiceMenu; +import org.apache.isis.extensions.commandlog.applib.subscriber.CommandSubscriberForCommandLog; +import org.apache.isis.extensions.commandlog.jpa.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.jpa.dom.CommandLogEntryRepository; /** * @since 2.0 {@index} */ @Configuration @Import({ + // modules + IsisModuleExtCommandLogApplib.class, + // @DomainService's CommandLogServiceMenu.class, // @Service's - CommandJpaRepository.class, - CommandLog.TableColumnOrderDefault.class, + CommandLogEntryRepository.class, + org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry.TableColumnOrderDefault.class, CommandSubscriberForCommandLog.class, // entities - CommandJpa.class - + CommandLogEntry.class }) @EntityScan(basePackageClasses = { - CommandJpa.class, + CommandLogEntry.class, }) public class IsisModuleExtCommandLogJpa { - public static final String NAMESPACE = "isis.ext.commandLog"; + public static final String NAMESPACE = IsisModuleExtCommandLogApplib.NAMESPACE; + public static final String SCHEMA = IsisModuleExtCommandLogApplib.SCHEMA; + } diff --git a/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java new file mode 100644 index 00000000000..e1335c4c79d --- /dev/null +++ b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java @@ -0,0 +1,300 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.extensions.commandlog.jpa.dom; + +import javax.inject.Named; +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.JoinColumn; +import javax.persistence.Lob; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; + +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.command.Command; +import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; +import org.apache.isis.schema.cmd.v2.CommandDto; + +import static org.apache.isis.extensions.commandlog.jpa.dom.CommandLogEntry.*; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Table( + schema = CommandLogEntry.SCHEMA, + name = CommandLogEntry.TABLE, + indexes = { + @Index(name = "CommandJdo__startedAt__timestamp__IDX", columnList = "startedAt, timestamp" ), + @Index(name = "CommandJdo__timestamp__IDX", columnList = "timestamp"), + } +) +@NamedQueries({ + @NamedQuery( + name = Nq.FIND_BY_INTERACTION_ID_STR, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.interactionIdStr = :interactionIdStr"), + @NamedQuery( + name = Nq.FIND_BY_PARENT, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.parent = :parent "), + @NamedQuery( + name = Nq.FIND_CURRENT, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.completedAt is null " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_COMPLETED, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.completedAt is not null " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_RECENT_BY_TARGET, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.target = :target " + + " ORDER BY cl.timestamp DESC"), // programmatic LIMIT 30 + @NamedQuery( + name = Nq.FIND_BY_TARGET_AND_TIMESTAMP_BETWEEN, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.target = :target " + + " AND cl.timestamp >= :from " + + " AND cl.timestamp <= :to " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TARGET_AND_TIMESTAMP_AFTER, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.target = :target " + + " AND cl.timestamp >= :from " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TARGET_AND_TIMESTAMP_BEFORE, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.target = :target " + + " AND cl.timestamp <= :to " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TARGET, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.target = :target " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TIMESTAMP_BETWEEN, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.timestamp >= :from " + + " AND cl.timestamp <= :to " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TIMESTAMP_AFTER, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.timestamp >= :from " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TIMESTAMP_BEFORE, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.timestamp <= :to " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " ORDER BY cl.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_RECENT_BY_USERNAME, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.username = :username " + + " ORDER BY cl.timestamp DESC"), // programmatic LIMIT 30 + @NamedQuery( + name = Nq.FIND_FIRST, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.startedAt is not null " + + " AND cl.completedAt is not null " + + " ORDER BY cl.timestamp ASC"), // programmatic LIMIT 1 + @NamedQuery( + name = Nq.FIND_SINCE, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.timestamp > :timestamp " + + " AND cl.startedAt is not null " + + " AND cl.completedAt is not null " + + " ORDER BY cl.timestamp ASC"), + // most recent (replayed) command previously replicated from primary to + // secondary. This should always exist except for the very first times + // (after restored the prod DB to secondary). + @NamedQuery( + name = Nq.FIND_MOST_RECENT_REPLAYED, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE (cl.replayState = 'OK' OR cl.replayState = 'FAILED') " + + " ORDER BY cl.timestamp DESC"), // programmatic LIMIT 1 + @NamedQuery( + name = Nq.FIND_MOST_RECENT_COMPLETED, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.startedAt is not null " + + " AND cl.completedAt is not null " + + " ORDER BY cl.timestamp DESC"), // programmatic LIMIT 1 + @NamedQuery( + name = Nq.FIND_NOT_YET_REPLAYED, + query = "SELECT cl " + + " FROM CommandLogEntry cl " + + " WHERE cl.replayState = 'PENDING' " + + " ORDER BY cl.timestamp ASC"), // programmatic LIMIT 10 +}) +@Named(CommandLogEntry.LOGICAL_TYPE_NAME) +@DomainObject( + editing = Editing.DISABLED +) +@EntityListeners(IsisEntityListener.class) +@NoArgsConstructor +public class CommandLogEntry extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry { + + /** + * Intended for use on primary system. + * + * @param command + */ + public CommandLogEntry(final Command command) { + super(command); + } + + /** + * Intended for use on secondary (replay) system. + * + * @param commandDto - obtained from the primary system as a representation of a command invocation + * @param replayState - controls whether this is to be replayed + * @param targetIndex - if the command represents a bulk action, then it is flattened out when replayed; this indicates which target to execute against. + */ + public CommandLogEntry( + final CommandDto commandDto, + final org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState, + final int targetIndex) { + super(commandDto, replayState, targetIndex); + } + + @Id + @Column(nullable = InteractionIdStr.NULLABLE, name = InteractionIdStr.NAME, length = InteractionIdStr.MAX_LENGTH) + @InteractionIdStr + @Getter @Setter + private String interactionIdStr; + + + @Column(nullable = Username.NULLABLE, length = Username.MAX_LENGTH) + @Username + @Getter @Setter + private String username; + + + @Column(nullable = Timestamp.NULLABLE) + @Timestamp + @Getter @Setter + private java.sql.Timestamp timestamp; + + + @Column(nullable=true, length = ReplayState.MAX_LENGTH) @Enumerated(EnumType.STRING) + @ReplayState + @Getter @Setter + private org.apache.isis.extensions.commandlog.applib.dom.ReplayState replayState; + + + @Column(nullable=ReplayStateFailureReason.NULLABLE, length=ReplayStateFailureReason.MAX_LENGTH) + @ReplayStateFailureReason + @Getter @Setter + private String replayStateFailureReason; + + + @ManyToOne + @JoinColumn(name = Parent.NAME, nullable = Parent.NULLABLE) + @Parent + @Getter + private CommandLogEntry parent; + @Override + public void setParent(final org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry parent) { + this.parent = (CommandLogEntry)parent; + } + + + @Column(nullable = Target.NULLABLE, length = Target.MAX_LENGTH) + @Target + @Getter @Setter + private Bookmark target; + + + @Column(nullable = LogicalMemberIdentifier.NULLABLE, length = LogicalMemberIdentifier.MAX_LENGTH) + @LogicalMemberIdentifier + @Getter @Setter + private String logicalMemberIdentifier; + + + @Lob @Basic(fetch = FetchType.LAZY) + @Column(nullable = CommandDtoAnnot.NULLABLE, columnDefinition = "CLOB") + @CommandDtoAnnot + @Getter @Setter + private CommandDto commandDto; + + + @Column(nullable = StartedAt.NULLABLE) + @StartedAt + @Getter @Setter + private java.sql.Timestamp startedAt; + + + @Column(nullable = CompletedAt.NULLABLE) + @CompletedAt + @Getter @Setter + private java.sql.Timestamp completedAt; + + + @Column(nullable = Result.NULLABLE, length = Result.MAX_LENGTH) + @Result + @Getter @Setter + private Bookmark result; + + + @Lob @Basic(fetch = FetchType.LAZY) + @Column(nullable = Exception.NULLABLE, columnDefinition = "CLOB") + @Getter @Setter + private String exception; + +} diff --git a/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryRepository.java b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryRepository.java new file mode 100644 index 00000000000..b5d22848866 --- /dev/null +++ b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryRepository.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.extensions.commandlog.jpa.dom; + +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.annotation.PriorityPrecedence; +import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling; +import org.apache.isis.applib.query.Query; +import org.apache.isis.applib.query.QueryRange; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.command.Command; +import org.apache.isis.applib.services.iactn.InteractionProvider; +import org.apache.isis.applib.services.repository.RepositoryService; +import org.apache.isis.applib.util.schema.CommandDtoUtils; +import org.apache.isis.extensions.commandlog.applib.dom.ReplayState; +import org.apache.isis.extensions.commandlog.jpa.IsisModuleExtCommandLogJpa; +import org.apache.isis.schema.cmd.v2.CommandDto; +import org.apache.isis.schema.cmd.v2.CommandsDto; +import org.apache.isis.schema.cmd.v2.MapDto; +import org.apache.isis.schema.common.v2.InteractionType; +import org.apache.isis.schema.common.v2.OidDto; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +/** + * Provides supporting functionality for querying and persisting + * {@link CommandLogEntry command} entities. + */ +@Service +@Named(CommandLogEntryRepository.LOGICAL_TYPE_NAME) +@javax.annotation.Priority(PriorityPrecedence.MIDPOINT) +@Qualifier("Jpa") +//@Log4j2 +public class CommandLogEntryRepository +extends org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository { + + public static final String LOGICAL_TYPE_NAME = IsisModuleExtCommandLogJpa.NAMESPACE + ".CommandLogEntryRepository"; + + public CommandLogEntryRepository() { + super(CommandLogEntry.class); + } + + +} diff --git a/extensions/core/command-log/jpa/src/main/resources/META-INF/orm-commandlog.template b/extensions/core/commandlog/jpa/src/main/resources/META-INF/orm-commandlog.template similarity index 100% rename from extensions/core/command-log/jpa/src/main/resources/META-INF/orm-commandlog.template rename to extensions/core/commandlog/jpa/src/main/resources/META-INF/orm-commandlog.template diff --git a/extensions/core/command-log/pom.xml b/extensions/core/commandlog/pom.xml similarity index 88% rename from extensions/core/command-log/pom.xml rename to extensions/core/commandlog/pom.xml index 396de63fb0f..5f250483cdf 100644 --- a/extensions/core/command-log/pom.xml +++ b/extensions/core/commandlog/pom.xml @@ -1,13 +1,13 @@ - ../../pom.xml - isis-extensions-command-log + isis-extensions-commandlog Apache Isis Ext - Command Log Logs commands diff --git a/extensions/core/command-replay/adoc/antora.yml b/extensions/core/commandreplay/adoc/antora.yml similarity index 100% rename from extensions/core/command-replay/adoc/antora.yml rename to extensions/core/commandreplay/adoc/antora.yml diff --git a/extensions/core/command-replay/adoc/modules/command-replay/nav.adoc b/extensions/core/commandreplay/adoc/modules/command-replay/nav.adoc similarity index 100% rename from extensions/core/command-replay/adoc/modules/command-replay/nav.adoc rename to extensions/core/commandreplay/adoc/modules/command-replay/nav.adoc diff --git a/extensions/core/command-replay/adoc/modules/command-replay/pages/about.adoc b/extensions/core/commandreplay/adoc/modules/command-replay/pages/about.adoc similarity index 97% rename from extensions/core/command-replay/adoc/modules/command-replay/pages/about.adoc rename to extensions/core/commandreplay/adoc/modules/command-replay/pages/about.adoc index 1400fc6b276..4726fb8df79 100644 --- a/extensions/core/command-replay/adoc/modules/command-replay/pages/about.adoc +++ b/extensions/core/commandreplay/adoc/modules/command-replay/pages/about.adoc @@ -1,4 +1,4 @@ -[[command-replay]] +[[commandreplay]] = Command Replay :Notice: Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at. http://www.apache.org/licenses/LICENSE-2.0 . Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/extensions/core/commandreplay/adoc/modules/command-replay/partials/module-nav.adoc b/extensions/core/commandreplay/adoc/modules/command-replay/partials/module-nav.adoc new file mode 100644 index 00000000000..6bcf5b8b2b4 --- /dev/null +++ b/extensions/core/commandreplay/adoc/modules/command-replay/partials/module-nav.adoc @@ -0,0 +1,5 @@ + + +** xref:userguide:commandreplay:about.adoc[Command Replay] + + diff --git a/extensions/core/command-replay/pom.xml b/extensions/core/commandreplay/pom.xml similarity index 91% rename from extensions/core/command-replay/pom.xml rename to extensions/core/commandreplay/pom.xml index 7befe8179a5..9d97273baef 100644 --- a/extensions/core/command-replay/pom.xml +++ b/extensions/core/commandreplay/pom.xml @@ -1,13 +1,13 @@ - ../../pom.xml - isis-extensions-command-replay + isis-extensions-commandreplay Apache Isis Ext - Command Replay Replays commands to secondary system diff --git a/extensions/core/command-replay/primary/pom.xml b/extensions/core/commandreplay/primary/pom.xml similarity index 92% rename from extensions/core/command-replay/primary/pom.xml rename to extensions/core/commandreplay/primary/pom.xml index eb67449d974..ef062b90953 100644 --- a/extensions/core/command-replay/primary/pom.xml +++ b/extensions/core/commandreplay/primary/pom.xml @@ -15,11 +15,11 @@ org.apache.isis.extensions - isis-extensions-command-replay + isis-extensions-commandreplay 2.0.0-SNAPSHOT - isis-extensions-command-replay-primary + isis-extensions-commandreplay-primary Apache Isis Ext - Command Replay for Primary jar @@ -56,7 +56,7 @@ org.apache.isis.extensions - isis-extensions-command-log-applib + isis-extensions-commandlog-applib diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java similarity index 96% rename from extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java rename to extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java index cb7e5633ed8..4cb416fa78f 100644 --- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java +++ b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java @@ -30,7 +30,7 @@ import org.apache.isis.extensions.commandreplay.primary.ui.CommandReplayOnPrimaryService; /** - * Activates with Spring profile 'command-replay-primary'. + * Activates with Spring profile 'commandreplay-primary'. * @since 2.0 {@index} */ @Configuration @@ -47,7 +47,7 @@ Object_openOnSecondary.class, }) -@Profile("command-replay-primary") +@Profile("commandreplay-primary") public class IsisModuleExtCommandReplayPrimary { public static final String NAMESPACE = IsisModuleExtCommandLogApplib.NAMESPACE_REPLAY_PRIMARY; diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java similarity index 100% rename from extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java rename to extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java similarity index 100% rename from extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java rename to extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java similarity index 87% rename from extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java rename to extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java index 5bf60b9a41a..a211ba96c4b 100644 --- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java +++ b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java @@ -37,9 +37,9 @@ import org.apache.isis.applib.annotation.PriorityPrecedence; import org.apache.isis.applib.annotation.SemanticsOf; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository.NotFoundException; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository.NotFoundException; import org.apache.isis.extensions.commandreplay.primary.IsisModuleExtCommandReplayPrimary; import org.apache.isis.schema.cmd.v2.CommandDto; @@ -51,7 +51,7 @@ ) @Named(IsisModuleExtCommandReplayPrimary.NAMESPACE + ".CommandRetrievalOnPrimaryService") @javax.annotation.Priority(PriorityPrecedence.EARLY) -@Profile("command-replay-primary") +@Profile("commandreplay-primary") public class CommandRetrievalOnPrimaryService { public static abstract class ActionDomainEvent @@ -59,7 +59,7 @@ public static abstract class ActionDomainEvent public static class FindCommandsOnPrimaryFromDomainEvent extends ActionDomainEvent { } - @Inject ICommandLogRepository commandLogRepository; + @Inject CommandLogEntryRepository commandLogEntryRepository; /** * TODO: outdated info ... @@ -84,9 +84,9 @@ public List findCommandsOnPrimaryAsDto( @ParameterLayout(named="Batch size") final Integer batchSize) throws NotFoundException { - return commandLogRepository.findCommandsOnPrimaryElseFail(interactionId, batchSize) + return commandLogEntryRepository.findCommandsOnPrimaryElseFail(interactionId, batchSize) .stream() - .map(CommandLog::getCommandDto) + .map(CommandLogEntry::getCommandDto) .collect(Collectors.toList()); } @MemberSupport public Integer default1FindCommandsOnPrimaryAsDto() { diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java similarity index 94% rename from extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java rename to extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java index de0cba00c09..0eba355d109 100644 --- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java +++ b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java @@ -29,7 +29,7 @@ import org.apache.isis.applib.services.commanddto.conmap.UserDataKeys; import org.apache.isis.applib.services.commanddto.processor.spi.CommandDtoProcessorService; import org.apache.isis.applib.util.schema.CommandDtoUtils; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; import org.apache.isis.extensions.commandreplay.primary.IsisModuleExtCommandReplayPrimary; import org.apache.isis.schema.cmd.v2.CommandDto; @@ -52,11 +52,11 @@ public class CaptureResultOfCommand implements CommandDtoProcessorService { @Override public CommandDto process(final Object domainObject, CommandDto commandDto) { - if (!(domainObject instanceof CommandLog)) { + if (!(domainObject instanceof CommandLogEntry)) { return commandDto; } - val commandLog = (CommandLog) domainObject; + val commandLog = (CommandLogEntry) domainObject; if(commandDto == null) { commandDto = commandLog.getCommandDto(); } diff --git a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java similarity index 89% rename from extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java rename to extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java index 04d4b8a2476..9d799817235 100644 --- a/extensions/core/command-replay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java +++ b/extensions/core/commandreplay/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java @@ -41,10 +41,9 @@ import org.apache.isis.applib.services.message.MessageService; import org.apache.isis.applib.value.Clob; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository.NotFoundException; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository.NotFoundException; import org.apache.isis.extensions.commandreplay.primary.IsisModuleExtCommandReplayPrimary; import org.apache.isis.schema.cmd.v2.CommandDto; import org.apache.isis.schema.cmd.v2.CommandsDto; @@ -63,12 +62,12 @@ ) @Named(IsisModuleExtCommandReplayPrimary.NAMESPACE + ".CommandReplayOnPrimaryService") @javax.annotation.Priority(PriorityPrecedence.EARLY) -@Profile("command-replay-primary") +@Profile("commandreplay-primary") @RequiredArgsConstructor //@Log4j2 public class CommandReplayOnPrimaryService { - @Inject final ICommandLogRepository commandLogRepository; + @Inject final CommandLogEntryRepository commandLogEntryRepository; @Inject final JaxbService jaxbService; @Inject final MessageService messageService; @Inject final ContentMappingServiceForCommandsDto contentMappingServiceForCommandsDto; @@ -85,13 +84,13 @@ public class ActionEvent extends ActionDomainEvent { } /** * These actions should be called with HTTP Accept Header set to: - * application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v1.CommandsDto" + * application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v2.CommandsDto" * * @param interactionId - to search from. This transactionId will not be included in the response. * @param batchSize - the maximum number of commands to return. If not specified, all found will be returned. * @throws NotFoundException - if the command with specified transaction cannot be found. */ - @MemberSupport public List act( + @MemberSupport public List act( @Nullable @ParameterLayout(named="Interaction Id") final UUID interactionId, @@ -99,7 +98,7 @@ public class ActionEvent extends ActionDomainEvent { } @ParameterLayout(named="Batch size") final Integer batchSize) throws NotFoundException { - return commandLogRepository.findCommandsOnPrimaryElseFail(interactionId, batchSize); + return commandLogEntryRepository.findCommandsOnPrimaryElseFail(interactionId, batchSize); } @MemberSupport public Integer default1Act() { return 25; @@ -115,7 +114,7 @@ public class ActionEvent extends ActionDomainEvent { } /** * These actions should be called with HTTP Accept Header set to: - * application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v1.CommandsDto" + * application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v2.CommandsDto" * * @param interactionId - to search from. This transactionId will not be included in the response. * @param batchSize - the maximum number of commands to return. If not specified, all found will be returned. @@ -127,7 +126,7 @@ public class ActionEvent extends ActionDomainEvent { } @Nullable final Integer batchSize, final String filenamePrefix) { - final List commands = commandLogRepository.findSince(interactionId, batchSize); + final List commands = commandLogEntryRepository.findSince(interactionId, batchSize); if(commands == null) { messageService.informUser("No commands found"); } @@ -147,7 +146,6 @@ public class ActionEvent extends ActionDomainEvent { } @MemberSupport public String default2Act() { return "commands_from"; } - } @@ -160,7 +158,7 @@ public class ActionEvent extends ActionDomainEvent { } /** * This action should be called with HTTP Accept Header set to: - * application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v1.CommandDto" + * application/xml;profile="urn:org.restfulobjects:repr-types/action-result";x-ro-domain-type="org.apache.isis.schema.cmd.v2.CommandDto" * * @param interactionId - to download. * @throws NotFoundException - if the command with specified transaction cannot be found. @@ -169,7 +167,7 @@ public class ActionEvent extends ActionDomainEvent { } final UUID interactionId, final String filenamePrefix) { - return commandLogRepository.findByInteractionId(interactionId) + return commandLogEntryRepository.findByInteractionId(interactionId) .map(commandJdo -> { final CommandDto commandDto = commandJdo.getCommandDto(); diff --git a/extensions/core/command-replay/secondary/log4j2-test.xml b/extensions/core/commandreplay/secondary/log4j2-test.xml similarity index 100% rename from extensions/core/command-replay/secondary/log4j2-test.xml rename to extensions/core/commandreplay/secondary/log4j2-test.xml diff --git a/extensions/core/command-replay/secondary/pom.xml b/extensions/core/commandreplay/secondary/pom.xml similarity index 90% rename from extensions/core/command-replay/secondary/pom.xml rename to extensions/core/commandreplay/secondary/pom.xml index 1ca33ab512d..a0d960f5fb7 100644 --- a/extensions/core/command-replay/secondary/pom.xml +++ b/extensions/core/commandreplay/secondary/pom.xml @@ -1,13 +1,13 @@ - org.apache.isis.extensions - isis-extensions-command-replay + isis-extensions-commandreplay 2.0.0-SNAPSHOT - isis-extensions-command-replay-secondary + isis-extensions-commandreplay-secondary Apache Isis Ext - Command Replay for Secondary jar @@ -64,7 +64,7 @@ org.apache.isis.extensions - isis-extensions-command-log-applib + isis-extensions-commandlog-applib @@ -79,7 +79,7 @@ isis-core-internaltestsupport test - + org.apache.isis.viewer isis-viewer-restfulobjects-jaxrsresteasy4 @@ -93,4 +93,4 @@ - \ No newline at end of file + diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java similarity index 98% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java index 049da82dce3..484be173fec 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java @@ -53,7 +53,7 @@ import lombok.val; /** - * Activates with Spring profile 'command-replay-secondary'. + * Activates with Spring profile 'commandreplay-secondary'. * @since 2.0 {@index} */ @Configuration @@ -75,7 +75,7 @@ Object_openOnPrimary.class, }) -@Profile("command-replay-secondary") +@Profile("commandreplay-secondary") public class IsisModuleExtCommandReplaySecondary { public static final String NAMESPACE = IsisModuleExtCommandLogApplib.NAMESPACE_REPLAY_SECONDARY; diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java similarity index 86% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java index 3125d76972b..360cb73cc00 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java @@ -18,7 +18,7 @@ */ package org.apache.isis.extensions.commandreplay.secondary.analyser; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; /** * @since 2.0 {@index} @@ -27,9 +27,9 @@ public interface CommandReplayAnalyser { /** * - * @param commandJdo + * @param commandLogEntry * @return - if not null, indicates the reason that there was an issue replaying the command. */ - String analyzeReplay(final ICommandLog commandJdo); + String analyzeReplay(final CommandLogEntry commandLogEntry); } diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java similarity index 92% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java index 10a467445ec..ba123061950 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java @@ -30,7 +30,7 @@ import org.apache.isis.applib.util.schema.CommandDtoUtils; import org.apache.isis.commons.internal.base._Strings; import org.apache.isis.core.config.IsisConfiguration; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary; import org.apache.isis.schema.common.v2.InteractionType; @@ -55,12 +55,12 @@ public void init() { } @Override - public String analyzeReplay(final ICommandLog commandLog) { + public String analyzeReplay(final CommandLogEntry commandLogEntry) { if(!enabled) { return null; } - val dto = commandLog.getCommandDto(); + val dto = commandLogEntry.getCommandDto(); if(dto.getMember().getInteractionType() == InteractionType.PROPERTY_EDIT) { return null; } @@ -70,7 +70,7 @@ public String analyzeReplay(final ICommandLog commandLog) { return null; } - val replayedException = commandLog.getException(); + val replayedException = commandLogEntry.getException(); val primaryExceptionTrimmed = trimmed(primaryException); val replayedExceptionTrimmed = trimmed(replayedException); diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java similarity index 91% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java index 992feb44cd3..b395bb16428 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java @@ -29,7 +29,7 @@ import org.apache.isis.applib.services.commanddto.conmap.UserDataKeys; import org.apache.isis.applib.util.schema.CommandDtoUtils; import org.apache.isis.core.config.IsisConfiguration; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary; import org.apache.isis.schema.common.v2.InteractionType; @@ -54,12 +54,12 @@ public void init() { } @Override - public String analyzeReplay(final ICommandLog commandLog) { + public String analyzeReplay(final CommandLogEntry commandLogEntry) { if(!enabled) { return null; } - val dto = commandLog.getCommandDto(); + val dto = commandLogEntry.getCommandDto(); if(dto.getMember().getInteractionType() == InteractionType.PROPERTY_EDIT) { return null; } @@ -68,7 +68,7 @@ public String analyzeReplay(final ICommandLog commandLog) { // ... either the same result when replayed val primaryResultStr = CommandDtoUtils.getUserData(dto, UserDataKeys.RESULT); - val secondaryResult = commandLog.getResult(); + val secondaryResult = commandLogEntry.getResult(); val secondaryResultStr = secondaryResult != null ? secondaryResult.toString() : null; return Objects.equals(primaryResultStr, secondaryResultStr) diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java similarity index 85% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java index 6fee1e151fe..c37b7f2ba7d 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java @@ -26,7 +26,7 @@ import org.springframework.stereotype.Service; import org.apache.isis.applib.annotation.PriorityPrecedence; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary; import org.apache.isis.extensions.commandreplay.secondary.analyser.CommandReplayAnalyser; @@ -46,17 +46,17 @@ public class CommandReplayAnalysisService { * as in error. * This will effectively block the running of any further commands until the administrator fixes the issue. */ - public void analyse(final ICommandLog commandLog) { - final String analysis = analyseReplay(commandLog); + public void analyse(final CommandLogEntry commandLogEntry) { + final String analysis = analyseReplay(commandLogEntry); - commandLog.saveAnalysis(analysis); + commandLogEntry.saveAnalysis(analysis); } - private String analyseReplay(final ICommandLog commandJdo) { + private String analyseReplay(final CommandLogEntry commandLogEntry) { for (final CommandReplayAnalyser analyser : analysers) { try { - String reason = analyser.analyzeReplay(commandJdo); + String reason = analyser.analyzeReplay(commandLogEntry); if (reason != null) { return reason; } diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/config/SecondaryConfig.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/config/SecondaryConfig.java similarity index 100% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/config/SecondaryConfig.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/config/SecondaryConfig.java diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java similarity index 95% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java index 1281e3383e3..249a2456133 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java @@ -33,7 +33,7 @@ import org.apache.isis.applib.client.SuppressionType; import org.apache.isis.commons.collections.Can; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig; import org.apache.isis.extensions.commandreplay.secondary.status.SecondaryStatus; import org.apache.isis.extensions.commandreplay.secondary.status.StatusException; @@ -77,7 +77,7 @@ public CommandFetcher(final SecondaryConfig secondaryConfig) { * @throws StatusException */ public Can fetchCommand( - final @Nullable ICommandLog previousHwmIfAny) + final @Nullable CommandLogEntry previousHwmIfAny) throws StatusException { log.debug("finding command on primary ..."); @@ -90,7 +90,7 @@ public Can fetchCommand( * @param previousHwmIfAny * @throws StatusException */ - private Can fetchCommands(final ICommandLog previousHwmIfAny) + private Can fetchCommands(final CommandLogEntry previousHwmIfAny) throws StatusException { final UUID transactionId = previousHwmIfAny != null diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java similarity index 100% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/SecondaryStatusData.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/SecondaryStatusData.java similarity index 100% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/SecondaryStatusData.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/SecondaryStatusData.java diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java similarity index 85% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java index 654a8ad770d..0dec69a4a98 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java @@ -28,9 +28,9 @@ import org.apache.isis.applib.services.command.CommandExecutorService; import org.apache.isis.applib.services.xactn.TransactionService; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; -import org.apache.isis.extensions.commandlog.applib.command.ReplayState; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; +import org.apache.isis.extensions.commandlog.applib.dom.ReplayState; import org.apache.isis.extensions.commandreplay.secondary.analysis.CommandReplayAnalysisService; import org.apache.isis.extensions.commandreplay.secondary.fetch.CommandFetcher; import org.apache.isis.extensions.commandreplay.secondary.spi.ReplayCommandExecutionController; @@ -58,7 +58,7 @@ public class ReplicateAndRunCommands implements Callable { @Inject CommandExecutorService commandExecutorService; @Inject TransactionService transactionService; @Inject CommandFetcher commandFetcher; - @Inject ICommandLogRepository commandLogRepository; + @Inject CommandLogEntryRepository commandLogEntryRepository; @Inject CommandReplayAnalysisService analysisService; @Inject Optional controller; @@ -79,18 +79,18 @@ private void doCall() throws StatusException { return; } - List commandsToReplay; + List commandsToReplay; while(isRunning()) { // is there a pending command already? // (we fetch several at a time, so we may not have processed them all yet) - commandsToReplay = commandLogRepository.findNotYetReplayed(); + commandsToReplay = commandLogEntryRepository.findNotYetReplayed(); if(commandsToReplay.isEmpty()) { // look for previously replayed on secondary - CommandLog hwm = commandLogRepository.findMostRecentReplayed().orElse(null); + CommandLogEntry hwm = commandLogEntryRepository.findMostRecentReplayed().orElse(null); if (hwm != null) { // give up if there was a failure; admin will need to fix issue and retry @@ -103,7 +103,7 @@ private void doCall() throws StatusException { // after a DB restore from primary to secondary, there won't be // any that have been replayed. So instead we simply use // latest completed (on primary) as the HWM. - hwm = commandLogRepository.findMostRecentCompleted().orElse(null); + hwm = commandLogEntryRepository.findMostRecentCompleted().orElse(null); } // fetch next command(s) from primary (if any) @@ -111,7 +111,7 @@ private void doCall() throws StatusException { commandsToReplay = commandDtos.stream() .map(dto -> transactionService.callWithinCurrentTransactionElseCreateNew( - () -> commandLogRepository.saveForReplay(dto)) + () -> commandLogEntryRepository.saveForReplay(dto)) .ifFailureFail() .getValue().orElse(null) ) @@ -131,7 +131,7 @@ private void doCall() throws StatusException { * @param commandsToReplay * @apiNote could return, whether there was a command to process (and so continue) */ - private void replay(final List commandsToReplay) { + private void replay(final List commandsToReplay) { commandsToReplay.forEach(commandLog -> { @@ -154,7 +154,7 @@ private void replay(final List commandsToReplay) { val childCommands = transactionService.callWithinCurrentTransactionElseCreateNew( - () -> commandLogRepository.findByParent(parent)) + () -> commandLogEntryRepository.findByParent(parent)) .ifFailureFail() .getValue().orElse(Collections.emptyList()); for (val childCommand : childCommands) { @@ -170,18 +170,18 @@ private void replay(final List commandsToReplay) { } - private ReplayState executeCommandInTranAndAnalyse(final CommandLog commandLog) { + private ReplayState executeCommandInTranAndAnalyse(final CommandLogEntry commandLogEntry) { transactionService.runWithinCurrentTransactionElseCreateNew( () -> { commandExecutorService.executeCommand( - CommandExecutorService.InteractionContextPolicy.SWITCH_USER_AND_TIME, commandLog.getCommandDto(), commandLog.outcomeHandler()); + CommandExecutorService.InteractionContextPolicy.SWITCH_USER_AND_TIME, commandLogEntry.getCommandDto(), commandLogEntry.outcomeHandler()); }); transactionService.runWithinCurrentTransactionElseCreateNew(() -> { - analysisService.analyse(commandLog); + analysisService.analyse(commandLogEntry); }); - return commandLog.getReplayState(); + return commandLogEntry.getReplayState(); } diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLog_exclude.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLogEntry_exclude.java similarity index 79% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLog_exclude.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLogEntry_exclude.java index 2c64253b85c..b7806e8ec73 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLog_exclude.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLogEntry_exclude.java @@ -27,8 +27,8 @@ import org.apache.isis.applib.annotation.MemberSupport; import org.apache.isis.applib.annotation.SemanticsOf; import org.apache.isis.extensions.commandlog.applib.IsisModuleExtCommandLogApplib; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ReplayState; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.ReplayState; import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig; import lombok.RequiredArgsConstructor; @@ -39,29 +39,29 @@ */ @Action( semantics = SemanticsOf.NON_IDEMPOTENT_ARE_YOU_SURE, - domainEvent = CommandLog_exclude.ActionDomainEvent.class + domainEvent = CommandLogEntry_exclude.ActionDomainEvent.class ) @ActionLayout(associateWith = "executeIn", sequence = "2") @RequiredArgsConstructor //@Log4j2 -public class CommandLog_exclude { +public class CommandLogEntry_exclude { public static class ActionDomainEvent - extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } + extends IsisModuleExtCommandLogApplib.ActionDomainEvent { } - final CommandLog commandLog; + final CommandLogEntry commandLogEntry; @MemberSupport - public CommandLog act() { - commandLog.setReplayState(ReplayState.EXCLUDED); - return commandLog; + public CommandLogEntry act() { + commandLogEntry.setReplayState(ReplayState.EXCLUDED); + return commandLogEntry; } @MemberSupport public boolean hideAct() { return !secondaryConfig.isPresent() || !secondaryConfig.get().isConfigured() ; } @MemberSupport public String disableAct() { final boolean notInError = - commandLog.getReplayState() == null || !commandLog.getReplayState().isFailed(); + commandLogEntry.getReplayState() == null || !commandLogEntry.getReplayState().isFailed(); return notInError ? "This command is not in error, so cannot be excluded." : null; diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLog_replayQueue.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLogEntry_replayQueue.java similarity index 74% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLog_replayQueue.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLogEntry_replayQueue.java index 001f7bfcdb7..6c0317de69c 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLog_replayQueue.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLogEntry_replayQueue.java @@ -24,8 +24,8 @@ import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.CollectionLayout; -import org.apache.isis.extensions.commandlog.applib.command.CommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary; import org.apache.isis.extensions.commandreplay.secondary.config.SecondaryConfig; @@ -35,28 +35,28 @@ * @since 2.0 {@index} */ @Collection( - domainEvent = CommandLog_replayQueue.CollectionDomainEvent.class + domainEvent = CommandLogEntry_replayQueue.CollectionDomainEvent.class ) @CollectionLayout( defaultView = "table", sequence = "100.100" ) @RequiredArgsConstructor -public class CommandLog_replayQueue { +public class CommandLogEntry_replayQueue { public static class CollectionDomainEvent - extends IsisModuleExtCommandReplaySecondary.CollectionDomainEvent { } + extends IsisModuleExtCommandReplaySecondary.CollectionDomainEvent { } - final CommandLog commandLog; + final CommandLogEntry commandLogEntry; - public List coll() { - return commandLogRepository.findReplayedOnSecondary(); + public List coll() { + return commandLogEntryRepository.findNotYetReplayed(); } public boolean hideColl() { return !secondaryConfig.isConfigured(); } @Inject SecondaryConfig secondaryConfig; - @Inject ICommandLogRepository commandLogRepository; + @Inject CommandLogEntryRepository commandLogEntryRepository; } diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/Object_openOnPrimary.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/Object_openOnPrimary.java similarity index 100% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/Object_openOnPrimary.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/Object_openOnPrimary.java diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/spi/ReplayCommandExecutionController.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/spi/ReplayCommandExecutionController.java similarity index 100% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/spi/ReplayCommandExecutionController.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/spi/ReplayCommandExecutionController.java diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/SecondaryStatus.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/SecondaryStatus.java similarity index 100% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/SecondaryStatus.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/SecondaryStatus.java diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/StatusException.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/StatusException.java similarity index 100% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/StatusException.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/StatusException.java diff --git a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java similarity index 88% rename from extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java rename to extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java index 1a1ec34a263..56edcd76540 100644 --- a/extensions/core/command-replay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java +++ b/extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java @@ -34,8 +34,8 @@ import org.apache.isis.applib.annotation.SemanticsOf; import org.apache.isis.applib.services.jaxb.JaxbService; import org.apache.isis.applib.value.Clob; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLogRepository; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import org.apache.isis.extensions.commandreplay.secondary.IsisModuleExtCommandReplaySecondary; import org.apache.isis.schema.cmd.v2.CommandDto; import org.apache.isis.schema.cmd.v2.CommandsDto; @@ -59,7 +59,7 @@ //@Log4j2 public class CommandReplayOnSecondaryService { - @Inject ICommandLogRepository commandLogRepository; + @Inject CommandLogEntryRepository commandLogEntryRepository; @Inject JaxbService jaxbService; public static abstract class ActionDomainEvent extends IsisModuleExtCommandReplaySecondary.ActionDomainEvent { } @@ -70,8 +70,8 @@ public class findMostRecentReplayed{ public class ActionEvent extends ActionDomainEvent { } - @MemberSupport public ICommandLog act() { - return commandLogRepository.findMostRecentReplayed().orElse(null); + @MemberSupport public CommandLogEntry act() { + return commandLogEntryRepository.findMostRecentReplayed().orElse(null); } } @@ -99,7 +99,7 @@ public class ActionEvent extends ActionDomainEvent { } } for (final CommandDto commandDto : commandDtoList) { - commandLogRepository.saveForReplay(commandDto); + commandLogEntryRepository.saveForReplay(commandDto); } } diff --git a/extensions/core/command-replay/secondary/src/test/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher_Test.java b/extensions/core/commandreplay/secondary/src/test/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher_Test.java similarity index 100% rename from extensions/core/command-replay/secondary/src/test/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher_Test.java rename to extensions/core/commandreplay/secondary/src/test/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher_Test.java diff --git a/extensions/pom.xml b/extensions/pom.xml index a20fd6a0dc1..f5773e1ea4e 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -89,19 +89,19 @@ org.apache.isis.extensions - isis-extensions-command-log-applib + isis-extensions-commandlog-applib 2.0.0-SNAPSHOT org.apache.isis.extensions - isis-extensions-command-log-jdo + isis-extensions-commandlog-jdo 2.0.0-SNAPSHOT org.apache.isis.extensions - isis-extensions-command-log-jpa + isis-extensions-commandlog-jpa 2.0.0-SNAPSHOT @@ -113,13 +113,13 @@ org.apache.isis.extensions - isis-extensions-command-replay-primary + isis-extensions-commandreplay-primary 2.0.0-SNAPSHOT org.apache.isis.extensions - isis-extensions-command-replay-secondary + isis-extensions-commandreplay-secondary 2.0.0-SNAPSHOT @@ -228,6 +228,12 @@ 2.0.0-SNAPSHOT + + org.apache.isis.extensions + isis-extensions-sessionlog-impl + 2.0.0-SNAPSHOT + + org.apache.isis.extensions isis-extensions-cors-impl @@ -257,14 +263,15 @@ applib/excel - core/command-log - core/command-replay + core/commandlog + core/commandreplay core/flyway core/quartz security/secman security/shiro-realm-ldap security/spring-oauth2 + security/sessionlog vro/cors diff --git a/extensions/security/audit-trail/adoc/modules/audit-trail/partials/module-nav.adoc b/extensions/security/audit-trail/adoc/modules/audit-trail/partials/module-nav.adoc deleted file mode 100644 index e47f9f11dd0..00000000000 --- a/extensions/security/audit-trail/adoc/modules/audit-trail/partials/module-nav.adoc +++ /dev/null @@ -1,6 +0,0 @@ - - - -** xref:security:audit-trail:about.adoc[Audit Trail] - - diff --git a/extensions/security/audit-trail/adoc/antora.yml b/extensions/security/audittrail/adoc/antora.yml similarity index 100% rename from extensions/security/audit-trail/adoc/antora.yml rename to extensions/security/audittrail/adoc/antora.yml diff --git a/extensions/security/audit-trail/adoc/modules/audit-trail/nav.adoc b/extensions/security/audittrail/adoc/modules/audit-trail/nav.adoc similarity index 100% rename from extensions/security/audit-trail/adoc/modules/audit-trail/nav.adoc rename to extensions/security/audittrail/adoc/modules/audit-trail/nav.adoc diff --git a/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc b/extensions/security/audittrail/adoc/modules/audit-trail/pages/about.adoc similarity index 90% rename from extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc rename to extensions/security/audittrail/adoc/modules/audit-trail/pages/about.adoc index 0cdc6526488..4eadf43ebfe 100644 --- a/extensions/security/audit-trail/adoc/modules/audit-trail/pages/about.adoc +++ b/extensions/security/audittrail/adoc/modules/audit-trail/pages/about.adoc @@ -5,7 +5,7 @@ WARNING: TODO: this content has not yet been reviewed/updated for v2.0 -The xref:security:audit-trail:about.adoc[Auditer] module provides an implementation of the xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber], as well as a number of related domain services, +The xref:security:audittrail:about.adoc[Auditer] module provides an implementation of the xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber], as well as a number of related domain services, It creates an audit record for each changed property (ie every time that `AuditerService#audit(...)` is called. The module also provides: @@ -32,6 +32,6 @@ The typical way to indicate that an object should be audited is to annotate it w The auditing service works very well with implementations of xref:refguide:applib:index/services/publishing/spi/ExecutionSubscriber.adoc[ExecutionSubscriber] that persist the ``Execution`` objects obtained from the xref:refguide:applib:index/services/iactn/InteractionContext.adoc[InteractionContext] service. The interaction execution captures the _cause_ of an interaction (an action was invoked, a property was edited), while the `EntityPropertyChangeSubscriber` audit entries capture the _effect_ of that interaction in terms of changed state. -The xref:refguide:applib:index/services/publishing/spi/CommandSubscriber.adoc[CommandSubscriber] SPI can also be combined with the audit-trail service, where the xref:refguide:applib:index/services/command/Command.adoc[Command] capturesthe _intent_ of an action, not the actual action invocation itself. +The xref:refguide:applib:index/services/publishing/spi/CommandSubscriber.adoc[CommandSubscriber] SPI can also be combined with the audit trail service, where the xref:refguide:applib:index/services/command/Command.adoc[Command] capturesthe _intent_ of an action, not the actual action invocation itself. diff --git a/extensions/security/audittrail/adoc/modules/audit-trail/partials/module-nav.adoc b/extensions/security/audittrail/adoc/modules/audit-trail/partials/module-nav.adoc new file mode 100644 index 00000000000..72ce36900dc --- /dev/null +++ b/extensions/security/audittrail/adoc/modules/audit-trail/partials/module-nav.adoc @@ -0,0 +1,6 @@ + + + +** xref:security:audittrail:about.adoc[Audit Trail] + + diff --git a/extensions/security/audittrail/impl/src/main/java/META-INF/persistence.xml b/extensions/security/audittrail/impl/src/main/java/META-INF/persistence.xml new file mode 100644 index 00000000000..c2abfdaf545 --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/META-INF/persistence.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/AuditModule.java b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/AuditModule.java new file mode 100644 index 00000000000..313e32e3acf --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/AuditModule.java @@ -0,0 +1,30 @@ +package org.isisaddons.module.audit; + +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.isis.applib.ModuleAbstract; +import org.apache.isis.applib.fixturescripts.FixtureScript; +import org.apache.isis.applib.fixturescripts.teardown.TeardownFixtureAbstract; + +import org.isisaddons.module.audit.dom.AuditEntry; + +@XmlRootElement(name = "module") +public class AuditModule extends ModuleAbstract { + + public abstract static class ActionDomainEvent extends org.apache.isis.applib.services.eventbus.ActionDomainEvent { } + + public abstract static class CollectionDomainEvent extends org.apache.isis.applib.services.eventbus.CollectionDomainEvent { } + + public abstract static class PropertyDomainEvent extends org.apache.isis.applib.services.eventbus.PropertyDomainEvent { } + + @Override + public FixtureScript getTeardownFixture() { + return new TeardownFixtureAbstract() { + @Override + protected void execute(final FixtureScript.ExecutionContext executionContext) { + deleteFrom(AuditEntry.class); + } + }; + } + +} diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.java b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.java new file mode 100644 index 00000000000..e2e1996f3d0 --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.java @@ -0,0 +1,395 @@ +package org.isisaddons.module.audit.dom; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.UUID; + +import javax.jdo.annotations.IdentityType; + +import org.apache.isis.applib.Identifier; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.PropertyLayout; +import org.apache.isis.applib.annotation.Where; +import org.apache.isis.applib.services.HasTransactionId; +import org.apache.isis.applib.services.HasUsername; +import org.apache.isis.applib.util.ObjectContracts; +import org.apache.isis.applib.util.TitleBuffer; +import org.apache.isis.objectstore.jdo.applib.service.DomainChangeJdoAbstract; +import org.apache.isis.objectstore.jdo.applib.service.JdoColumnLength; +import org.apache.isis.objectstore.jdo.applib.service.Util; + +import org.isisaddons.module.audit.AuditModule; + +import lombok.Getter; +import lombok.Setter; + +@javax.jdo.annotations.PersistenceCapable( + identityType=IdentityType.DATASTORE, + schema = "isisaudit", + table="AuditEntry") +@javax.jdo.annotations.DatastoreIdentity( + strategy=javax.jdo.annotations.IdGeneratorStrategy.IDENTITY, + column="id") +@javax.jdo.annotations.Queries( { + @javax.jdo.annotations.Query( + name="findFirstByTarget", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE targetStr == :targetStr " + + "ORDER BY timestamp ASC " + + "RANGE 0,2"), + @javax.jdo.annotations.Query( + name="findRecentByTarget", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE targetStr == :targetStr " + + "ORDER BY timestamp DESC " + + "RANGE 0,100"), + @javax.jdo.annotations.Query( + name="findRecentByTargetAndPropertyId", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE targetStr == :targetStr " + + "&& propertyId == :propertyId " + + "ORDER BY timestamp DESC " + + "RANGE 0,30"), + @javax.jdo.annotations.Query( + name="findByTransactionId", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE transactionId == :transactionId"), + @javax.jdo.annotations.Query( + name="findByTargetAndTimestampBetween", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE targetStr == :targetStr " + + "&& timestamp >= :from " + + "&& timestamp <= :to " + + "ORDER BY timestamp DESC"), + @javax.jdo.annotations.Query( + name="findByTargetAndTimestampAfter", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE targetStr == :targetStr " + + "&& timestamp >= :from " + + "ORDER BY timestamp DESC"), + @javax.jdo.annotations.Query( + name="findByTargetAndTimestampBefore", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE targetStr == :targetStr " + + "&& timestamp <= :to " + + "ORDER BY timestamp DESC"), + @javax.jdo.annotations.Query( + name="findByTarget", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE targetStr == :targetStr " + + "ORDER BY timestamp DESC"), + @javax.jdo.annotations.Query( + name="findByTimestampBetween", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE timestamp >= :from " + + "&& timestamp <= :to " + + "ORDER BY timestamp DESC"), + @javax.jdo.annotations.Query( + name="findByTimestampAfter", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE timestamp >= :from " + + "ORDER BY timestamp DESC"), + @javax.jdo.annotations.Query( + name="findByTimestampBefore", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "WHERE timestamp <= :to " + + "ORDER BY timestamp DESC"), + @javax.jdo.annotations.Query( + name="find", language="JDOQL", + value="SELECT " + + "FROM org.isisaddons.module.audit.dom.AuditEntry " + + "ORDER BY timestamp DESC") +}) +//@Indices({ +// @Index(name="AuditEntry_ak", unique="true", +// columns={ +// @javax.jdo.annotations.Column(name="transactionId"), +// @javax.jdo.annotations.Column(name="sequence"), +// @javax.jdo.annotations.Column(name="target"), +// @javax.jdo.annotations.Column(name="propertyId") +// }), +// @Index(name="AuditEntry_target_ts_IDX", unique="false", +// members={ "targetStr", "timestamp" }), +//}) +@DomainObject( + editing = Editing.DISABLED, + objectType = "isisaudit.AuditEntry" +) +public class AuditEntry extends DomainChangeJdoAbstract implements HasTransactionId, HasUsername { + + //region > domain events + public static abstract class PropertyDomainEvent extends AuditModule.PropertyDomainEvent { + } + //endregion + + public AuditEntry() { + super(ChangeType.AUDIT_ENTRY); + } + + //region > title + + public String title() { + + // nb: not thread-safe + // formats defined in https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html + final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + final TitleBuffer buf = new TitleBuffer(); + buf.append(format.format(getTimestamp())); + buf.append(" ").append(getMemberIdentifier()); + return buf.toString(); + } + + //endregion + + //region > user (property) + public static class UserDomainEvent extends PropertyDomainEvent { + } + + @javax.jdo.annotations.Column(allowsNull="false", length=JdoColumnLength.USER_NAME) + @Property( + domainEvent = UserDomainEvent.class + ) + @PropertyLayout( + hidden = Where.PARENTED_TABLES + ) + @Getter @Setter + private String user; + + @Programmatic + public String getUsername() { + return getUser(); + } + //endregion + + //region > timestamp (property) + + public static class TimestampDomainEvent extends PropertyDomainEvent { + } + + @javax.jdo.annotations.Column(allowsNull="false") + @Property( + domainEvent = TimestampDomainEvent.class + ) + @PropertyLayout( + hidden = Where.PARENTED_TABLES + ) + @Getter @Setter + private Timestamp timestamp; + + //endregion + + //region > transactionId (property) + + public static class TransactionIdDomainEvent extends PropertyDomainEvent { + } + + /** + * The unique identifier (a GUID) of the interaction in which this audit entry was persisted. + * + *

+ * The combination of (({@link #getTransactionId() transactionId}, {@link #getSequence() sequence}) makes up the + * unique transaction identifier. + *

+ * + *

+ * The combination of ({@link #getTransactionId() transactionId}, {@link #getSequence()}, {@link #getTargetStr() target}, {@link #getPropertyId() propertyId} ) makes up the + * alternative key. + *

+ */ + @javax.jdo.annotations.Column(allowsNull="false", length=JdoColumnLength.TRANSACTION_ID) + @Property( + domainEvent = TransactionIdDomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + hidden=Where.PARENTED_TABLES, + typicalLength = 36 + ) + @Getter @Setter + private UUID transactionId; + + //endregion + + //region > sequence (property) + + public static class SequenceDomainEvent extends PropertyDomainEvent { + } + + /** + * The 0-based sequence number of the transaction in which this audit entry was persisted. + * + *

+ * The combination of (({@link #getTransactionId() transactionId}, {@link #getSequence() sequence}) makes up the + * unique transaction identifier. + *

+ * + *

+ * The combination of (({@link #getTransactionId() transactionId}, {@link #getSequence() sequence}, {@link #getTargetStr() target}, {@link #getPropertyId() propertyId} ) makes up the + * alternative key. + *

+ */ + @javax.jdo.annotations.Column(allowsNull="false") + @Property( + domainEvent = SequenceDomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + hidden=Where.PARENTED_TABLES + ) + @Getter @Setter + private int sequence; + + //endregion + + //region > targetClass (property) + + public static class TargetClassDomainEvent extends PropertyDomainEvent { + } + + @javax.jdo.annotations.Column(allowsNull="true", length=JdoColumnLength.TARGET_CLASS) + @Property( + domainEvent = TargetClassDomainEvent.class + ) + @PropertyLayout( + named = "Class", + typicalLength = 30 + ) + @Getter + private String targetClass; + + public void setTargetClass(final String targetClass) { + this.targetClass = Util.abbreviated(targetClass, JdoColumnLength.TARGET_CLASS); + } + + //endregion + + //region > targetStr (property) + + public static class TargetStrDomainEvent extends PropertyDomainEvent { + } + + @javax.jdo.annotations.Column(allowsNull="true", length=JdoColumnLength.BOOKMARK, name="target") + @Property( + domainEvent = TargetStrDomainEvent.class + ) + @PropertyLayout( + named = "Object" + ) + @Getter @Setter + private String targetStr; + //endregion + + //region > memberIdentifier (property) + + public static class MemberIdentifierDomainEvent extends PropertyDomainEvent { + } + + /** + * This is the fully-qualified class and property Id, as per + * {@link Identifier#toClassAndNameIdentityString()}. + */ + @javax.jdo.annotations.Column(allowsNull="true", length=JdoColumnLength.MEMBER_IDENTIFIER) + @Property( + domainEvent = MemberIdentifierDomainEvent.class + ) + @PropertyLayout( + typicalLength = 60, + hidden = Where.ALL_TABLES + ) + @Getter + private String memberIdentifier; + + public void setMemberIdentifier(final String memberIdentifier) { + this.memberIdentifier = Util.abbreviated(memberIdentifier, JdoColumnLength.MEMBER_IDENTIFIER); + } + //endregion + + //region > propertyId (property) + + public static class PropertyIdDomainEvent extends PropertyDomainEvent { + } + + /** + * This is the property name (without the class). + */ + @javax.jdo.annotations.Column(allowsNull="true", length=JdoColumnLength.AuditEntry.PROPERTY_ID) + @Property( + domainEvent = PropertyIdDomainEvent.class + ) + @PropertyLayout( + hidden = Where.NOWHERE + ) + @Getter + private String propertyId; + + public void setPropertyId(final String propertyId) { + this.propertyId = Util.abbreviated(propertyId, JdoColumnLength.AuditEntry.PROPERTY_ID); + } + + //endregion + + //region > preValue (property) + + public static class PreValueDomainEvent extends PropertyDomainEvent { + } + + @javax.jdo.annotations.Column(allowsNull="true", length=JdoColumnLength.AuditEntry.PROPERTY_VALUE) + @Property( + domainEvent = PreValueDomainEvent.class + ) + @PropertyLayout( + hidden = Where.NOWHERE + ) + @Getter + private String preValue; + + public void setPreValue(final String preValue) { + this.preValue = Util.abbreviated(preValue, JdoColumnLength.AuditEntry.PROPERTY_VALUE); + } + //endregion + + //region > postValue (property) + + public static class PostValueDomainEvent extends PropertyDomainEvent { + } + + @javax.jdo.annotations.Column(allowsNull="true", length=JdoColumnLength.AuditEntry.PROPERTY_VALUE) + @Property( + domainEvent = PostValueDomainEvent.class + ) + @PropertyLayout( + hidden = Where.NOWHERE + ) + @Getter + private String postValue; + + public void setPostValue(final String postValue) { + this.postValue = Util.abbreviated(postValue, JdoColumnLength.AuditEntry.PROPERTY_VALUE); + } + + //endregion + + //region > helpers: toString + + @Override + public String toString() { + return ObjectContracts.toString(this, "timestamp,user,targetStr,memberIdentifier"); + } + //endregion + +} diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.layout.fallback.xml b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.layout.fallback.xml new file mode 100644 index 00000000000..9e193190638 --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.layout.fallback.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.png b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.png new file mode 100644 index 00000000000..4e4352c4742 Binary files /dev/null and b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.png differ diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditerServiceUsingJdo.java b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditerServiceUsingJdo.java new file mode 100644 index 00000000000..8126386f977 --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditerServiceUsingJdo.java @@ -0,0 +1,56 @@ +package org.isisaddons.module.audit.dom; + +import java.util.UUID; + +import javax.inject.Inject; + +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.services.audit.AuditerService; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.repository.RepositoryService; + +@DomainService( + nature = NatureOfService.DOMAIN +) +public class AuditerServiceUsingJdo implements AuditerService { + + @Override + public boolean isEnabled() { + return true; + } + + @Programmatic + public void audit( + final UUID transactionId, + final int sequence, + String targetClass, final Bookmark target, + String memberIdentifier, final String propertyId, + final String preValue, final String postValue, + final String user, final java.sql.Timestamp timestamp) { + + final AuditEntry auditEntry = repositoryService.instantiate(AuditEntry.class); + + auditEntry.setTimestamp(timestamp); + auditEntry.setUser(user); + auditEntry.setTransactionId(transactionId); + auditEntry.setSequence(sequence); + + auditEntry.setTargetClass(targetClass); + auditEntry.setTarget(target); + + auditEntry.setMemberIdentifier(memberIdentifier); + auditEntry.setPropertyId(propertyId); + + auditEntry.setPreValue(preValue); + auditEntry.setPostValue(postValue); + + repositoryService.persist(auditEntry); + } + + + @Inject + RepositoryService repositoryService; + +} diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditingServiceMenu.java b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditingServiceMenu.java new file mode 100644 index 00000000000..3ac0713960c --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditingServiceMenu.java @@ -0,0 +1,84 @@ +package org.isisaddons.module.audit.dom; + +import java.util.List; + +import org.joda.time.LocalDate; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.DomainServiceLayout; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.Optionality; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.ParameterLayout; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.services.clock.ClockService; + +@DomainService( + nature = NatureOfService.VIEW_MENU_ONLY, + objectType = "isisaudit.AuditingServiceMenu" +) +@DomainServiceLayout( + named = "Activity", + menuBar = DomainServiceLayout.MenuBar.SECONDARY, + menuOrder = "30" +) +public class AuditingServiceMenu { + + //region > domain events + public static abstract class PropertyDomainEvent + extends org.apache.isis.applib.services.eventbus.PropertyDomainEvent { + } + + public static abstract class CollectionDomainEvent + extends org.apache.isis.applib.services.eventbus.CollectionDomainEvent { + } + + public static abstract class ActionDomainEvent + extends org.apache.isis.applib.services.eventbus.ActionDomainEvent { + } + //endregion + + //region > findAuditEntries (action) + public static class FindAuditEntriesDomainEvent extends ActionDomainEvent { } + + @Action( + domainEvent = FindAuditEntriesDomainEvent.class, + semantics = SemanticsOf.SAFE + ) + @ActionLayout( + cssClassFa = "fa-search" + ) + @MemberOrder(sequence="10") + public List findAuditEntries( + @Parameter(optionality= Optionality.OPTIONAL) + @ParameterLayout(named="From") + final LocalDate from, + @Parameter(optionality=Optionality.OPTIONAL) + @ParameterLayout(named="To") + final LocalDate to) { + return auditingServiceRepository.findByFromAndTo(from, to); + } + public boolean hideFindAuditEntries() { + return auditingServiceRepository == null; + } + public LocalDate default0FindAuditEntries() { + return clockService.now().minusDays(7); + } + public LocalDate default1FindAuditEntries() { + return clockService.now(); + } + //endregion + + //region > injected services + @javax.inject.Inject + private AuditingServiceRepository auditingServiceRepository; + + @javax.inject.Inject + private ClockService clockService; + //endregion + +} + diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditingServiceRepository.java b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditingServiceRepository.java new file mode 100644 index 00000000000..806f9b781ae --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditingServiceRepository.java @@ -0,0 +1,163 @@ +package org.isisaddons.module.audit.dom; + +import java.sql.Timestamp; +import java.util.List; +import java.util.UUID; + +import javax.inject.Inject; + +import org.joda.time.LocalDate; + +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.Programmatic; +import org.apache.isis.applib.query.Query; +import org.apache.isis.applib.query.QueryDefault; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.repository.RepositoryService; + +/** + * Provides supporting functionality for querying {@link AuditEntry audit entry} entities. + * + *

+ * This supporting service with no UI and no side-effects, and there are no other implementations of the service, + * thus has been annotated with {@link org.apache.isis.applib.annotation.DomainService}. This means that there is no + * need to explicitly register it as a service (eg in isis.properties). + */ +@DomainService( + nature = NatureOfService.DOMAIN +) +public class AuditingServiceRepository { + + @Programmatic + public AuditEntry findFirstByTarget(final Bookmark target) { + final String targetStr = target.toString(); + return findFirstByTarget(targetStr); + } + + @Programmatic + public AuditEntry findFirstByTarget(final String targetStr) { + final List matches = repositoryService.allMatches( + new QueryDefault<>(AuditEntry.class, + "findFirstByTarget", + "targetStr", targetStr + )); + return matches.isEmpty() ? null : matches.get(0); + } + + @Programmatic + public List findRecentByTarget(final Bookmark target) { + final String targetStr = target.toString(); + return findRecentByTarget(targetStr); + } + + @Programmatic + public List findRecentByTarget(final String targetStr) { + return repositoryService.allMatches( + new QueryDefault<>(AuditEntry.class, + "findRecentByTarget", + "targetStr", targetStr + )); + } + + @Programmatic + public List findRecentByTargetAndPropertyId( + final Bookmark target, + final String propertyId) { + final String targetStr = target.toString(); + return repositoryService.allMatches( + new QueryDefault<>(AuditEntry.class, + "findRecentByTargetAndPropertyId", + "targetStr", targetStr, + "propertyId", propertyId + )); + } + + @Programmatic + public List findByTransactionId(final UUID transactionId) { + return repositoryService.allMatches( + new QueryDefault<>(AuditEntry.class, + "findByTransactionId", + "transactionId", transactionId)); + } + + @Programmatic + public List findByTargetAndFromAndTo( + final Bookmark target, + final LocalDate from, + final LocalDate to) { + final String targetStr = target.toString(); + final Timestamp fromTs = toTimestampStartOfDayWithOffset(from, 0); + final Timestamp toTs = toTimestampStartOfDayWithOffset(to, 1); + + final Query query; + if(from != null) { + if(to != null) { + query = new QueryDefault<>(AuditEntry.class, + "findByTargetAndTimestampBetween", + "targetStr", targetStr, + "from", fromTs, + "to", toTs); + } else { + query = new QueryDefault<>(AuditEntry.class, + "findByTargetAndTimestampAfter", + "targetStr", targetStr, + "from", fromTs); + } + } else { + if(to != null) { + query = new QueryDefault<>(AuditEntry.class, + "findByTargetAndTimestampBefore", + "targetStr", targetStr, + "to", toTs); + } else { + query = new QueryDefault<>(AuditEntry.class, + "findByTarget", + "targetStr", targetStr); + } + } + return repositoryService.allMatches(query); + } + + @Programmatic + public List findByFromAndTo( + final LocalDate from, + final LocalDate to) { + final Timestamp fromTs = toTimestampStartOfDayWithOffset(from, 0); + final Timestamp toTs = toTimestampStartOfDayWithOffset(to, 1); + + final Query query; + if(from != null) { + if(to != null) { + query = new QueryDefault<>(AuditEntry.class, + "findByTimestampBetween", + "from", fromTs, + "to", toTs); + } else { + query = new QueryDefault<>(AuditEntry.class, + "findByTimestampAfter", + "from", fromTs); + } + } else { + if(to != null) { + query = new QueryDefault<>(AuditEntry.class, + "findByTimestampBefore", + "to", toTs); + } else { + query = new QueryDefault<>(AuditEntry.class, + "find"); + } + } + return repositoryService.allMatches(query); + } + + private static Timestamp toTimestampStartOfDayWithOffset(final LocalDate dt, final int daysOffset) { + return dt!=null + ?new java.sql.Timestamp(dt.toDateTimeAtStartOfDay().plusDays(daysOffset).getMillis()) + :null; + } + + @Inject + RepositoryService repositoryService; + +} diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/HasTransactionId_auditEntriesInTransaction.java b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/HasTransactionId_auditEntriesInTransaction.java new file mode 100644 index 00000000000..7d178150a0b --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/HasTransactionId_auditEntriesInTransaction.java @@ -0,0 +1,51 @@ +package org.isisaddons.module.audit.dom; + +import java.util.List; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.CollectionLayout; +import org.apache.isis.applib.annotation.Contributed; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.Mixin; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.services.HasTransactionId; + +import org.isisaddons.module.audit.AuditModule; + +@Mixin +public class HasTransactionId_auditEntriesInTransaction { + + public static class ActionDomainEvent extends AuditModule.ActionDomainEvent { + } + + private final HasTransactionId hasTransactionId; + + public HasTransactionId_auditEntriesInTransaction(HasTransactionId hasTransactionId) { + this.hasTransactionId = hasTransactionId; + } + + @Action( + semantics = SemanticsOf.SAFE, + domainEvent = ActionDomainEvent.class + ) + @ActionLayout( + contributed = Contributed.AS_ASSOCIATION + ) + @CollectionLayout( + defaultView = "table" + ) + @MemberOrder(sequence = "50.100") + public List $$() { + return auditEntryRepository.findByTransactionId(hasTransactionId.getTransactionId()); + } + + //endregion + + //region > injected services + + @javax.inject.Inject + private AuditingServiceRepository auditEntryRepository; + //endregion + +} diff --git a/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/Object_recentAuditEntries.java b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/Object_recentAuditEntries.java new file mode 100644 index 00000000000..5c9334f6fb5 --- /dev/null +++ b/extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/Object_recentAuditEntries.java @@ -0,0 +1,96 @@ +package org.isisaddons.module.audit.dom; + +import java.util.List; + +import javax.annotation.Nullable; +import javax.inject.Inject; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.Lists; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.Contributed; +import org.apache.isis.applib.annotation.MemberOrder; +import org.apache.isis.applib.annotation.Mixin; +import org.apache.isis.applib.annotation.ParameterLayout; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.services.HasTransactionId; +import org.apache.isis.applib.services.appfeat.ApplicationFeatureRepository; +import org.apache.isis.applib.services.appfeat.ApplicationMemberType; +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.bookmark.BookmarkService2; +import org.apache.isis.applib.services.metamodel.MetaModelService2; +import org.apache.isis.applib.services.metamodel.MetaModelService3; + +@Mixin(method="act") +public class Object_recentAuditEntries { + + private final Object domainObject; + + public Object_recentAuditEntries(final Object domainObject) { + this.domainObject = domainObject; + } + + public static class ActionDomainEvent + extends org.apache.isis.applib.services.eventbus.ActionDomainEvent { + } + + @Action( + domainEvent = ActionDomainEvent.class, + semantics = SemanticsOf.SAFE + ) + @ActionLayout( + contributed = Contributed.AS_ACTION + ) + @MemberOrder(name = "Metadata", sequence = "10") + public List act( + @ParameterLayout(named = "Object property") + final String propertyName) { + final Bookmark target = bookmarkService.bookmarkFor(domainObject); + return auditingServiceRepository.findRecentByTargetAndPropertyId(target, propertyName); + } + public List choices0Act() { + final Class domainClass = domainObject.getClass(); + final String packageName = domainClass.getPackage().getName(); + final String className = domainClass.getSimpleName(); + return Lists.newArrayList( + FluentIterable.from( + applicationFeatureRepository + .memberNamesOf(packageName, className, ApplicationMemberType.PROPERTY) + ).filter(Predicates.not(excludedProperties))); + } + public String default0Act() { + final List choices = choices0Act(); + return choices.size() == 1 ? choices.get(0): null; + } + + public boolean hideAct() { + MetaModelService2.Sort sort = metaModelService3.sortOf(domainObject.getClass(), MetaModelService3.Mode.RELAXED); + return !sort.isJdoEntity() || domainObject instanceof HasTransactionId; + } + + static final Predicate excludedProperties = new Predicate() { + private List excluded = Lists.newArrayList( + "datanucleusIdLong", "datanucleusVersionLong", "datanucleusVersionTimestamp" + ); + @Override + public boolean apply(@Nullable final String propertyName) { + return excluded.contains(propertyName); + } + }; + + @javax.inject.Inject + private MetaModelService3 metaModelService3; + + @Inject + ApplicationFeatureRepository applicationFeatureRepository; + + @Inject + AuditingServiceRepository auditingServiceRepository; + + @Inject + BookmarkService2 bookmarkService; +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/titled/TitledEnumContractForIncodeModuleTest_title.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/titled/TitledEnumContractForIncodeModuleTest_title.java new file mode 100644 index 00000000000..28ea2566cf8 --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/titled/TitledEnumContractForIncodeModuleTest_title.java @@ -0,0 +1,16 @@ +package org.isisaddons.module.audit.dom.contracttests.titled; + +import org.incode.module.base.dom.TitledEnum; +import org.incode.module.base.dom.titled.TitledEnumContractTestAbstract_title; + +/** + * Automatically tests all enums implementing {@link TitledEnum}. + */ +public class TitledEnumContractForIncodeModuleTest_title extends TitledEnumContractTestAbstract_title { + + public TitledEnumContractForIncodeModuleTest_title() { + super("org.isisaddons.module.audit"); + } +} + + diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithCodeComparableContractForIncodeModuleTest_compareTo.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithCodeComparableContractForIncodeModuleTest_compareTo.java new file mode 100644 index 00000000000..5ab0f2fbabb --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithCodeComparableContractForIncodeModuleTest_compareTo.java @@ -0,0 +1,18 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import com.google.common.collect.ImmutableMap; + +import org.incode.module.base.dom.with.ComparableByCodeContractTestAbstract_compareTo; +import org.incode.module.base.dom.with.WithCodeComparable; + +/** + * Automatically tests all domain objects implementing {@link WithCodeComparable}. + */ +public class WithCodeComparableContractForIncodeModuleTest_compareTo extends + ComparableByCodeContractTestAbstract_compareTo { + + public WithCodeComparableContractForIncodeModuleTest_compareTo() { + super("org.isisaddons.module.audit", ImmutableMap.,Class>of()); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithCodeUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithCodeUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java new file mode 100644 index 00000000000..a0816f0bb86 --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithCodeUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java @@ -0,0 +1,13 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import org.incode.module.base.dom.with.WithCodeUnique; +import org.incode.module.base.dom.with.WithFieldUniqueContractTestAllAbstract; + +public class WithCodeUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation extends + WithFieldUniqueContractTestAllAbstract { + + public WithCodeUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation() { + super("org.isisaddons.module.audit", "code", WithCodeUnique.class); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithDescriptionComparableContractForIncodeModuleTest_compareTo.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithDescriptionComparableContractForIncodeModuleTest_compareTo.java new file mode 100644 index 00000000000..ec709fbfcca --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithDescriptionComparableContractForIncodeModuleTest_compareTo.java @@ -0,0 +1,18 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import com.google.common.collect.ImmutableMap; + +import org.incode.module.base.dom.with.ComparableByDescriptionContractTestAbstract_compareTo; +import org.incode.module.base.dom.with.WithDescriptionComparable; + +/** + * Automatically tests all domain objects implementing {@link WithDescriptionComparable}. + */ +public class WithDescriptionComparableContractForIncodeModuleTest_compareTo extends + ComparableByDescriptionContractTestAbstract_compareTo { + + public WithDescriptionComparableContractForIncodeModuleTest_compareTo() { + super("org.isisaddons.module.audit", ImmutableMap.,Class>of()); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithDescriptionUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithDescriptionUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java new file mode 100644 index 00000000000..e6cfec05067 --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithDescriptionUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java @@ -0,0 +1,13 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import org.incode.module.base.dom.with.WithDescriptionUnique; +import org.incode.module.base.dom.with.WithFieldUniqueContractTestAllAbstract; + +public class WithDescriptionUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation extends + WithFieldUniqueContractTestAllAbstract { + + public WithDescriptionUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation() { + super("org.isisaddons.module.audit", "description", WithDescriptionUnique.class); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithNameComparableContractForIncodeModuleTest_compareTo.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithNameComparableContractForIncodeModuleTest_compareTo.java new file mode 100644 index 00000000000..b8e76ea80e8 --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithNameComparableContractForIncodeModuleTest_compareTo.java @@ -0,0 +1,19 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import com.google.common.collect.ImmutableMap; + +import org.incode.module.base.dom.with.ComparableByNameContractTestAbstract_compareTo; +import org.incode.module.base.dom.with.WithNameComparable; + +/** + * Automatically tests all domain objects implementing + * {@link WithNameComparable}. + */ +public class WithNameComparableContractForIncodeModuleTest_compareTo extends + ComparableByNameContractTestAbstract_compareTo { + + public WithNameComparableContractForIncodeModuleTest_compareTo() { + super("org.isisaddons.module.audit", ImmutableMap., Class>of()); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithNameUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithNameUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java new file mode 100644 index 00000000000..8d9da4cdac1 --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithNameUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java @@ -0,0 +1,13 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import org.incode.module.base.dom.with.WithFieldUniqueContractTestAllAbstract; +import org.incode.module.base.dom.with.WithNameUnique; + +public class WithNameUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation extends + WithFieldUniqueContractTestAllAbstract { + + public WithNameUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation() { + super("org.isisaddons.module.audit", "name", WithNameUnique.class); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithReferenceComparableContractForIncodeModuleTest_compareTo.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithReferenceComparableContractForIncodeModuleTest_compareTo.java new file mode 100644 index 00000000000..28a9d93c6fb --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithReferenceComparableContractForIncodeModuleTest_compareTo.java @@ -0,0 +1,18 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import com.google.common.collect.ImmutableMap; + +import org.incode.module.base.dom.with.ComparableByReferenceContractTestAbstract_compareTo; +import org.incode.module.base.dom.with.WithReferenceComparable; + +/** + * Automatically tests all domain objects implementing {@link WithReferenceComparable}. + */ +public class WithReferenceComparableContractForIncodeModuleTest_compareTo extends + ComparableByReferenceContractTestAbstract_compareTo { + + public WithReferenceComparableContractForIncodeModuleTest_compareTo() { + super("org.isisaddons.module.audit", ImmutableMap., Class>of()); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithReferenceUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithReferenceUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java new file mode 100644 index 00000000000..c74f12c00dd --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithReferenceUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java @@ -0,0 +1,13 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import org.incode.module.base.dom.with.WithFieldUniqueContractTestAllAbstract; +import org.incode.module.base.dom.with.WithReferenceUnique; + +public class WithReferenceUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation extends + WithFieldUniqueContractTestAllAbstract { + + public WithReferenceUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation() { + super("org.isisaddons.module.audit", "reference", WithReferenceUnique.class); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithTitleComparableContractForIncodeModuleTest_compareTo.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithTitleComparableContractForIncodeModuleTest_compareTo.java new file mode 100644 index 00000000000..0117122e2af --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithTitleComparableContractForIncodeModuleTest_compareTo.java @@ -0,0 +1,18 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import com.google.common.collect.ImmutableMap; + +import org.incode.module.base.dom.with.ComparableByTitleContractTestAbstract_compareTo; +import org.incode.module.base.dom.with.WithTitleComparable; + +/** + * Automatically tests all domain objects implementing {@link WithTitleComparable}. + */ +public class WithTitleComparableContractForIncodeModuleTest_compareTo extends + ComparableByTitleContractTestAbstract_compareTo { + + public WithTitleComparableContractForIncodeModuleTest_compareTo() { + super("org.isisaddons.module.audit", ImmutableMap.,Class>of()); + } + +} diff --git a/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithTitleUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithTitleUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java new file mode 100644 index 00000000000..20425954cf2 --- /dev/null +++ b/extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithTitleUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java @@ -0,0 +1,13 @@ +package org.isisaddons.module.audit.dom.contracttests.with; + +import org.incode.module.base.dom.with.WithFieldUniqueContractTestAllAbstract; +import org.incode.module.base.dom.with.WithTitleUnique; + +public class WithTitleUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation extends + WithFieldUniqueContractTestAllAbstract { + + public WithTitleUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation() { + super("org.isisaddons.module.audit", "title", WithTitleUnique.class); + } + +} diff --git a/extensions/security/audittrail/pom.xml b/extensions/security/audittrail/pom.xml new file mode 100644 index 00000000000..57d89501f34 --- /dev/null +++ b/extensions/security/audittrail/pom.xml @@ -0,0 +1,173 @@ + + + 4.0.0 + + + org.incode + incode-parent + ${revision} + ../../../pom.xml + + + org.isisaddons.module.audit + isis-module-audit-dom + Incode Platform SPI Audit Impl + + + A module providing audit persistence, enabling profiling, background execution and + extended auditing capabilities. + + + + org.incode.platform.spi.audit + org/incode/platform/spi/audit + + ${project.basedir}/../../../../.git + + + + + + false + impl/src/main/java + + ** + + + **/*.java + + + + + + com.github.odavid.maven.plugins + mixin-maven-plugin + 0.1-alpha-39 + true + + + + com.danhaywood.mavenmixin + datanucleusenhance + + + com.danhaywood.mavenmixin + enforcerrelaxed + + + com.danhaywood.mavenmixin + standard + + + com.danhaywood.mavenmixin + sourceandjavadoc + + + + + + + + + + + org.apache.isis.core + isis-core-applib + + + + org.incode.module.base + incode-module-base-dom + + + + + org.apache.isis.core + isis-core-unittestsupport + test + + + + org.incode.module.base + incode-module-base-dom + test + test-jar + + + + org.datanucleus + datanucleus-core + test + + + + + org.projectlombok + lombok + provided + + + + + + git + + + !skip.git + + + + + + pl.project13.maven + git-commit-id-plugin + + + + + + flatten + + + revision + + + + + + org.codehaus.mojo + flatten-maven-plugin + 1.0.0 + + + flatten + process-resources + + flatten + + + defaults + true + + resolve + resolve + resolve + + + + + flatten.clean + clean + + clean + + + + + + + + + + diff --git a/extensions/security/secman/applib/pom.xml b/extensions/security/secman/applib/pom.xml index 841ce5102b9..5472f02f338 100644 --- a/extensions/security/secman/applib/pom.xml +++ b/extensions/security/secman/applib/pom.xml @@ -29,7 +29,6 @@ isis-extensions-secman-applib Apache Isis Ext - Sec Man Applib - org.apache.isis.extensions.secman.applib @@ -49,7 +48,7 @@ - + org.springframework.security spring-security-crypto diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java index 3ba3907e5ce..2379441b167 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/IsisModuleExtSecmanApplib.java @@ -186,6 +186,20 @@ public class IsisModuleExtSecmanApplib { public static final String NAMESPACE = "isis.ext.secman"; + public static final String SCHEMA = "isisExtensionsSecman"; + + public abstract static class TitleUiEvent + extends org.apache.isis.applib.events.ui.TitleUiEvent { } + + public abstract static class IconUiEvent + extends org.apache.isis.applib.events.ui.IconUiEvent { } + + public abstract static class CssClassUiEvent + extends org.apache.isis.applib.events.ui.CssClassUiEvent { } + + public abstract static class LayoutUiEvent + extends org.apache.isis.applib.events.ui.LayoutUiEvent { } + public abstract static class ActionDomainEvent extends org.apache.isis.applib.events.domain.ActionDomainEvent {} diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/feature/api/ApplicationFeatureChoices.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/feature/api/ApplicationFeatureChoices.java index 883366edcfd..fae2fcb7443 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/feature/api/ApplicationFeatureChoices.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/feature/api/ApplicationFeatureChoices.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; import javax.inject.Inject; +import javax.inject.Named; import org.springframework.stereotype.Service; @@ -113,10 +114,9 @@ private static boolean isMember(final ApplicationFeatureId featureId) { * because at the time of writing, * autoComplete/choices do not support value types. */ + @Named(AppFeat.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = AppFeat.LOGICAL_TYPE_NAME - ) + nature = Nature.VIEW_MODEL) @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode public static class AppFeat implements diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/app/ApplicationOrphanedPermissionManager.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/app/ApplicationOrphanedPermissionManager.java index b4d57283aab..f7cc54c5187 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/app/ApplicationOrphanedPermissionManager.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/app/ApplicationOrphanedPermissionManager.java @@ -21,6 +21,7 @@ import java.util.Collection; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; @@ -29,10 +30,9 @@ import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission; import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermissionRepository; +@Named(ApplicationOrphanedPermissionManager.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = ApplicationOrphanedPermissionManager.LOGICAL_TYPE_NAME -) + nature = Nature.VIEW_MODEL) public class ApplicationOrphanedPermissionManager { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationOrphanedPermissionManager"; diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermission.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermission.java index 93e1a5ba571..55fa84ef249 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermission.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermission.java @@ -28,10 +28,15 @@ import java.util.function.Function; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.applib.annotation.Editing; import org.apache.isis.applib.annotation.ObjectSupport; +import org.apache.isis.applib.annotation.Optionality; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.ParameterLayout; import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.annotation.Property; import org.apache.isis.applib.annotation.PropertyLayout; @@ -80,29 +85,44 @@ * * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ApplicationPermission.LOGICAL_TYPE_NAME +@Named(ApplicationPermission.LOGICAL_TYPE_NAME) +@DomainObject +@DomainObjectLayout( + titleUiEvent = ApplicationPermission.TitleUiEvent.class, + iconUiEvent = ApplicationPermission.IconUiEvent.class, + cssClassUiEvent = ApplicationPermission.CssClassUiEvent.class, + layoutUiEvent = ApplicationPermission.LayoutUiEvent.class ) public abstract class ApplicationPermission implements Comparable { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationPermission"; + public static final String SCHEMA = IsisModuleExtSecmanApplib.SCHEMA; + public static final String TABLE = "ApplicationPermission"; - public static final String NAMED_QUERY_FIND_BY_FEATURE = "ApplicationPermission.findByFeature"; - public static final String NAMED_QUERY_FIND_BY_ROLE = "ApplicationPermission.findByRole"; - public static final String NAMED_QUERY_FIND_BY_ROLE_RULE_FEATURE = "ApplicationPermission.findByRoleAndRuleAndFeature"; - public static final String NAMED_QUERY_FIND_BY_ROLE_RULE_FEATURE_FQN = "ApplicationPermission.findByRoleAndRuleAndFeatureAndFqn"; - public static final String NAMED_QUERY_FIND_BY_USER = "ApplicationPermission.findByUser"; - public static final String NAMED_QUERY_FIND_BY_ROLE_NAMES = "ApplicationPermission.findByRoleNames"; + @UtilityClass + public static class Nq { + public static final String FIND_BY_FEATURE = ApplicationPermission.LOGICAL_TYPE_NAME + ".findByFeature"; + public static final String FIND_BY_ROLE = ApplicationPermission.LOGICAL_TYPE_NAME + ".findByRole"; + public static final String FIND_BY_ROLE_RULE_FEATURE = ApplicationPermission.LOGICAL_TYPE_NAME + ".findByRoleAndRuleAndFeature"; + public static final String FIND_BY_ROLE_RULE_FEATURE_FQN = ApplicationPermission.LOGICAL_TYPE_NAME + ".findByRoleAndRuleAndFeatureAndFqn"; + public static final String FIND_BY_USER = ApplicationPermission.LOGICAL_TYPE_NAME + ".findByUser"; + public static final String FIND_BY_ROLE_NAMES = ApplicationPermission.LOGICAL_TYPE_NAME + ".findByRoleNames"; + } - @Inject transient ApplicationFeatureRepository featureRepository; + // -- UI & DOMAIN EVENTS - // -- DOMAIN EVENTS + public static class TitleUiEvent extends IsisModuleExtSecmanApplib.TitleUiEvent { } + public static class IconUiEvent extends IsisModuleExtSecmanApplib.IconUiEvent { } + public static class CssClassUiEvent extends IsisModuleExtSecmanApplib.CssClassUiEvent { } + public static class LayoutUiEvent extends IsisModuleExtSecmanApplib.LayoutUiEvent { } public static abstract class PropertyDomainEvent extends IsisModuleExtSecmanApplib.PropertyDomainEvent {} public static abstract class CollectionDomainEvent extends IsisModuleExtSecmanApplib.CollectionDomainEvent {} + @Inject transient ApplicationFeatureRepository featureRepository; + // -- MODEL @ObjectSupport public String title() { @@ -145,17 +165,24 @@ public static abstract class CollectionDomainEvent extends IsisModuleExtSecma @Property( domainEvent = Role.DomainEvent.class, - editing = Editing.DISABLED + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY ) @PropertyLayout( fieldSetId = "identity", hidden = Where.REFERENCES_PARENT, sequence = "1" ) + @Parameter( + optionality = Optionality.MANDATORY + ) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Role { - public static class DomainEvent extends PropertyDomainEvent {} + class DomainEvent extends PropertyDomainEvent {} + String NAME = "roleId"; + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } @Role @@ -167,18 +194,23 @@ public static class DomainEvent extends PropertyDomainEvent {} @Property( domainEvent = Rule.DomainEvent.class, - editing = Editing.DISABLED + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY ) @PropertyLayout( fieldSetId = "rule", sequence = "1" ) + @Parameter( + optionality = Optionality.MANDATORY + ) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Rule { class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } - @Rule public abstract ApplicationPermissionRule getRule(); public abstract void setRule(ApplicationPermissionRule rule); @@ -188,18 +220,23 @@ class DomainEvent extends PropertyDomainEvent {} @Property( domainEvent = Mode.DomainEvent.class, - editing = Editing.DISABLED + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY ) @PropertyLayout( fieldSetId = "mode", sequence = "1" ) + @Parameter( + optionality = Optionality.MANDATORY + ) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Mode { class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } - @Mode public abstract ApplicationPermissionMode getMode(); public abstract void setMode(ApplicationPermissionMode mode); @@ -222,11 +259,9 @@ class DomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Sort { - int TYPICAL_LENGTH = 7; // ApplicationFeatureType.PACKAGE is longest - class DomainEvent extends PropertyDomainEvent {} + int TYPICAL_LENGTH = 7; // ApplicationFeatureType.PACKAGE is longest } - @Sort public String getSort() { final Enum e = getFeatureSort() != ApplicationFeatureSort.MEMBER @@ -238,6 +273,13 @@ public String getSort() { // -- FEATURE SORT + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface FeatureSort { + int TYPICAL_LENGTH = 7; // ApplicationFeatureType.PACKAGE is longest + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } /** * Which {@link ApplicationFeatureId#getSort() sort} of * feature this is. @@ -279,8 +321,9 @@ public String getSort() { @Retention(RetentionPolicy.RUNTIME) public @interface FeatureFqn { class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } - @FeatureFqn public abstract String getFeatureFqn(); public abstract void setFeatureFqn(String featureFqn); diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermissionRepositoryAbstract.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermissionRepositoryAbstract.java index b56f0a52008..40356056800 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermissionRepositoryAbstract.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermissionRepositoryAbstract.java @@ -80,7 +80,7 @@ public List findByRoleCached(final @NonNull ApplicationRo public List findByRole(final @NonNull ApplicationRole role) { return _Casts.uncheckedCast( repository.allMatches( - Query.named(this.applicationPermissionClass, ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE) + Query.named(this.applicationPermissionClass, ApplicationPermission.Nq.FIND_BY_ROLE) .withParameter("role", role)) ); } @@ -106,7 +106,7 @@ public List findByUserMemento(final @NonNull UserMemento public List findByRoleNames(final @NonNull List roleNames) { return _Casts.uncheckedCast( repository.allMatches( - Query.named(this.applicationPermissionClass, ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_NAMES) + Query.named(this.applicationPermissionClass, ApplicationPermission.Nq.FIND_BY_ROLE_NAMES) .withParameter("roleNames", roleNames)) ); } @@ -114,7 +114,7 @@ public List findByRoleNames(final @NonNull List r private List findByUser(final String username) { return _Casts.uncheckedCast( repository.allMatches( - Query.named(this.applicationPermissionClass, ApplicationPermission.NAMED_QUERY_FIND_BY_USER) + Query.named(this.applicationPermissionClass, ApplicationPermission.Nq.FIND_BY_USER) .withParameter("username", username)) ); } @@ -179,7 +179,7 @@ public Collection findByRoleAndRuleAndFeatureType( final ApplicationPermissionRule rule, final ApplicationFeatureSort featureSort) { return repository.allMatches(Query.named( - this.applicationPermissionClass, ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_RULE_FEATURE) + this.applicationPermissionClass, ApplicationPermission.Nq.FIND_BY_ROLE_RULE_FEATURE) .withParameter("role", role) .withParameter("rule", rule) .withParameter("featureSort", featureSort)) @@ -210,7 +210,7 @@ public Optional findByRoleAndRuleAndFeature( return _Casts.uncheckedCast( repository .uniqueMatch(Query.named( - this.applicationPermissionClass, ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_RULE_FEATURE_FQN) + this.applicationPermissionClass, ApplicationPermission.Nq.FIND_BY_ROLE_RULE_FEATURE_FQN) .withParameter("role", role) .withParameter("rule", rule) .withParameter("featureSort", featureSort) @@ -231,7 +231,7 @@ public Collection findByFeatureCached(final ApplicationFe public Collection findByFeature(final ApplicationFeatureId featureId) { return repository.allMatches( Query.named( - this.applicationPermissionClass, ApplicationPermission.NAMED_QUERY_FIND_BY_FEATURE) + this.applicationPermissionClass, ApplicationPermission.Nq.FIND_BY_FEATURE) .withParameter("featureSort", featureId.getSort()) .withParameter("featureFqn", featureId.getFullyQualifiedName())) .stream() diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRole.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRole.java index 987e2428641..f567f1e3383 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRole.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRole.java @@ -27,10 +27,12 @@ import java.util.Set; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.CollectionLayout; import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.applib.annotation.Editing; import org.apache.isis.applib.annotation.ObjectSupport; import org.apache.isis.applib.annotation.Optionality; @@ -47,23 +49,40 @@ import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermissionRepository; import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; +import lombok.experimental.UtilityClass; + /** * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ApplicationRole.LOGICAL_TYPE_NAME +@Named(ApplicationRole.LOGICAL_TYPE_NAME) +@DomainObject +@DomainObjectLayout( + titleUiEvent = ApplicationRole.TitleUiEvent.class, + iconUiEvent = ApplicationRole.IconUiEvent.class, + cssClassUiEvent = ApplicationRole.CssClassUiEvent.class, + layoutUiEvent = ApplicationRole.LayoutUiEvent.class ) public abstract class ApplicationRole implements Comparable { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationRole"; + public static final String SCHEMA = IsisModuleExtSecmanApplib.SCHEMA; + public static final String TABLE = "ApplicationRole"; - public static final String NAMED_QUERY_FIND_BY_NAME = "ApplicationRole.findByName"; - public static final String NAMED_QUERY_FIND_BY_NAME_CONTAINING = "ApplicationRole.findByNameContaining"; + @UtilityClass + public static class Nq { + public static final String FIND_BY_NAME = ApplicationRole.LOGICAL_TYPE_NAME + ".findByName"; + public static final String FIND_BY_NAME_CONTAINING = ApplicationRole.LOGICAL_TYPE_NAME + ".findByNameContaining"; + } @Inject transient private ApplicationPermissionRepository applicationPermissionRepository; - // -- EVENTS + // -- UI & DOMAIN EVENTS + + public static class TitleUiEvent extends IsisModuleExtSecmanApplib.TitleUiEvent { } + public static class IconUiEvent extends IsisModuleExtSecmanApplib.IconUiEvent { } + public static class CssClassUiEvent extends IsisModuleExtSecmanApplib.CssClassUiEvent { } + public static class LayoutUiEvent extends IsisModuleExtSecmanApplib.LayoutUiEvent { } public static abstract class PropertyDomainEvent extends IsisModuleExtSecmanApplib.PropertyDomainEvent {} public static abstract class CollectionDomainEvent extends IsisModuleExtSecmanApplib.CollectionDomainEvent {} @@ -98,12 +117,12 @@ public static abstract class CollectionDomainEvent extends IsisModuleExtSecma @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Name { + class DomainEvent extends PropertyDomainEvent {} int MAX_LENGTH = 120; int TYPICAL_LENGTH = 30; - - public static class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } - @Name public abstract String getName(); public abstract void setName(String name); @@ -134,12 +153,12 @@ public static class DomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Description { + class DomainEvent extends PropertyDomainEvent {} int MAX_LENGTH = 254; int TYPICAL_LENGTH = 50; - - public class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @Description public abstract String getDescription(); public abstract void setDescription(String description); @@ -157,9 +176,9 @@ public class DomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Users { - public static class DomainEvent extends CollectionDomainEvent {} + class DomainEvent extends CollectionDomainEvent {} + String MAPPED_BY = "roles"; } - @Users public abstract Set getUsers(); @@ -177,7 +196,7 @@ public static class DomainEvent extends CollectionDomainEvent { @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Permissions { - public static class DomainEvent extends CollectionDomainEvent {} + class DomainEvent extends CollectionDomainEvent {} } diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRoleRepositoryAbstract.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRoleRepositoryAbstract.java index 60b96b766a9..434fb3076f1 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRoleRepositoryAbstract.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRoleRepositoryAbstract.java @@ -83,7 +83,7 @@ public Optional findByName(final String name) { return Optional.empty(); } return _Casts.uncheckedCast( - repository.uniqueMatch(Query.named(applicationRoleClass, ApplicationRole.NAMED_QUERY_FIND_BY_NAME) + repository.uniqueMatch(Query.named(applicationRoleClass, ApplicationRole.Nq.FIND_BY_NAME) .withParameter("name", name)) ); } @@ -94,7 +94,7 @@ public Collection findNameContaining(final String search) { if(search != null && search.length() > 0) { val nameRegex = regexReplacer.asRegex(search); return repository.allMatches( - Query.named(applicationRoleClass, ApplicationRole.NAMED_QUERY_FIND_BY_NAME_CONTAINING) + Query.named(applicationRoleClass, ApplicationRole.Nq.FIND_BY_NAME_CONTAINING) .withParameter("regex", nameRegex)) .stream() .collect(_Sets.toUnmodifiableSorted()); diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.java index 4db41fd311e..2c32b48533c 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/man/ApplicationRoleManager.java @@ -19,6 +19,7 @@ package org.apache.isis.extensions.secman.applib.role.man; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; @@ -30,10 +31,9 @@ import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib; import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole; +@Named(ApplicationRoleManager.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = ApplicationRoleManager.LOGICAL_TYPE_NAME -) + nature = Nature.VIEW_MODEL) public class ApplicationRoleManager { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationRoleManager"; diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancy.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancy.java index a6821ee30a8..0b558e641b4 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancy.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancy.java @@ -25,8 +25,11 @@ import java.util.Collection; import java.util.Comparator; +import javax.inject.Named; + import org.apache.isis.applib.annotation.CollectionLayout; import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.applib.annotation.Editing; import org.apache.isis.applib.annotation.ObjectSupport; import org.apache.isis.applib.annotation.Parameter; @@ -40,23 +43,42 @@ import org.apache.isis.applib.util.ObjectContracts; import org.apache.isis.applib.util.ToString; import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib; +import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission; +import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole; + +import lombok.experimental.UtilityClass; /** * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ApplicationTenancy.LOGICAL_TYPE_NAME +@Named(ApplicationTenancy.LOGICAL_TYPE_NAME) +@DomainObject +@DomainObjectLayout( + titleUiEvent = ApplicationTenancy.TitleUiEvent.class, + iconUiEvent = ApplicationTenancy.IconUiEvent.class, + cssClassUiEvent = ApplicationTenancy.CssClassUiEvent.class, + layoutUiEvent = ApplicationTenancy.LayoutUiEvent.class ) public abstract class ApplicationTenancy implements Comparable { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationTenancy"; + public static final String SCHEMA = IsisModuleExtSecmanApplib.SCHEMA; + public static final String TABLE = "ApplicationTenancy"; + + @UtilityClass + public static class Nq { + public static final String FIND_BY_NAME = ApplicationTenancy.LOGICAL_TYPE_NAME + ".findByName"; + public static final String FIND_BY_PATH = ApplicationTenancy.LOGICAL_TYPE_NAME + ".findByPath"; + public static final String FIND_BY_NAME_OR_PATH_MATCHING = ApplicationTenancy.LOGICAL_TYPE_NAME + ".findByNameOrPathMatching"; + } - public static final String NAMED_QUERY_FIND_BY_NAME = "ApplicationTenancy.findByName"; - public static final String NAMED_QUERY_FIND_BY_PATH = "ApplicationTenancy.findByPath"; - public static final String NAMED_QUERY_FIND_BY_NAME_OR_PATH_MATCHING = "ApplicationTenancy.findByNameOrPathMatching"; + // -- UI & DOMAIN EVENTS - // -- DOMAIN EVENTS + public static class TitleUiEvent extends IsisModuleExtSecmanApplib.TitleUiEvent { } + public static class IconUiEvent extends IsisModuleExtSecmanApplib.IconUiEvent { } + public static class CssClassUiEvent extends IsisModuleExtSecmanApplib.CssClassUiEvent { } + public static class LayoutUiEvent extends IsisModuleExtSecmanApplib.LayoutUiEvent { } public static abstract class PropertyDomainEvent extends IsisModuleExtSecmanApplib.PropertyDomainEvent {} public static abstract class CollectionDomainEvent extends IsisModuleExtSecmanApplib.CollectionDomainEvent {} @@ -92,12 +114,12 @@ public static abstract class ActionDomainEvent extends IsisModuleExtSecmanApplib @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Name { + class DomainEvent extends PropertyDomainEvent {} int MAX_LENGTH = 120; int TYPICAL_LENGTH = 20; - - class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } - @Name public abstract String getName(); public abstract void setName(String name); @@ -106,20 +128,20 @@ class DomainEvent extends PropertyDomainEvent {} // -- PATH @Property( - domainEvent = Parent.DomainEvent.class, - editing = Editing.DISABLED + domainEvent = Parent.DomainEvent.class ) @PropertyLayout( fieldSetId = "identity" ) + @HasAtPath.AtPath @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Path { - int MAX_LENGTH = 255; - class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = HasAtPath.AtPath.MAX_LENGTH; + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } - @Path public abstract String getPath(); public abstract void setPath(String path); @@ -140,17 +162,21 @@ class DomainEvent extends PropertyDomainEvent {} @Retention(RetentionPolicy.RUNTIME) public @interface Parent { class DomainEvent extends PropertyDomainEvent {} + String NAME = "parentPath"; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @Parent public abstract ApplicationTenancy getParent(); public abstract void setParent(ApplicationTenancy parent); + @Programmatic public boolean isRoot() { return getParent()==null; } + // -- CHILDREN @org.apache.isis.applib.annotation.Collection( @@ -163,8 +189,8 @@ public boolean isRoot() { @Retention(RetentionPolicy.RUNTIME) public @interface Children { class DomainEvent extends CollectionDomainEvent {} + String MAPPED_BY = "parent"; } - @Children public abstract Collection getChildren(); diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancyRepositoryAbstract.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancyRepositoryAbstract.java index 81381b6e95a..bc441a40a48 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancyRepositoryAbstract.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancyRepositoryAbstract.java @@ -70,7 +70,7 @@ public Collection findByNameOrPathMatching(final String sear return Collections.emptySortedSet(); } val regex = regexReplacer.asRegex(search); - return repository.allMatches(Query.named(this.applicationTenancyClass, ApplicationTenancy.NAMED_QUERY_FIND_BY_NAME_OR_PATH_MATCHING) + return repository.allMatches(Query.named(this.applicationTenancyClass, ApplicationTenancy.Nq.FIND_BY_NAME_OR_PATH_MATCHING) .withParameter("regex", regex)) .stream() .collect(_Sets.toUnmodifiableSorted()); @@ -86,7 +86,7 @@ public ApplicationTenancy findByNameCached(final String name) { } public ApplicationTenancy findByName(final String name) { - return repository.uniqueMatch(Query.named(this.applicationTenancyClass, ApplicationTenancy.NAMED_QUERY_FIND_BY_NAME) + return repository.uniqueMatch(Query.named(this.applicationTenancyClass, ApplicationTenancy.Nq.FIND_BY_NAME) .withParameter("name", name)).orElse(null); } @@ -105,7 +105,7 @@ public ApplicationTenancy findByPath(final String path) { if (path == null) { return null; } - return repository.uniqueMatch(Query.named(this.applicationTenancyClass, ApplicationTenancy.NAMED_QUERY_FIND_BY_PATH) + return repository.uniqueMatch(Query.named(this.applicationTenancyClass, ApplicationTenancy.Nq.FIND_BY_PATH) .withParameter("path", path)) .orElse(null); } diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/HasAtPath.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/HasAtPath.java index bc499f4d380..9363852dff0 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/HasAtPath.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/HasAtPath.java @@ -19,7 +19,19 @@ package org.apache.isis.extensions.secman.applib.tenancy.dom; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.Optionality; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.ParameterLayout; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.PropertyLayout; import org.apache.isis.extensions.secman.applib.tenancy.spi.ApplicationTenancyEvaluator; +import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; /** * Role interface for domain objects to implement, indicating that these are characteristics of the entity that @@ -111,6 +123,24 @@ */ public interface HasAtPath { + @AtPath String getAtPath(); + @Property( + maxLength = AtPath.MAX_LENGTH, + editing = Editing.DISABLED, + optionality = Optionality.OPTIONAL + ) + @Parameter( + maxLength = AtPath.MAX_LENGTH, + optionality = Optionality.OPTIONAL + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface AtPath { + int MAX_LENGTH = 255; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + } diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.java index 56381c4004d..f406d30642a 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/man/ApplicationTenancyManager.java @@ -19,6 +19,7 @@ package org.apache.isis.extensions.secman.applib.tenancy.man; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; @@ -30,10 +31,9 @@ import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib; import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy; +@Named(ApplicationTenancyManager.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = ApplicationTenancyManager.LOGICAL_TYPE_NAME -) + nature = Nature.VIEW_MODEL) public class ApplicationTenancyManager { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationTenancyManager"; diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java index e5639581015..999fcb57e36 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java @@ -23,15 +23,16 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.List; -import java.util.Locale; import java.util.Objects; import java.util.Set; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.CollectionLayout; import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.applib.annotation.Editing; import org.apache.isis.applib.annotation.MemberSupport; import org.apache.isis.applib.annotation.ObjectSupport; @@ -63,17 +64,43 @@ import org.apache.isis.extensions.secman.applib.tenancy.dom.HasAtPath; import lombok.val; +import lombok.experimental.UtilityClass; /** * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ApplicationUser.LOGICAL_TYPE_NAME +@Named(ApplicationUser.LOGICAL_TYPE_NAME) +@DomainObject +@DomainObjectLayout( + titleUiEvent = ApplicationUser.TitleUiEvent.class, + iconUiEvent = ApplicationUser.IconUiEvent.class, + cssClassUiEvent = ApplicationUser.CssClassUiEvent.class, + layoutUiEvent = ApplicationUser.LayoutUiEvent.class ) public abstract class ApplicationUser implements HasUsername, HasAtPath, Comparable { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationUser"; + public static final String SCHEMA = IsisModuleExtSecmanApplib.SCHEMA; + public static final String TABLE = "ApplicationUser"; + + @UtilityClass + public static class Nq { + public static final String FIND_BY_USERNAME = ApplicationUser.LOGICAL_TYPE_NAME + ".findByUsername"; + public static final String FIND_BY_EMAIL_ADDRESS = ApplicationUser.LOGICAL_TYPE_NAME + ".findByEmailAddress"; + public static final String FIND = ApplicationUser.LOGICAL_TYPE_NAME + ".find"; + public static final String FIND_BY_ATPATH = ApplicationUser.LOGICAL_TYPE_NAME + ".findByAtPath"; + } + + // -- UI & DOMAIN EVENTS + + public static class TitleUiEvent extends IsisModuleExtSecmanApplib.TitleUiEvent { } + public static class IconUiEvent extends IsisModuleExtSecmanApplib.IconUiEvent { } + public static class CssClassUiEvent extends IsisModuleExtSecmanApplib.CssClassUiEvent { } + public static class LayoutUiEvent extends IsisModuleExtSecmanApplib.LayoutUiEvent { } + + public static abstract class PropertyDomainEvent extends IsisModuleExtSecmanApplib.PropertyDomainEvent {} + public static abstract class CollectionDomainEvent extends IsisModuleExtSecmanApplib.CollectionDomainEvent {} @Inject private transient ApplicationUserRepository applicationUserRepository; @Inject private transient ApplicationPermissionRepository applicationPermissionRepository; @@ -106,17 +133,7 @@ protected Secman getSecmanConfig() { return config.getExtensions().getSecman(); } - // -- CONSTANTS - - public static final String NAMED_QUERY_FIND_BY_USERNAME = "ApplicationUser.findByUsername"; - public static final String NAMED_QUERY_FIND_BY_EMAIL_ADDRESS = "ApplicationUser.findByEmailAddress"; - public static final String NAMED_QUERY_FIND = "ApplicationUser.find"; - public static final String NAMED_QUERY_FIND_BY_ATPATH = "ApplicationUser.findByAtPath"; - - // -- DOMAIN EVENTS - public static abstract class PropertyDomainEvent extends IsisModuleExtSecmanApplib.PropertyDomainEvent {} - public static abstract class CollectionDomainEvent extends IsisModuleExtSecmanApplib.CollectionDomainEvent {} @@ -167,29 +184,22 @@ public String getName() { // -- USERNAME @Property( - domainEvent = Username.DomainEvent.class, - editing = Editing.DISABLED, - maxLength = Username.MAX_LENGTH + domainEvent = Username.DomainEvent.class ) @PropertyLayout( fieldSetId="identity", hidden = Where.PARENTED_TABLES, sequence = "1" ) - @Parameter( - maxLength = Username.MAX_LENGTH - ) - @ParameterLayout( - named = "Username" - ) + @HasUsername.Username @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Username { - int MAX_LENGTH = 120; - class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = HasUsername.Username.MAX_LENGTH; + boolean NULLABLE = HasUsername.Username.NULLABLE; + String ALLOWS_NULL = HasUsername.Username.ALLOWS_NULL; } - @Override @Username public abstract String getUsername(); @@ -219,11 +229,11 @@ class DomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface FamilyName { - int MAX_LENGTH = 120; - class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 120; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @FamilyName public abstract String getFamilyName(); public abstract void setFamilyName(String familyName); @@ -252,11 +262,11 @@ class DomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface GivenName { - int MAX_LENGTH = 120; - class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 120; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @GivenName public abstract String getGivenName(); public abstract void setGivenName(String givenName); @@ -285,11 +295,11 @@ class DomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface KnownAs { - int MAX_LENGTH = 120; - class KnownAsDomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 120; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @KnownAs public abstract String getKnownAs(); public abstract void setKnownAs(String knownAs); @@ -300,14 +310,16 @@ class KnownAsDomainEvent extends PropertyDomainEvent {} @Property( domainEvent = EmailAddress.DomainEvent.class, editing = Editing.DISABLED, - maxLength = EmailAddress.MAX_LENGTH + maxLength = EmailAddress.MAX_LENGTH, + optionality = Optionality.OPTIONAL ) @PropertyLayout( fieldSetName = "Contact Details", sequence = "3.1" ) @Parameter( - maxLength = EmailAddress.MAX_LENGTH + maxLength = EmailAddress.MAX_LENGTH, + optionality = Optionality.OPTIONAL ) @ParameterLayout( named = "Email" @@ -315,11 +327,11 @@ class KnownAsDomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface EmailAddress { - int MAX_LENGTH = 120; - class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 120; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @EmailAddress public abstract String getEmailAddress(); public abstract void setEmailAddress(String emailAddress); @@ -346,11 +358,11 @@ class DomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface PhoneNumber { - int MAX_LENGTH = 120; - class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 120; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @PhoneNumber public abstract String getPhoneNumber(); public abstract void setPhoneNumber(String phoneNumber); @@ -379,20 +391,22 @@ class DomainEvent extends PropertyDomainEvent {} @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface FaxNumber { - int MAX_LENGTH = 120; - class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 120; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @FaxNumber public abstract String getFaxNumber(); public abstract void setFaxNumber(String faxNumber); - // -- LOCALE + + // -- LOCALEs @Property( - domainEvent = UserLocale.DomainEvent.class, - editing = Editing.DISABLED // edit via update button + domainEvent = Locale.DomainEvent.class, + editing = Editing.DISABLED, // edit via update button + optionality = Optionality.OPTIONAL ) @PropertyLayout( fieldSetId = "regional" @@ -402,67 +416,106 @@ class DomainEvent extends PropertyDomainEvent {} ) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) - public @interface UserLocale { - class DomainEvent extends PropertyDomainEvent {} + public @interface Locale { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @UserLocale - public abstract Locale getLanguage(); - public abstract void setLanguage(Locale locale); - @UserLocale - public abstract Locale getNumberFormat(); - public abstract void setNumberFormat(Locale locale); + @Property( + domainEvent = Locale.DomainEvent.class + ) + @Locale + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Language { + class DomainEvent extends Locale.DomainEvent {} + boolean NULLABLE = Locale.NULLABLE; + String ALLOWS_NULL = Locale.ALLOWS_NULL; + } + @Language + public abstract java.util.Locale getLanguage(); + public abstract void setLanguage(java.util.Locale locale); - @UserLocale - public abstract Locale getTimeFormat(); - public abstract void setTimeFormat(Locale locale); - // -- AT PATH + @Property( + domainEvent = NumberFormat.DomainEvent.class + ) + @Locale + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface NumberFormat { + class DomainEvent extends Locale.DomainEvent {} + boolean NULLABLE = Locale.NULLABLE; + String ALLOWS_NULL = Locale.ALLOWS_NULL; + } + @NumberFormat + public abstract java.util.Locale getNumberFormat(); + public abstract void setNumberFormat(java.util.Locale locale); + @Property( - domainEvent = AtPath.DomainEvent.class, - editing = Editing.DISABLED, - optionality = Optionality.OPTIONAL + domainEvent = TimeFormat.DomainEvent.class + ) + @Locale + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface TimeFormat { + class DomainEvent extends Locale.DomainEvent {} + boolean NULLABLE = Locale.NULLABLE; + String ALLOWS_NULL = Locale.ALLOWS_NULL; + } + @TimeFormat + public abstract java.util.Locale getTimeFormat(); + public abstract void setTimeFormat(java.util.Locale locale); + + + + @Property( + domainEvent = AtPath.DomainEvent.class ) @PropertyLayout( fieldSetId = "access", sequence = "4" ) - @Parameter( - optionality = Optionality.OPTIONAL - ) - @ParameterLayout( - named = "AtPath" - ) + @HasAtPath.AtPath @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface AtPath { class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = HasAtPath.AtPath.MAX_LENGTH; + boolean NULLABLE = HasAtPath.AtPath.NULLABLE; + String ALLOWS_NULL = HasAtPath.AtPath.ALLOWS_NULL; } - @Override @AtPath public abstract String getAtPath(); public abstract void setAtPath(String atPath); + // -- ACCOUNT TYPE @Property( domainEvent = AccountType.DomainEvent.class, - editing = Editing.DISABLED + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY ) @PropertyLayout( fieldSetId = "access", sequence = "2" ) + @Parameter( + optionality = Optionality.MANDATORY + ) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface AccountType { class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } - @AccountType public abstract org.apache.isis.extensions.secman.applib.user.dom.AccountType getAccountType(); public abstract void setAccountType(org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType); @@ -472,18 +525,23 @@ class DomainEvent extends PropertyDomainEvent {} @Property( domainEvent = Status.DomainEvent.class, - editing = Editing.DISABLED + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY ) @PropertyLayout( fieldSetId = "access", sequence = "1" ) + @Parameter( + optionality = Optionality.MANDATORY + ) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface Status { class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } - @Status public abstract ApplicationUserStatus getStatus(); public abstract void setStatus(ApplicationUserStatus disabled); @@ -491,14 +549,16 @@ class DomainEvent extends PropertyDomainEvent {} // -- ENCRYPTED PASSWORD - @PropertyLayout( + @Property( hidden = Where.EVERYWHERE ) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface EncryptedPassword { + int MAX_LENGTH = 255; + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } - @EncryptedPassword public abstract String getEncryptedPassword(); public abstract void setEncryptedPassword(String encryptedPassword); @@ -546,6 +606,13 @@ public boolean isHasPassword() { @Retention(RetentionPolicy.RUNTIME) public @interface Roles { class RolesDomainEvent extends CollectionDomainEvent {} + + @UtilityClass + class Persistence { + public static final String TABLE = "ApplicationUserRoles"; + public static final String JOIN_COLUMN = "userId"; + public static final String INVERSE_JOIN_COLUMN = "roleId"; + } } @Roles diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUserRepositoryAbstract.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUserRepositoryAbstract.java index c89325853fa..a0f6c563814 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUserRepositoryAbstract.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUserRepositoryAbstract.java @@ -50,7 +50,7 @@ import lombok.NonNull; import lombok.val; -public abstract class ApplicationUserRepositoryAbstract +public class ApplicationUserRepositoryAbstract implements ApplicationUserRepository { @Inject private FactoryService factoryService; @@ -104,7 +104,7 @@ public Optional findByUsernameCached(final String username) { @Override public Optional findByUsername(final String username) { return _Casts.uncheckedCast( - repository.uniqueMatch(Query.named(this.applicationUserClass, ApplicationUser.NAMED_QUERY_FIND_BY_USERNAME) + repository.uniqueMatch(Query.named(this.applicationUserClass, ApplicationUser.Nq.FIND_BY_USERNAME) .withParameter("username", username)) ); } @@ -119,7 +119,7 @@ public Optional findByEmailAddressCached(final String emailAddr @Override public Optional findByEmailAddress(final String emailAddress) { return _Casts.uncheckedCast( - repository.uniqueMatch(Query.named(this.applicationUserClass, ApplicationUser.NAMED_QUERY_FIND_BY_EMAIL_ADDRESS) + repository.uniqueMatch(Query.named(this.applicationUserClass, ApplicationUser.Nq.FIND_BY_EMAIL_ADDRESS) .withParameter("emailAddress", emailAddress)) ); } @@ -129,7 +129,7 @@ public Optional findByEmailAddress(final String emailAddress) { @Override public Collection find(final @Nullable String _search) { val regex = regexReplacer.asRegex(_search); - return repository.allMatches(Query.named(this.applicationUserClass, ApplicationUser.NAMED_QUERY_FIND) + return repository.allMatches(Query.named(this.applicationUserClass, ApplicationUser.Nq.FIND) .withParameter("regex", regex)) .stream() .collect(_Sets.toUnmodifiableSorted()); @@ -140,7 +140,7 @@ public Collection find(final @Nullable String _search) { @Override public Collection findByAtPath(final String atPath) { - return repository.allMatches(Query.named(this.applicationUserClass, ApplicationUser.NAMED_QUERY_FIND_BY_ATPATH) + return repository.allMatches(Query.named(this.applicationUserClass, ApplicationUser.Nq.FIND_BY_ATPATH) .withParameter("atPath", atPath)) .stream() .collect(_Sets.toUnmodifiableSorted()); diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/ApplicationUser_updateLocale.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/ApplicationUser_updateLocale.java index cbb1ac3ccd5..e3c8498d91a 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/ApplicationUser_updateLocale.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/ApplicationUser_updateLocale.java @@ -19,7 +19,6 @@ package org.apache.isis.extensions.secman.applib.user.dom.mixins; import java.util.List; -import java.util.Locale; import javax.inject.Inject; @@ -31,7 +30,7 @@ import org.apache.isis.applib.services.locale.LocaleChoiceProvider; import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib; import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; -import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.UserLocale; +import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Locale; import org.apache.isis.extensions.secman.applib.user.dom.mixins.ApplicationUser_updateLocale.DomainEvent; import lombok.RequiredArgsConstructor; @@ -59,15 +58,15 @@ public static class DomainEvent // typed tuple made of all the action parameters @lombok.Value @Accessors(fluent = true) public static class Parameters { - final Locale language; - final Locale numberFormat; - final Locale timeFormat; + final java.util.Locale language; + final java.util.Locale numberFormat; + final java.util.Locale timeFormat; } @MemberSupport public ApplicationUser act( - @UserLocale final Locale language, - @UserLocale final Locale numberFormat, - @UserLocale final Locale timeFormat) { + @Locale final java.util.Locale language, + @Locale final java.util.Locale numberFormat, + @Locale final java.util.Locale timeFormat) { mixee.setLanguage(language); mixee.setNumberFormat(numberFormat); mixee.setTimeFormat(timeFormat); @@ -80,32 +79,32 @@ public static class Parameters { // -- LANGUAGE - @MemberSupport public Locale defaultLanguage(final Parameters p) { + @MemberSupport public java.util.Locale defaultLanguage(final Parameters p) { return mixee.getLanguage(); } - @MemberSupport public List choicesLanguage(final Parameters p) { + @MemberSupport public List choicesLanguage(final Parameters p) { return localeChoiceProvider.getAvailableLocales(); } // -- NUMBER FORMAT - @MemberSupport public Locale defaultNumberFormat(final Parameters p) { + @MemberSupport public java.util.Locale defaultNumberFormat(final Parameters p) { return mixee.getNumberFormat()!=null ? mixee.getNumberFormat() : p.language(); } - @MemberSupport public List choicesNumberFormat(final Parameters p) { + @MemberSupport public List choicesNumberFormat(final Parameters p) { return localeChoiceProvider.getAvailableLocales(); } // -- TIME FORMAT - @MemberSupport public Locale defaultTimeFormat(final Parameters p) { + @MemberSupport public java.util.Locale defaultTimeFormat(final Parameters p) { return mixee.getTimeFormat()!=null ? mixee.getTimeFormat() : p.language(); } - @MemberSupport public List choicesTimeFormat(final Parameters p) { + @MemberSupport public List choicesTimeFormat(final Parameters p) { return localeChoiceProvider.getAvailableLocales(); } diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/perms/UserPermissionViewModel.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/perms/UserPermissionViewModel.java index e8505e212fc..7300848a5f8 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/perms/UserPermissionViewModel.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/perms/UserPermissionViewModel.java @@ -28,6 +28,7 @@ import java.util.function.Function; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.ViewModel; import org.apache.isis.applib.annotation.BookmarkPolicy; @@ -68,10 +69,9 @@ * View model identified by {@link ApplicationFeatureId} and backed by an * {@link ApplicationFeature}. */ +@Named(UserPermissionViewModel.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = UserPermissionViewModel.LOGICAL_TYPE_NAME -) + nature = Nature.VIEW_MODEL) @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_ROOT ) diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.java index 3f8fd4edfec..8f7e47fad79 100644 --- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.java +++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/man/ApplicationUserManager.java @@ -19,6 +19,7 @@ package org.apache.isis.extensions.secman.applib.user.man; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; @@ -30,10 +31,9 @@ import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib; import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; +@Named(ApplicationUserManager.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = ApplicationUserManager.LOGICAL_TYPE_NAME -) + nature = Nature.VIEW_MODEL) public class ApplicationUserManager { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationUserManager"; diff --git a/extensions/security/secman/integration/pom.xml b/extensions/security/secman/integration/pom.xml index 4d08dd9ade2..d6dba11a315 100644 --- a/extensions/security/secman/integration/pom.xml +++ b/extensions/security/secman/integration/pom.xml @@ -29,7 +29,6 @@ isis-extensions-secman-integration Apache Isis Ext - Sec Man Integration - org.apache.isis.extensions.secman.integration @@ -39,14 +38,14 @@ - org.apache.isis.core - isis-core-runtime - provided + org.apache.isis.extensions + isis-extensions-secman-applib - org.apache.isis.extensions - isis-extensions-secman-applib + org.apache.isis.core + isis-core-runtime + provided diff --git a/extensions/security/secman/persistence-jdo/pom.xml b/extensions/security/secman/persistence-jdo/pom.xml index 835bbbadcf0..261ae1241ca 100644 --- a/extensions/security/secman/persistence-jdo/pom.xml +++ b/extensions/security/secman/persistence-jdo/pom.xml @@ -29,23 +29,14 @@ isis-extensions-secman-persistence-jdo Apache Isis Ext - Sec Man Persistence (Using JDO) - org.apache.isis.extensions.secman.persistence.jdo org/apache/isis/extensions/secman/persistence/jdo - - - org.apache.isis.extensions - isis-extensions-secman-applib - test - test-jar - - org.apache.isis.extensions isis-extensions-secman-integration @@ -56,6 +47,11 @@ isis-persistence-jdo-datanucleus + + org.apache.isis.testing + isis-testing-fixtures-applib + + org.apache.isis.core isis-core-runtime @@ -63,8 +59,10 @@ - org.apache.isis.testing - isis-testing-fixtures-applib + org.apache.isis.extensions + isis-extensions-secman-applib + test + test-jar @@ -72,12 +70,6 @@ isis-testing-integtestsupport-applib test - - - org.apache.isis.testing - isis-testing-fixtures-applib - test - diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/permission/dom/ApplicationPermission.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/permission/dom/ApplicationPermission.java index e9b15c05c75..af1cef47c76 100644 --- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/permission/dom/ApplicationPermission.java +++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/permission/dom/ApplicationPermission.java @@ -18,6 +18,7 @@ */ package org.apache.isis.extensions.secman.jdo.permission.dom; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -38,46 +39,48 @@ import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort; import org.apache.isis.commons.internal.base._Casts; +import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.Nq; import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermissionMode; import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermissionRule; import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole; +import lombok.Getter; +import lombok.Setter; + @PersistenceCapable( identityType = IdentityType.DATASTORE, - schema = "isisExtensionsSecman", - table = "ApplicationPermission") -@Inheritance( - strategy = InheritanceStrategy.NEW_TABLE) -@DatastoreIdentity( - strategy = IdGeneratorStrategy.NATIVE, column = "id") -@Version( - strategy = VersionStrategy.VERSION_NUMBER, - column = "version") + schema = ApplicationPermission.SCHEMA, + table = ApplicationPermission.TABLE) +@Uniques({ + @Unique( + name = "ApplicationPermission_role_feature_rule_UNQ", + members = { "role", "featureSort", "featureFqn", "rule" }) +}) @Queries( { @Query( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE, + name = Nq.FIND_BY_ROLE, value = "SELECT " + "FROM " + ApplicationPermission.FQCN + " WHERE role == :role"), @Query( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_USER, + name = Nq.FIND_BY_USER, value = "SELECT " + "FROM " + ApplicationPermission.FQCN + " WHERE (u.roles.contains(role) && u.username == :username) " + "VARIABLES org.apache.isis.extensions.secman.jdo.user.dom.ApplicationUser u"), @Query( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_NAMES, + name = Nq.FIND_BY_ROLE_NAMES, value = "SELECT " + "FROM " + ApplicationPermission.FQCN + " WHERE :roleNames.contains(role.name) "), @Query( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_FEATURE, + name = Nq.FIND_BY_FEATURE, value = "SELECT " + "FROM " + ApplicationPermission.FQCN + " WHERE featureSort == :featureSort " + " && featureFqn == :featureFqn"), @Query( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_RULE_FEATURE_FQN, + name = Nq.FIND_BY_ROLE_RULE_FEATURE_FQN, value = "SELECT " + "FROM " + ApplicationPermission.FQCN + " WHERE role == :role " @@ -85,21 +88,22 @@ + " && featureSort == :featureSort " + " && featureFqn == :featureFqn "), @Query( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_RULE_FEATURE, + name = Nq.FIND_BY_ROLE_RULE_FEATURE, value = "SELECT " + "FROM " + ApplicationPermission.FQCN + " WHERE role == :role " + " && rule == :rule " + " && featureSort == :featureSort "), }) -@Uniques({ - @Unique( - name = "ApplicationPermission_role_feature_rule_UNQ", - members = { "role", "featureSort", "featureFqn", "rule" }) -}) -@DomainObject( - logicalTypeName = ApplicationPermission.LOGICAL_TYPE_NAME -) +@Inheritance( + strategy = InheritanceStrategy.NEW_TABLE) +@DatastoreIdentity( + strategy = IdGeneratorStrategy.NATIVE, column = "id") +@Version( + strategy = VersionStrategy.VERSION_NUMBER, + column = "version") +@Named(ApplicationPermission.LOGICAL_TYPE_NAME) +@DomainObject() @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_CHILD ) @@ -109,84 +113,38 @@ public class ApplicationPermission protected final static String FQCN = "org.apache.isis.extensions.secman.jdo.permission.dom.ApplicationPermission"; - // -- ROLE - - @Column(name = "roleId", allowsNull = "false") - private org.apache.isis.extensions.secman.jdo.role.dom.ApplicationRole role; - + @Column(name = Role.NAME, allowsNull = Role.ALLOWS_NULL) @Role + @Getter + private org.apache.isis.extensions.secman.jdo.role.dom.ApplicationRole role; @Override - public ApplicationRole getRole() { - return role; - } - @Override - public void setRole(ApplicationRole role) { + public void setRole(final ApplicationRole role) { this.role = _Casts.uncheckedCast(role); } - // -- RULE - - @Column(allowsNull = "false") - private ApplicationPermissionRule rule; - - @Override + @Column(allowsNull = Rule.ALLOWS_NULL) @Rule - public ApplicationPermissionRule getRule() { - return rule; - } - @Override - public void setRule(ApplicationPermissionRule rule) { - this.rule = rule; - } - - - // -- MODE + @Getter @Setter + private ApplicationPermissionRule rule; - @Column(allowsNull = "false") - private ApplicationPermissionMode mode; + @Column(allowsNull = Mode.ALLOWS_NULL) @Mode - @Override - public ApplicationPermissionMode getMode() { - return mode; - } - @Override - public void setMode(ApplicationPermissionMode mode) { - this.mode = mode; - } - + @Getter @Setter + private ApplicationPermissionMode mode; - // -- FEATURE SORT - @Column(allowsNull = "false") + @Column(allowsNull = FeatureSort.ALLOWS_NULL) + @FeatureSort + @Getter @Setter private ApplicationFeatureSort featureSort; - @Programmatic - @Override - public ApplicationFeatureSort getFeatureSort() { - return featureSort; - } - @Override - public void setFeatureSort(ApplicationFeatureSort featureSort) { - this.featureSort = featureSort; - } - - - // -- FQN - - @Column(allowsNull = "false") - private String featureFqn; + @Column(allowsNull = FeatureFqn.ALLOWS_NULL) @FeatureFqn - @Override - public String getFeatureFqn() { - return featureFqn; - } - @Override - public void setFeatureFqn(String featureFqn) { - this.featureFqn = featureFqn; - } + @Getter @Setter + private String featureFqn; } diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/role/dom/ApplicationRole.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/role/dom/ApplicationRole.java index 57ab64bf00e..c5caf5e10e7 100644 --- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/role/dom/ApplicationRole.java +++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/role/dom/ApplicationRole.java @@ -21,6 +21,7 @@ import java.util.SortedSet; import java.util.TreeSet; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -39,36 +40,41 @@ import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.commons.internal.base._Casts; -import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; +import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.Nq; +import org.apache.isis.extensions.secman.jdo.user.dom.ApplicationUser; + +import lombok.Getter; +import lombok.Setter; @PersistenceCapable( identityType = IdentityType.DATASTORE, - schema = "isisExtensionsSecman", - table = "ApplicationRole") -@Inheritance( - strategy = InheritanceStrategy.NEW_TABLE) -@DatastoreIdentity( - strategy = IdGeneratorStrategy.NATIVE, column = "id") + schema = ApplicationRole.SCHEMA, + table = ApplicationRole.TABLE) @Uniques({ @Unique( - name = "ApplicationRole_name_UNQ", members = { "name" }) + name = "ApplicationRole_name_UNQ", + members = { "name" }) }) @Queries({ @Query( - name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.NAMED_QUERY_FIND_BY_NAME, + name = Nq.FIND_BY_NAME, value = "SELECT " + "FROM " + ApplicationRole.FQCN + " WHERE name == :name"), @Query( - name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.NAMED_QUERY_FIND_BY_NAME_CONTAINING, + name = Nq.FIND_BY_NAME_CONTAINING, value = "SELECT " + "FROM " + ApplicationRole.FQCN + " WHERE name.matches(:regex) ") }) +@Inheritance( + strategy = InheritanceStrategy.NEW_TABLE) +@DatastoreIdentity( + strategy = IdGeneratorStrategy.NATIVE, column = "id") +@Named(ApplicationRole.LOGICAL_TYPE_NAME) @DomainObject( bounding = Bounding.BOUNDED, - logicalTypeName = ApplicationRole.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationRoleRepository.class, autoCompleteMethod = "findMatching" ) @@ -81,51 +87,27 @@ public class ApplicationRole protected final static String FQCN = "org.apache.isis.extensions.secman.jdo.role.dom.ApplicationRole"; - - // -- NAME - - @Column(allowsNull = "false", length = Name.MAX_LENGTH) - private String name; - + @Column(allowsNull = Name.ALLOWS_NULL, length = Name.MAX_LENGTH) @Name - @Override - public String getName() { - return name; - } - @Override - public void setName(String name) { - this.name = name; - } - - - // -- DESCRIPTION + @Getter @Setter + private String name; - @Column(allowsNull = "true", length = Description.MAX_LENGTH) - private String description; + @Column(allowsNull = Description.ALLOWS_NULL, length = Description.MAX_LENGTH) @Description - @Override - public String getDescription() { - return description; - } - @Override - public void setDescription(String description) { - this.description = description; - } - - - // -- USERS + @Getter @Setter + private String description; - @Persistent(mappedBy = "roles") - private SortedSet users = new TreeSet<>(); + @Persistent(mappedBy = Users.MAPPED_BY) @Users + private SortedSet users = new TreeSet<>(); @Override - public SortedSet getUsers() { + public SortedSet getUsers() { return _Casts.uncheckedCast(users); } // necessary for integration tests - public void addToUsers(final ApplicationUser applicationUser) { + public void addToUsers(final org.apache.isis.extensions.secman.jdo.user.dom.ApplicationUser applicationUser) { getUsers().add(applicationUser); } diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/tenancy/dom/ApplicationTenancy.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/tenancy/dom/ApplicationTenancy.java index 1e30abb8d81..3adceaf8993 100644 --- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/tenancy/dom/ApplicationTenancy.java +++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/tenancy/dom/ApplicationTenancy.java @@ -21,6 +21,7 @@ import java.util.SortedSet; import java.util.TreeSet; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -41,41 +42,47 @@ import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.commons.internal.base._Casts; +import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.Nq; +import org.apache.isis.extensions.secman.applib.tenancy.dom.HasAtPath; + +import lombok.Getter; +import lombok.Setter; @PersistenceCapable( identityType = IdentityType.APPLICATION, - schema = "isisExtensionsSecman", - table = "ApplicationTenancy") -@Inheritance( - strategy = InheritanceStrategy.NEW_TABLE) -@DatastoreIdentity( - strategy = IdGeneratorStrategy.NATIVE, column = "id") -@Version( - strategy = VersionStrategy.VERSION_NUMBER, - column = "version") + schema = ApplicationTenancy.SCHEMA, + table = ApplicationTenancy.TABLE) @Uniques({ @Unique( - name = "ApplicationTenancy_name_UNQ", members = { "name" }) + name = "ApplicationTenancy_name_UNQ", + members = { "name" }) }) @Queries( { @Query( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.NAMED_QUERY_FIND_BY_PATH, + name = Nq.FIND_BY_PATH, value = "SELECT " + "FROM " + ApplicationTenancy.FQCN + " WHERE path == :path"), @Query( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.NAMED_QUERY_FIND_BY_NAME, + name = Nq.FIND_BY_NAME, value = "SELECT " + "FROM " + ApplicationTenancy.FQCN + " WHERE name == :name"), @Query( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.NAMED_QUERY_FIND_BY_NAME_OR_PATH_MATCHING, + name = Nq.FIND_BY_NAME_OR_PATH_MATCHING, value = "SELECT " + "FROM " + ApplicationTenancy.FQCN + " WHERE name.matches(:regex) || path.matches(:regex) ")}) +@Inheritance( + strategy = InheritanceStrategy.NEW_TABLE) +@DatastoreIdentity( + strategy = IdGeneratorStrategy.NATIVE, column = "id") +@Version( + strategy = VersionStrategy.VERSION_NUMBER, + column = "version") +@Named(ApplicationTenancy.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = ApplicationTenancy.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationTenancyRepository.class, autoCompleteMethod = "findMatching" ) @@ -88,67 +95,37 @@ public class ApplicationTenancy protected final static String FQCN = "org.apache.isis.extensions.secman.jdo.tenancy.dom.ApplicationTenancy"; - // -- NAME - - @Column(allowsNull ="false", length = Name.MAX_LENGTH) - private String name; - + @Column(allowsNull = Name.ALLOWS_NULL, length = Name.MAX_LENGTH) @Name - @Override - public String getName() { - return name; - } - @Override - public void setName(String name) { - this.name = name; - } - + @Getter @Setter + private String name; - // -- PATH @PrimaryKey - @Column(allowsNull = "false", length = Path.MAX_LENGTH) - private String path; - + @Column(allowsNull = Path.ALLOWS_NULL, length = Path.MAX_LENGTH) @Path - @Override - public String getPath() { - return path; - } - @Override - public void setPath(String path) { - this.path = path; - } - - - // -- PARENT - + @Getter @Setter + private String path; - @Column(name = "parentPath", allowsNull = "true") - private ApplicationTenancy parent; + @Column(name = Parent.NAME, allowsNull = Parent.ALLOWS_NULL) @Parent - @Override - public org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy getParent() { - return parent; - } + @Getter + private ApplicationTenancy parent; @Override public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { this.parent = _Casts.uncheckedCast(parent); } - // -- CHILDREN - - @Persistent(mappedBy = "parent") - private SortedSet children = new TreeSet<>(); - + @Persistent(mappedBy = Children.MAPPED_BY) @Children + private SortedSet children = new TreeSet<>(); @Override public SortedSet getChildren() { return _Casts.uncheckedCast(children); } - public void setChildren(SortedSet children) { + public void setChildren(final SortedSet children) { this.children = _Casts.uncheckedCast(children); } // necessary for integration tests diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java index df7069fceed..115446d01e2 100644 --- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java +++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java @@ -18,10 +18,10 @@ */ package org.apache.isis.extensions.secman.jdo.user.dom; -import java.util.Locale; import java.util.SortedSet; import java.util.TreeSet; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.Element; @@ -43,23 +43,17 @@ import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.commons.internal.base._Casts; -import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole; +import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq; import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserStatus; +import org.apache.isis.extensions.secman.jdo.role.dom.ApplicationRole; import lombok.Getter; import lombok.Setter; @PersistenceCapable( identityType = IdentityType.DATASTORE, - schema = "isisExtensionsSecman", - table = "ApplicationUser") -@Inheritance( - strategy = InheritanceStrategy.NEW_TABLE) -@DatastoreIdentity( - strategy = IdGeneratorStrategy.NATIVE, column = "id") -@Version( - strategy = VersionStrategy.VERSION_NUMBER, - column = "version") + schema = ApplicationUser.SCHEMA, + table = ApplicationUser.TABLE) @Uniques({ @Unique( name = "ApplicationUser_username_UNQ", @@ -67,32 +61,39 @@ }) @Queries( { @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_USERNAME, + name = Nq.FIND_BY_USERNAME, value = "SELECT " - + "FROM " + ApplicationUser.FQCN - + " WHERE username == :username"), + + " FROM " + ApplicationUser.FQCN + + " WHERE username == :username"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_EMAIL_ADDRESS, + name = Nq.FIND_BY_EMAIL_ADDRESS, value = "SELECT " - + "FROM " + ApplicationUser.FQCN - + " WHERE emailAddress == :emailAddress"), + + " FROM " + ApplicationUser.FQCN + + " WHERE emailAddress == :emailAddress"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_ATPATH, + name = Nq.FIND_BY_ATPATH, value = "SELECT " - + "FROM " + ApplicationUser.FQCN - + " WHERE atPath == :atPath"), + + " FROM " + ApplicationUser.FQCN + + " WHERE atPath == :atPath"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND, + name = Nq.FIND, value = "SELECT " - + "FROM " + ApplicationUser.FQCN - + " WHERE username.matches(:regex)" - + " || familyName.matches(:regex)" - + " || givenName.matches(:regex)" - + " || knownAs.matches(:regex)" - + " || emailAddress.matches(:regex)") + + " FROM " + ApplicationUser.FQCN + + " WHERE username.matches(:regex)" + + " || familyName.matches(:regex)" + + " || givenName.matches(:regex)" + + " || knownAs.matches(:regex)" + + " || emailAddress.matches(:regex)") }) +@Inheritance( + strategy = InheritanceStrategy.NEW_TABLE) +@DatastoreIdentity( + strategy = IdGeneratorStrategy.NATIVE, column = "id") +@Version( + strategy = VersionStrategy.VERSION_NUMBER, + column = "version") +@Named(ApplicationUser.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = ApplicationUser.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationUserRepository.class, autoCompleteMethod = "findMatching" ) @@ -105,208 +106,104 @@ public class ApplicationUser protected final static String FQCN = "org.apache.isis.extensions.secman.jdo.user.dom.ApplicationUser"; - // -- USERNAME - - @Column(allowsNull = "false", length = Username.MAX_LENGTH) - private String username; - + @Column(allowsNull = Username.ALLOWS_NULL, length = Username.MAX_LENGTH) @Username - @Override - public String getUsername() { - return username; - } - @Override - public void setUsername(final String username) { this.username = username; } - - - // -- FAMILY NAME + @Getter @Setter + private String username; - @Column(allowsNull = "true", length = FamilyName.MAX_LENGTH) - private String familyName; + @Column(allowsNull = FamilyName.ALLOWS_NULL, length = FamilyName.MAX_LENGTH) @FamilyName - @Override - public String getFamilyName() { - return familyName; - } - @Override - public void setFamilyName(final String familyName) { - this.familyName = familyName; - } - + @Getter @Setter + private String familyName; - // -- GIVEN NAME - - @Column(allowsNull = "true", length = GivenName.MAX_LENGTH) - private String givenName; + @Column(allowsNull = GivenName.ALLOWS_NULL, length = GivenName.MAX_LENGTH) @GivenName - @Override - public String getGivenName() { - return givenName; - } - @Override - public void setGivenName(final String givenName) { - this.givenName = givenName; - } - - - // -- KNOWN AS + @Getter @Setter + private String givenName; - @Column(allowsNull = "true", length = KnownAs.MAX_LENGTH) - private String knownAs; + @Column(allowsNull = KnownAs.ALLOWS_NULL, length = KnownAs.MAX_LENGTH) @KnownAs - @Override - public String getKnownAs() { - return knownAs; - } - @Override - public void setKnownAs(final String knownAs) { - this.knownAs = knownAs; - } - - - // -- EMAIL ADDRESS + @Getter @Setter + private String knownAs; - @Column(allowsNull="true", length = EmailAddress.MAX_LENGTH) - private String emailAddress; + @Column(allowsNull = EmailAddress.ALLOWS_NULL, length = EmailAddress.MAX_LENGTH) @EmailAddress - @Override - public String getEmailAddress() { - return emailAddress; - } - @Override - public void setEmailAddress(final String emailAddress) { - this.emailAddress = emailAddress; - } - - - // -- PHONE NUMBER + @Getter @Setter + private String emailAddress; - @Column(allowsNull = "true", length = PhoneNumber.MAX_LENGTH) - private String phoneNumber; + @Column(allowsNull = PhoneNumber.ALLOWS_NULL, length = PhoneNumber.MAX_LENGTH) @PhoneNumber - @Override - public String getPhoneNumber() { - return phoneNumber; - } - @Override - public void setPhoneNumber(final String phoneNumber) { - this.phoneNumber = phoneNumber; - } - + @Getter @Setter + private String phoneNumber; - // -- FAX NUMBER - - @Column(allowsNull = "true", length = FaxNumber.MAX_LENGTH) - private String faxNumber; + @Column(allowsNull = FaxNumber.ALLOWS_NULL, length = FaxNumber.MAX_LENGTH) @FaxNumber - @Override - public String getFaxNumber() { - return faxNumber; - } - @Override - public void setFaxNumber(final String faxNumber) { - this.faxNumber = faxNumber; - } + @Getter @Setter + private String faxNumber; - // -- LOCALE - @UserLocale - @Column(allowsNull="true") + @Column(allowsNull = Language.ALLOWS_NULL) + @Language @Getter @Setter - private Locale language; + private java.util.Locale language; - @UserLocale - @Column(allowsNull="true") - @Getter @Setter - private Locale numberFormat; - @UserLocale - @Column(allowsNull="true") + @Column(allowsNull = NumberFormat.ALLOWS_NULL) + @NumberFormat @Getter @Setter - private Locale timeFormat; - - // -- AT PATH + private java.util.Locale numberFormat; - @Column(allowsNull="true") - private String atPath; - @AtPath - @Override - public String getAtPath() { - return atPath; - } - @Override - public void setAtPath(final String atPath) { - this.atPath = atPath; - } + @Column(allowsNull = TimeFormat.ALLOWS_NULL) + @TimeFormat + @Getter @Setter + private java.util.Locale timeFormat; - // -- ACCOUNT TYPE + @Column(allowsNull = AtPath.ALLOWS_NULL, length = AtPath.MAX_LENGTH) + @AtPath + @Getter @Setter + private String atPath; - @Column(allowsNull = "false") - private org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType; + @Column(allowsNull = AccountType.ALLOWS_NULL) @AccountType - @Override - public org.apache.isis.extensions.secman.applib.user.dom.AccountType getAccountType() { - return accountType; - } + @Getter + private org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType; @Override public void setAccountType(final org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType) { this.accountType = accountType; } - // -- STATUS - - @Column(allowsNull = "false") - private ApplicationUserStatus status; - + @Column(allowsNull = Status.ALLOWS_NULL) @Status - @Override - public ApplicationUserStatus getStatus() { - return status; - } - @Override - public void setStatus(final ApplicationUserStatus status) { - this.status = status; - } - + @Getter @Setter + private ApplicationUserStatus status; - // -- ENCRYPTED PASSWORD - @Column(allowsNull = "true") + @Column(allowsNull = EncryptedPassword.ALLOWS_NULL, length = EncryptedPassword.MAX_LENGTH) + @EncryptedPassword + @Getter @Setter private String encryptedPassword; - @EncryptedPassword - @Override - public String getEncryptedPassword() { - return encryptedPassword; - } - @Override - public void setEncryptedPassword(final String encryptedPassword) { - this.encryptedPassword = encryptedPassword; - } // ROLES - @Persistent(table="ApplicationUserRoles") - @Join(column="userId") - @Element(column="roleId") - private SortedSet roles = new TreeSet<>(); - + @Persistent(table = Roles.Persistence.TABLE) + @Join(column = Roles.Persistence.JOIN_COLUMN) + @Element(column = Roles.Persistence.INVERSE_JOIN_COLUMN) @Roles + private SortedSet roles = new TreeSet<>(); @Override - public SortedSet getRoles() { + public SortedSet getRoles() { return _Casts.uncheckedCast(roles); } - - } diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/util/RegexReplacer.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/util/RegexReplacer.java index d38900e72a9..7106e99cbdc 100644 --- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/util/RegexReplacer.java +++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/util/RegexReplacer.java @@ -22,6 +22,8 @@ import org.springframework.stereotype.Component; +import org.apache.isis.commons.internal.base._Strings; + import lombok.val; @Component @@ -30,7 +32,7 @@ public class RegexReplacer implements org.apache.isis.extensions.secman.applib.u @Override public String asRegex(String str) { - val search = str.replace("*", ".*").replace("?", "."); + val search = _Strings.nullToEmpty(str).replace("*", ".*").replace("?", "."); return String.format("(?i).*%s.*", search); } diff --git a/extensions/security/secman/persistence-jpa/pom.xml b/extensions/security/secman/persistence-jpa/pom.xml index 54f2b5cf5fe..f5c3455ef07 100644 --- a/extensions/security/secman/persistence-jpa/pom.xml +++ b/extensions/security/secman/persistence-jpa/pom.xml @@ -39,13 +39,6 @@ - - org.apache.isis.extensions - isis-extensions-secman-applib - test - test-jar - - org.apache.isis.extensions isis-extensions-secman-integration @@ -75,14 +68,15 @@ - org.apache.isis.testing - isis-testing-integtestsupport-applib + org.apache.isis.extensions + isis-extensions-secman-applib test + test-jar - + org.apache.isis.testing - isis-testing-fixtures-applib + isis-testing-integtestsupport-applib test diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermission.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermission.java index f53e04dc956..f4a662c6d84 100644 --- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermission.java +++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermission.java @@ -18,6 +18,7 @@ */ package org.apache.isis.extensions.secman.jpa.permission.dom; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -44,10 +45,15 @@ import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole; import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; +import static org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.*; + +import lombok.Getter; +import lombok.Setter; + @Entity @Table( - schema = "isisExtensionsSecman", - name = "ApplicationPermission", + schema = ApplicationPermission.SCHEMA, + name = ApplicationPermission.TABLE, uniqueConstraints= @UniqueConstraint( name = "ApplicationPermission_role_feature_rule_UNQ", @@ -55,31 +61,31 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE, + name = Nq.FIND_BY_ROLE, query = "SELECT p " + " FROM ApplicationPermission p " + " WHERE p.role = :role"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_USER, + name = Nq.FIND_BY_USER, query = "SELECT perm " + "FROM ApplicationPermission perm " + "JOIN perm.role role " + "JOIN role.users user " + "WHERE user.username = :username"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_NAMES, + name = Nq.FIND_BY_ROLE_NAMES, query = "SELECT perm " + "FROM ApplicationPermission perm " + "JOIN perm.role role " + "WHERE role.name IN :roleNames"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_FEATURE, + name = Nq.FIND_BY_FEATURE, query = "SELECT p " + " FROM ApplicationPermission p " + " WHERE p.featureSort = :featureSort " + " AND p.featureFqn = :featureFqn"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_RULE_FEATURE_FQN, + name = Nq.FIND_BY_ROLE_RULE_FEATURE_FQN, query = "SELECT p " + " FROM ApplicationPermission p " + " WHERE p.role = :role " @@ -87,7 +93,7 @@ + " AND p.featureSort = :featureSort " + " AND p.featureFqn = :featureFqn "), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE_RULE_FEATURE, + name = Nq.FIND_BY_ROLE_RULE_FEATURE, query = "SELECT p " + " FROM ApplicationPermission p " + " WHERE p.role = :role " @@ -95,9 +101,8 @@ + " AND p.featureSort = :featureSort "), }) @EntityListeners(IsisEntityListener.class) -@DomainObject( - logicalTypeName = ApplicationPermission.LOGICAL_TYPE_NAME -) +@Named(ApplicationPermission.LOGICAL_TYPE_NAME) +@DomainObject @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_CHILD ) @@ -113,88 +118,40 @@ public class ApplicationPermission private Long version; - // -- ROLE - @ManyToOne - @JoinColumn(name="roleId", nullable=false) - private org.apache.isis.extensions.secman.jpa.role.dom.ApplicationRole role; - + @JoinColumn(name=Role.NAME, nullable=Role.NULLABLE) @Role - @Override - public ApplicationRole getRole() { - return role; - } + @Getter + private org.apache.isis.extensions.secman.jpa.role.dom.ApplicationRole role; @Override public void setRole(final ApplicationRole applicationRole) { role = _Casts.uncheckedCast(applicationRole); } - // -- RULE - - @Column(nullable = false) + @Column(nullable = Rule.NULLABLE) @Enumerated(EnumType.STRING) - private ApplicationPermissionRule rule; - - @Override @Rule - public ApplicationPermissionRule getRule() { - return rule; - } - @Override - public void setRule(final ApplicationPermissionRule rule) { - this.rule = rule; - } - - - // -- MODE + @Getter @Setter + private ApplicationPermissionRule rule; - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private ApplicationPermissionMode mode; + @Column(nullable = Mode.NULLABLE) @Enumerated(EnumType.STRING) @Mode - @Override - public ApplicationPermissionMode getMode() { - return mode; - } - @Override - public void setMode(final ApplicationPermissionMode mode) { - this.mode = mode; - } - + @Getter @Setter + private ApplicationPermissionMode mode; - // -- FEATURE SORT - @Column(nullable = false) - @Enumerated(EnumType.STRING) + @Column(nullable = FeatureSort.NULLABLE) @Enumerated(EnumType.STRING) + @FeatureSort + @Getter @Setter private ApplicationFeatureSort featureSort; - @Programmatic - @Override - public ApplicationFeatureSort getFeatureSort() { - return featureSort; - } - @Override - public void setFeatureSort(final ApplicationFeatureSort featureSort) { - this.featureSort = featureSort; - } - - - // -- FQN - - @Column(nullable = false) - private String featureFqn; + @Column(nullable = FeatureFqn.NULLABLE) @FeatureFqn - @Override - public String getFeatureFqn() { - return featureFqn; - } - @Override - public void setFeatureFqn(final String featureFqn) { - this.featureFqn = featureFqn; - } + @Getter @Setter + private String featureFqn; } diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermissionRepository.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermissionRepository.java index 72d4dd97c40..2ac48196da9 100644 --- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermissionRepository.java +++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/permission/dom/ApplicationPermissionRepository.java @@ -18,21 +18,11 @@ */ package org.apache.isis.extensions.secman.jpa.permission.dom; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import javax.inject.Inject; import javax.inject.Named; import org.springframework.stereotype.Repository; -import org.apache.isis.commons.internal.base._NullSafe; import org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermissionRepositoryAbstract; -import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; -import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserRepository; - -import lombok.NonNull; @Repository @Named("isis.ext.secman.ApplicationPermissionRepository") diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java index 0155444c677..669b204a803 100644 --- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java +++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java @@ -21,6 +21,7 @@ import java.util.Set; import java.util.TreeSet; +import javax.inject.Named; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; @@ -39,13 +40,17 @@ import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.commons.internal.base._Casts; -import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; +import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.Nq; +import org.apache.isis.extensions.secman.jpa.user.dom.ApplicationUser; import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; +import lombok.Getter; +import lombok.Setter; + @Entity @Table( - schema = "isisExtensionsSecman", - name = "ApplicationRole", + schema = ApplicationRole.SCHEMA, + name = ApplicationRole.TABLE, uniqueConstraints = @UniqueConstraint( name = "ApplicationRole_name_UNQ", @@ -53,20 +58,20 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.NAMED_QUERY_FIND_BY_NAME, + name = Nq.FIND_BY_NAME, query = "SELECT r " + "FROM ApplicationRole r " + "WHERE r.name = :name"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.NAMED_QUERY_FIND_BY_NAME_CONTAINING, + name = Nq.FIND_BY_NAME_CONTAINING, query = "SELECT r " + "FROM ApplicationRole r " + "WHERE r.name LIKE :regex"), }) @EntityListeners(IsisEntityListener.class) +@Named(ApplicationRole.LOGICAL_TYPE_NAME) @DomainObject( bounding = Bounding.BOUNDED, - logicalTypeName = ApplicationRole.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationRoleRepository.class, autoCompleteMethod = "findMatching" ) @@ -84,49 +89,27 @@ public class ApplicationRole private Long version; - // -- NAME - - @Column(nullable = false, length = Name.MAX_LENGTH) - private String name; - + @Column(nullable = Name.NULLABLE, length = Name.MAX_LENGTH) @Name - @Override - public String getName() { - return name; - } - @Override - public void setName(final String name) { - this.name = name; - } - - - // -- DESCRIPTION + @Getter @Setter + private String name; - @Column(nullable = true, length = Description.MAX_LENGTH) - private String description; + @Column(nullable = Description.NULLABLE, length = Description.MAX_LENGTH) @Description - @Override - public String getDescription() { - return description; - } - @Override - public void setDescription(final String description) { - this.description = description; - } - + @Getter @Setter + private String description; - // -- USERS + @ManyToMany(mappedBy = Users.MAPPED_BY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) @Users - @ManyToMany(mappedBy = "roles", cascade = {CascadeType.MERGE, CascadeType.PERSIST}) - private Set users = new TreeSet<>(); + private Set users = new TreeSet<>(); - @Users @Override - public Set getUsers() { + public Set getUsers() { return _Casts.uncheckedCast(users); } + // necessary for integration tests public void addToUsers(final ApplicationUser applicationUser) { getUsers().add(applicationUser); diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/tenancy/dom/ApplicationTenancy.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/tenancy/dom/ApplicationTenancy.java index 1254d41d11f..788b7bcf178 100644 --- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/tenancy/dom/ApplicationTenancy.java +++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/tenancy/dom/ApplicationTenancy.java @@ -22,6 +22,7 @@ import java.util.SortedSet; import java.util.TreeSet; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @@ -38,12 +39,16 @@ import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.commons.internal.base._Casts; +import org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.Nq; + +import lombok.Getter; +import lombok.Setter; @Entity @Table( - schema = "isisExtensionsSecman", - name = "ApplicationTenancy", + schema = ApplicationTenancy.SCHEMA, + name = ApplicationTenancy.TABLE, uniqueConstraints = @UniqueConstraint( name = "ApplicationTenancy_name_UNQ", @@ -51,24 +56,24 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.NAMED_QUERY_FIND_BY_PATH, + name = Nq.FIND_BY_PATH, query = "SELECT t " + " FROM ApplicationTenancy t " + " WHERE t.path = :path"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.NAMED_QUERY_FIND_BY_NAME, + name = Nq.FIND_BY_NAME, query = "SELECT t " + " FROM ApplicationTenancy t " + " WHERE t.name = :name"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.NAMED_QUERY_FIND_BY_NAME_OR_PATH_MATCHING, + name = Nq.FIND_BY_NAME_OR_PATH_MATCHING, query = "SELECT t " + " FROM ApplicationTenancy t " + " WHERE t.name LIKE :regex " + " OR t.path LIKE :regex"), }) +@Named(ApplicationTenancy.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = ApplicationTenancy.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationTenancyRepository.class, autoCompleteMethod = "findMatching" ) @@ -78,72 +83,43 @@ public class ApplicationTenancy extends org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy { - @Version private Long version; - // -- NAME - - @Column(nullable = false, length = Name.MAX_LENGTH) - private String name; - + @Column(nullable = Name.NULLABLE, length = Name.MAX_LENGTH) @Name - @Override - public String getName() { - return name; - } - @Override - public void setName(String name) { - this.name = name; - } - + @Getter @Setter + private String name; - // -- PATH @Id - @Column(nullable = false, length = Path.MAX_LENGTH) - private String path; - + @Column(nullable = Path.NULLABLE, length = Path.MAX_LENGTH) @Path - @Override - public String getPath() { - return path; - } - @Override - public void setPath(String path) { - this.path = path; - } - + @Getter @Setter + private String path; - // -- PARENT @ManyToOne - @JoinColumn(name="parentPath", nullable = true) - private ApplicationTenancy parent; - + @JoinColumn(name=Parent.NAME, nullable = Parent.NULLABLE) @Parent - @Override - public org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy getParent() { - return parent; - } + @Getter + private ApplicationTenancy parent; @Override public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { this.parent = _Casts.uncheckedCast(parent); } - // -- CHILDREN - - @OneToMany(mappedBy = "parent") + @OneToMany(mappedBy = Children.MAPPED_BY) + @Children private Set children = new TreeSet<>(); - @Children @Override public Set getChildren() { return _Casts.uncheckedCast(children); } - public void setChildren(SortedSet children) { + public void setChildren(final Set children) { this.children = _Casts.uncheckedCast(children); } // necessary for integration tests diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java index 724ffe16c99..577daca6bfe 100644 --- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java +++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java @@ -18,10 +18,10 @@ */ package org.apache.isis.extensions.secman.jpa.user.dom; -import java.util.Locale; import java.util.Set; import java.util.TreeSet; +import javax.inject.Named; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; @@ -43,8 +43,9 @@ import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.commons.internal.base._Casts; -import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole; +import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq; import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserStatus; +import org.apache.isis.extensions.secman.jpa.role.dom.ApplicationRole; import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; import lombok.Getter; @@ -52,8 +53,8 @@ @Entity @Table( - schema = "isisExtensionsSecman", - name = "ApplicationUser", + schema = ApplicationUser.SCHEMA, + name = ApplicationUser.TABLE, uniqueConstraints = @UniqueConstraint( name = "ApplicationUser_username_UNQ", @@ -61,22 +62,22 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_USERNAME, + name = Nq.FIND_BY_USERNAME, query = "SELECT u " + " FROM ApplicationUser u " + " WHERE u.username = :username"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_EMAIL_ADDRESS, + name = Nq.FIND_BY_EMAIL_ADDRESS, query = "SELECT u " + " FROM ApplicationUser u " + " WHERE u.emailAddress = :emailAddress"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_ATPATH, + name = Nq.FIND_BY_ATPATH, query = "SELECT u " + " FROM ApplicationUser u " + " WHERE u.atPath = :atPath"), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND, + name = Nq.FIND, query = "SELECT u " + " FROM ApplicationUser u " + " WHERE u.username LIKE :regex" @@ -86,233 +87,124 @@ + " OR u.emailAddress LIKE :regex") }) @EntityListeners(IsisEntityListener.class) +@Named(ApplicationUser.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = ApplicationUser.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationUserRepository.class, - autoCompleteMethod = "findMatching" - ) + autoCompleteMethod = "findMatching") @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_ROOT ) public class ApplicationUser extends org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser { - @Id @GeneratedValue private Long id; + @Version private Long version; - // -- USERNAME - - @Column(nullable = false, length = Username.MAX_LENGTH) - private String username; - + @Column(nullable = Username.NULLABLE, length = Username.MAX_LENGTH) @Username - @Override - public String getUsername() { - return username; - } - @Override - public void setUsername(final String username) { this.username = username; } - - - // -- FAMILY NAME + @Getter @Setter + private String username; - @Column(nullable = true, length = FamilyName.MAX_LENGTH) - private String familyName; + @Column(nullable = FamilyName.NULLABLE, length = FamilyName.MAX_LENGTH) @FamilyName - @Override - public String getFamilyName() { - return familyName; - } - @Override - public void setFamilyName(final String familyName) { - this.familyName = familyName; - } - - - // -- GIVEN NAME + @Getter @Setter + private String familyName; - @Column(nullable = true, length = GivenName.MAX_LENGTH) - private String givenName; + @Column(nullable = GivenName.NULLABLE, length = GivenName.MAX_LENGTH) @GivenName - @Override - public String getGivenName() { - return givenName; - } - @Override - public void setGivenName(final String givenName) { - this.givenName = givenName; - } - - - // -- KNOWN AS + @Getter @Setter + private String givenName; - @Column(nullable = true, length = KnownAs.MAX_LENGTH) - private String knownAs; + @Column(nullable = KnownAs.NULLABLE, length = KnownAs.MAX_LENGTH) @KnownAs - @Override - public String getKnownAs() { - return knownAs; - } - @Override - public void setKnownAs(final String knownAs) { - this.knownAs = knownAs; - } - - - // -- EMAIL ADDRESS + @Getter @Setter + private String knownAs; - @Column(nullable = true, length = EmailAddress.MAX_LENGTH) - private String emailAddress; + @Column(nullable = EmailAddress.NULLABLE, length = EmailAddress.MAX_LENGTH) @EmailAddress - @Override - public String getEmailAddress() { - return emailAddress; - } - @Override - public void setEmailAddress(final String emailAddress) { - this.emailAddress = emailAddress; - } - - - // -- PHONE NUMBER + @Getter @Setter + private String emailAddress; - @Column(nullable = true, length = PhoneNumber.MAX_LENGTH) - private String phoneNumber; + @Column(nullable = PhoneNumber.NULLABLE, length = PhoneNumber.MAX_LENGTH) @PhoneNumber - @Override - public String getPhoneNumber() { - return phoneNumber; - } - @Override - public void setPhoneNumber(final String phoneNumber) { - this.phoneNumber = phoneNumber; - } - + @Getter @Setter + private String phoneNumber; - // -- FAX NUMBER - - @Column(nullable = true, length= FaxNumber.MAX_LENGTH) - private String faxNumber; + @Column(nullable = FaxNumber.NULLABLE, length= FaxNumber.MAX_LENGTH) @FaxNumber - @Override - public String getFaxNumber() { - return faxNumber; - } - @Override - public void setFaxNumber(final String faxNumber) { - this.faxNumber = faxNumber; - } + @Getter @Setter + private String faxNumber; - // -- REGIONAL SETTINGS - @UserLocale - @Column(nullable = true) + @Column(nullable = Language.NULLABLE) + @Language @Getter @Setter - private Locale language; + private java.util.Locale language; - @UserLocale - @Column(nullable = true) + @Column(nullable = NumberFormat.NULLABLE) + @NumberFormat @Getter @Setter - private Locale numberFormat; + private java.util.Locale numberFormat; - @UserLocale - @Column(nullable = true) - @Getter @Setter - private Locale timeFormat; - // -- AT PATH + @Column(nullable = TimeFormat.NULLABLE) + @TimeFormat + @Getter @Setter + private java.util.Locale timeFormat; - @Column(nullable = true) - private String atPath; + @Column(nullable = AtPath.NULLABLE, length = AtPath.MAX_LENGTH) @AtPath - @Override - public String getAtPath() { - return atPath; - } - @Override - public void setAtPath(final String atPath) { - this.atPath = atPath; - } - - - // -- ACCOUNT TYPE + @Getter @Setter + private String atPath; - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType; + @Column(nullable = AccountType.NULLABLE) @Enumerated(EnumType.STRING) @AccountType - @Override - public org.apache.isis.extensions.secman.applib.user.dom.AccountType getAccountType() { - return accountType; - } + @Getter + private org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType; @Override public void setAccountType(final org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType) { this.accountType = accountType; } - // -- STATUS - - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private ApplicationUserStatus status; - + @Column(nullable = Status.NULLABLE) @Enumerated(EnumType.STRING) @Status - @Override - public ApplicationUserStatus getStatus() { - return status; - } - @Override - public void setStatus(final ApplicationUserStatus status) { - this.status = status; - } - - - // -- ENCRYPTED PASSWORD + @Getter @Setter + private ApplicationUserStatus status; - @Column(nullable = true) - private String encryptedPassword; + @Column(nullable = EncryptedPassword.NULLABLE, length = EncryptedPassword.MAX_LENGTH) @EncryptedPassword - @Override - public String getEncryptedPassword() { - return encryptedPassword; - } - @Override - public void setEncryptedPassword(final String encryptedPassword) { - this.encryptedPassword = encryptedPassword; - } + @Getter @Setter + private String encryptedPassword; - // ROLES @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}) @JoinTable( - schema = "isisExtensionsSecman", - name = "ApplicationUserRoles", - joinColumns = {@JoinColumn(name = "userId")}, - inverseJoinColumns = {@JoinColumn(name = "roleId")}) - private Set roles = new TreeSet<>(); - + schema = ApplicationUser.SCHEMA, + name = Roles.Persistence.TABLE, + joinColumns = {@JoinColumn(name = Roles.Persistence.JOIN_COLUMN)}, + inverseJoinColumns = {@JoinColumn(name = Roles.Persistence.INVERSE_JOIN_COLUMN)}) @Roles + private Set roles = new TreeSet<>(); + @Override - public Set getRoles() { + public Set getRoles() { return _Casts.uncheckedCast(roles); } - - } diff --git a/extensions/security/session-log/adoc/modules/session-log/partials/module-nav.adoc b/extensions/security/session-log/adoc/modules/session-log/partials/module-nav.adoc deleted file mode 100644 index 62b04f529e0..00000000000 --- a/extensions/security/session-log/adoc/modules/session-log/partials/module-nav.adoc +++ /dev/null @@ -1,6 +0,0 @@ - - - -** xref:security:session-log:about.adoc[Session Log] - - diff --git a/extensions/security/session-log/adoc/antora.yml b/extensions/security/sessionlog/adoc/antora.yml similarity index 100% rename from extensions/security/session-log/adoc/antora.yml rename to extensions/security/sessionlog/adoc/antora.yml diff --git a/extensions/security/session-log/adoc/modules/session-log/nav.adoc b/extensions/security/sessionlog/adoc/modules/session-log/nav.adoc similarity index 100% rename from extensions/security/session-log/adoc/modules/session-log/nav.adoc rename to extensions/security/sessionlog/adoc/modules/session-log/nav.adoc diff --git a/extensions/security/session-log/adoc/modules/session-log/pages/about.adoc b/extensions/security/sessionlog/adoc/modules/session-log/pages/about.adoc similarity index 100% rename from extensions/security/session-log/adoc/modules/session-log/pages/about.adoc rename to extensions/security/sessionlog/adoc/modules/session-log/pages/about.adoc diff --git a/extensions/security/sessionlog/adoc/modules/session-log/partials/module-nav.adoc b/extensions/security/sessionlog/adoc/modules/session-log/partials/module-nav.adoc new file mode 100644 index 00000000000..d57e4880991 --- /dev/null +++ b/extensions/security/sessionlog/adoc/modules/session-log/partials/module-nav.adoc @@ -0,0 +1,6 @@ + + + +** xref:security:sessionlog:about.adoc[Session Log] + + diff --git a/extensions/security/sessionlog/applib/pom.xml b/extensions/security/sessionlog/applib/pom.xml new file mode 100644 index 00000000000..098fbd50972 --- /dev/null +++ b/extensions/security/sessionlog/applib/pom.xml @@ -0,0 +1,54 @@ + + + + 4.0.0 + + + org.apache.isis.extensions + isis-extensions-sessionlog + 2.0.0-SNAPSHOT + ../pom.xml + + + isis-extensions-sessionlog-applib + Apache Isis Ext - Session Log Applib + + + org.apache.isis.extensions.sessionlog.applib + org/apache/isis/extensions/sessionlog/applib + + + + + + org.apache.isis.core + isis-core-runtime + provided + + + + org.apache.isis.testing + isis-testing-integtestsupport-applib + test + + + + + diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/IsisModuleExtSessionLogApplib.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/IsisModuleExtSessionLogApplib.java new file mode 100644 index 00000000000..dd104f8901e --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/IsisModuleExtSessionLogApplib.java @@ -0,0 +1,45 @@ +package org.apache.isis.sessionlog.applib; + +import org.eclipse.persistence.logging.SessionLog; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import org.apache.isis.sessionlog.applib.app.SessionLogMenu; +import org.apache.isis.sessionlog.applib.spiimpl.SessionLogServiceDefault; +import org.apache.isis.sessionlog.applib.spiimpl.SessionLogServiceInitializer; + + +@Configuration +@Import({ + SessionLogMenu.class, + SessionLogServiceInitializer.class, + SessionLogServiceDefault.class +}) +public class IsisModuleExtSessionLogApplib { + + public static final String NAMESPACE = "isis.ext.sessionlog"; + public static final String SCHEMA = "isisExtSessionLog"; + + public abstract static class TitleUiEvent + extends org.apache.isis.applib.events.ui.TitleUiEvent { } + + public abstract static class IconUiEvent + extends org.apache.isis.applib.events.ui.IconUiEvent { } + + public abstract static class CssClassUiEvent + extends org.apache.isis.applib.events.ui.CssClassUiEvent { } + + public abstract static class LayoutUiEvent + extends org.apache.isis.applib.events.ui.LayoutUiEvent { } + + + public abstract static class ActionDomainEvent + extends org.apache.isis.applib.events.domain.ActionDomainEvent {} + + public abstract static class CollectionDomainEvent + extends org.apache.isis.applib.events.domain.CollectionDomainEvent {} + + public abstract static class PropertyDomainEvent + extends org.apache.isis.applib.events.domain.PropertyDomainEvent {} + +} diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/app/SessionLogMenu.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/app/SessionLogMenu.java new file mode 100644 index 00000000000..b9a18a071c6 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/app/SessionLogMenu.java @@ -0,0 +1,82 @@ +package org.apache.isis.sessionlog.applib.app; + +import java.util.List; + +import javax.annotation.Nullable; +import javax.inject.Inject; +import javax.inject.Named; + +import org.joda.time.LocalDate; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.BookmarkPolicy; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.DomainServiceLayout; +import org.apache.isis.applib.annotation.MemberSupport; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.sessionlog.applib.IsisModuleExtSessionLogApplib; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository; + + +/** + * This service exposes a <Sessions> menu to the secondary menu bar for searching for sessions. + */ +@DomainService(nature = NatureOfService.VIEW) +@DomainServiceLayout( + menuBar = DomainServiceLayout.MenuBar.SECONDARY, + named = "Activity" +) +@Named("isissessionlogger.SessionLoggingServiceMenu") +public class SessionLogMenu { + + public static abstract class ActionDomainEvent extends IsisModuleExtSessionLogApplib.ActionDomainEvent { } + + @Action( + domainEvent = activeSessions.ActiveEvent.class, + semantics = SemanticsOf.SAFE + ) + @ActionLayout( + bookmarking = BookmarkPolicy.AS_ROOT, + cssClassFa = "fa-bolt" + ) + public class activeSessions { + + public class ActiveEvent extends ActionDomainEvent { } + + @MemberSupport public List act() { + return sessionLogEntryRepository.findActiveSessions(); + } + } + + + + public class findSessions { + public class ActionEvent extends ActionDomainEvent { } + + @Action( + domainEvent = ActionEvent.class, + semantics = SemanticsOf.SAFE + ) + @ActionLayout( + cssClassFa = "fa-search" + ) + public List act( + final @Nullable String user, + final @Nullable LocalDate from, + final @Nullable LocalDate to) { + + if(user == null) { + return sessionLogEntryRepository.findByFromAndTo(from, to); + } else { + return sessionLogEntryRepository.findByUsernameAndFromAndTo(user, from, to); + } + } + } + + + @Inject SessionLogEntryRepository sessionLogEntryRepository; + +} diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/contributions/HasUsername_recentSessionsForUser.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/contributions/HasUsername_recentSessionsForUser.java new file mode 100644 index 00000000000..460945d1b30 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/contributions/HasUsername_recentSessionsForUser.java @@ -0,0 +1,47 @@ +package org.apache.isis.sessionlog.applib.contributions; + +import java.util.Collections; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.MemberSupport; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.mixins.security.HasUsername; +import org.apache.isis.sessionlog.applib.IsisModuleExtSessionLogApplib; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository; + +import lombok.RequiredArgsConstructor; + + +@Action( + semantics = SemanticsOf.SAFE, + domainEvent = HasUsername_recentSessionsForUser.ActionDomainEvent.class +) +@ActionLayout( + fieldSetId = "username" +) +@RequiredArgsConstructor +public class HasUsername_recentSessionsForUser { + + public static class ActionDomainEvent + extends IsisModuleExtSessionLogApplib.ActionDomainEvent { } + + private final HasUsername hasUsername; + + @MemberSupport public List act() { + if(hasUsername == null || hasUsername.getUsername() == null) { + return Collections.emptyList(); + } + return sessionLogEntryRepository.findRecentByUsername(hasUsername.getUsername()); + } + @MemberSupport public boolean hideAct() { + return hasUsername == null || hasUsername.getUsername() == null; + } + + @Inject SessionLogEntryRepository sessionLogEntryRepository; + +} diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-expired.png b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-expired.png new file mode 100644 index 00000000000..0f2baed241b Binary files /dev/null and b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-expired.png differ diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-login.png b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-login.png new file mode 100644 index 00000000000..720d7ad6996 Binary files /dev/null and b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-login.png differ diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-logout.png b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-logout.png new file mode 100644 index 00000000000..aa4a3d2d7fb Binary files /dev/null and b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-logout.png differ diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.java new file mode 100644 index 00000000000..eeae896f83a --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.java @@ -0,0 +1,371 @@ +package org.apache.isis.sessionlog.applib.dom; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.UUID; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.DomainObjectLayout; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.annotation.MemberSupport; +import org.apache.isis.applib.annotation.Optionality; +import org.apache.isis.applib.annotation.Parameter; +import org.apache.isis.applib.annotation.ParameterLayout; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.PropertyLayout; +import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.annotation.Where; +import org.apache.isis.applib.layout.component.CssClassFaPosition; +import org.apache.isis.applib.mixins.security.HasUsername; +import org.apache.isis.applib.services.factory.FactoryService; +import org.apache.isis.applib.services.session.SessionLogService; +import org.apache.isis.applib.util.ObjectContracts; +import org.apache.isis.sessionlog.applib.IsisModuleExtSessionLogApplib; + +import lombok.val; +import lombok.experimental.UtilityClass; + +@Named(SessionLogEntry.LOGICAL_TYPE_NAME) +@DomainObject( + editing = Editing.DISABLED +) +@DomainObjectLayout( + titleUiEvent = SessionLogEntry.TitleUiEvent.class, + iconUiEvent = SessionLogEntry.IconUiEvent.class, + cssClassUiEvent = SessionLogEntry.CssClassUiEvent.class, + layoutUiEvent = SessionLogEntry.LayoutUiEvent.class +) +public abstract class SessionLogEntry implements HasUsername, Comparable { + + public static final String LOGICAL_TYPE_NAME = IsisModuleExtSessionLogApplib.NAMESPACE + ".SessionLogEntry"; + public static final String SCHEMA = IsisModuleExtSessionLogApplib.SCHEMA; + public static final String TABLE = "SessionLogEntry"; + + @UtilityClass + public static class Nq { + public static final String FIND_BY_SESSION_GUID_STR = SessionLogEntry.LOGICAL_TYPE_NAME + ".findBySessionGuidStr"; + public static final String FIND_BY_HTTP_SESSION_ID = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByHttpSessionId"; + public static final String FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUsernameAndTimestampBetween"; + public static final String FIND_BY_USERNAME_AND_TIMESTAMP_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUsernameAndTimestampAfter"; + public static final String FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUsernameAndTimestampBefore"; + public static final String FIND_BY_USERNAME = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUsername"; + public static final String FIND_BY_TIMESTAMP_BETWEEN = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByTimestampBetween"; + public static final String FIND_BY_TIMESTAMP_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByTimestampAfter"; + public static final String FIND_BY_TIMESTAMP_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByTimestampBefore"; + public static final String FIND = SessionLogEntry.LOGICAL_TYPE_NAME + ".find"; + public static final String FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUsernameAndTimestampStrictlyBefore"; + public static final String FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUsernameAndTimestampStrictlyAfter"; + public static final String FIND_ACTIVE_SESSIONS = SessionLogEntry.LOGICAL_TYPE_NAME + ".findActiveSessions"; + public static final String FIND_RECENT_BY_USERNAME = SessionLogEntry.LOGICAL_TYPE_NAME + ".findRecentByUsername"; + } + + // -- UI & DOMAIN EVENTS + + public static class TitleUiEvent extends IsisModuleExtSessionLogApplib.TitleUiEvent { } + public static class IconUiEvent extends IsisModuleExtSessionLogApplib.IconUiEvent { } + public static class CssClassUiEvent extends IsisModuleExtSessionLogApplib.CssClassUiEvent { } + public static class LayoutUiEvent extends IsisModuleExtSessionLogApplib.LayoutUiEvent { } + + public static abstract class PropertyDomainEvent extends IsisModuleExtSessionLogApplib.PropertyDomainEvent { } + + public static abstract class CollectionDomainEvent extends IsisModuleExtSessionLogApplib.CollectionDomainEvent { } + + public static abstract class ActionDomainEvent extends IsisModuleExtSessionLogApplib.ActionDomainEvent { } + + + protected SessionLogEntry( + final UUID sessionGuid, + final String httpSessionId, + final String username, + final SessionLogService.CausedBy causedBy, + final Timestamp loginTimestamp) { + setSessionGuidStr(sessionGuid != null ? sessionGuid.toString() : null); + setHttpSessionId(httpSessionId); + setUsername(username); + setCausedBy(causedBy); + setLoginTimestamp(loginTimestamp); + } + + + public String title() { + + // nb: not thread-safe + // formats defined in https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html + final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + return String.format("%s: %s logged %s %s", + format.format(getLoginTimestamp()), + getUsername(), + getLogoutTimestamp() == null ? "in": "out", + getCausedBy() == SessionLogService.CausedBy.SESSION_EXPIRATION ? "(session expired)" : ""); + } + + public String cssClass() { + return "sessionLogEntry-" + iconName(); + } + + public String iconName() { + return getLogoutTimestamp() == null + ? "login" + :getCausedBy() != SessionLogService.CausedBy.SESSION_EXPIRATION + ? "logout" + : "expired"; + } + + + + @Property( + hidden = Where.EVERYWHERE + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface SessionGuidStr { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 36; // to hold UUID.randomUuid().toString() + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + @SessionGuidStr + public abstract String getSessionGuidStr(); + public abstract void setSessionGuidStr(String sessionGuidStr); + + + + @Property( + domainEvent = SessionGuid.DomainEvent.class + ) + @PropertyLayout( + fieldSetId = "Identity", + hidden = Where.PARENTED_TABLES, + sequence = "1" + ) + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface SessionGuid { + class DomainEvent extends PropertyDomainEvent {} + } + @SessionGuid + public UUID getSessionGuid() {return UUID.fromString(getSessionGuidStr());} + + + @Property( + domainEvent = HttpSessionId.DomainEvent.class + ) + @PropertyLayout( + fieldSetId = "Metadata", + hidden = Where.PARENTED_TABLES, + sequence = "2" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface HttpSessionId { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 32; + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + @HttpSessionId + public abstract String getHttpSessionId(); + public abstract void setHttpSessionId(String httpSessionId); + + + + + @Property( + domainEvent = Username.DomainEvent.class + ) + @PropertyLayout( + fieldSetId = "Who", + hidden = Where.PARENTED_TABLES, + sequence = "2" + ) + @HasUsername.Username + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface Username { + class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = HasUsername.Username.MAX_LENGTH; + boolean NULLABLE = HasUsername.Username.NULLABLE; + String ALLOWS_NULL = HasUsername.Username.ALLOWS_NULL; + } + @Username + public abstract String getUsername(); + public abstract void setUsername(String username); + + + + @Property( + domainEvent = LoginTimestamp.DomainEvent.class, + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY + ) + @PropertyLayout( + fieldSetId = "Duration", + hidden = Where.PARENTED_TABLES, + sequence = "1" + ) + @Parameter( + optionality = Optionality.MANDATORY + ) + @ParameterLayout( + named = "Login timestamp" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface LoginTimestamp { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + @LoginTimestamp + public abstract Timestamp getLoginTimestamp(); + public abstract void setLoginTimestamp(Timestamp loginTimestamp); + + + + + @Property( + domainEvent = LogoutTimestamp.DomainEvent.class, + editing = Editing.DISABLED, + optionality = Optionality.OPTIONAL + ) + @PropertyLayout( + fieldSetId = "Duration", + hidden = Where.PARENTED_TABLES, + sequence = "2" + ) + @Parameter( + optionality = Optionality.OPTIONAL + ) + @ParameterLayout( + named = "Logout timestamp" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface LogoutTimestamp { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; + } + @LogoutTimestamp + public abstract Timestamp getLogoutTimestamp(); + public abstract void setLogoutTimestamp(Timestamp logoutTimestamp); + + + + @Property( + domainEvent = CausedBy.DomainEvent.class, + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY + ) + @PropertyLayout( + fieldSetId="Details", + sequence = "2" + ) + @Parameter( + optionality = Optionality.MANDATORY + ) + @ParameterLayout( + named = "Caused by" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface CausedBy { + class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; + } + @CausedBy + public abstract SessionLogService.CausedBy getCausedBy(); + public abstract void setCausedBy(SessionLogService.CausedBy causedBy); + + + + @Action( + domainEvent = next.DomainEvent.class, + semantics = SemanticsOf.SAFE + ) + @ActionLayout( + cssClassFa = "fa-step-forward", + cssClassFaPosition = CssClassFaPosition.RIGHT + ) + public class next { + + public class DomainEvent extends ActionDomainEvent { + } + + @MemberSupport public SessionLogEntry act() { + final List after = sessionLogEntryRepository.findByUsernameAndStrictlyAfter(getUsername(), getLoginTimestamp()); + return !after.isEmpty() ? after.get(0) : SessionLogEntry.this; + } + + @MemberSupport public String disableAct() { + return act() == SessionLogEntry.this ? "None after": null; + } + + @Inject SessionLogEntryRepository sessionLogEntryRepository; + } + + + + @Action( + domainEvent = previous.DomainEvent.class, + semantics = SemanticsOf.SAFE + ) + @ActionLayout( + cssClassFa = "fa-step-backward", + cssClassFaPosition = CssClassFaPosition.RIGHT + ) + public class previous { + + public class DomainEvent extends ActionDomainEvent { + } + + @MemberSupport public SessionLogEntry act() { + final List before = sessionLogEntryRepository.findByUsernameAndStrictlyBefore(getUsername(), getLoginTimestamp()); + return !before.isEmpty() ? before.get(0) : SessionLogEntry.this; + } + + @MemberSupport public String disableAct() { + return act() == SessionLogEntry.this ? "None before": null; + } + + @Inject SessionLogEntryRepository sessionLogEntryRepository; + } + + + + private static final ObjectContracts.ObjectContract contract = + ObjectContracts.contract(SessionLogEntry.class) + .thenUse("loginTimestamp", SessionLogEntry::getLoginTimestamp) + .thenUse("username", SessionLogEntry::getUsername) + .thenUse("sessionGuid", SessionLogEntry::getSessionGuidStr) + .thenUse("httpSessionId", SessionLogEntry::getHttpSessionId) + .thenUse("logoutTimestamp", SessionLogEntry::getLogoutTimestamp) + .thenUse("causedBy", SessionLogEntry::getCausedBy) + ; + + + @Override + public String toString() { + return contract.toString(SessionLogEntry.this); + } + + @Override + public int compareTo(final SessionLogEntry other) { + return contract.compare(this,other); + } + + + +} diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.layout.fallback.xml b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.layout.fallback.xml new file mode 100644 index 00000000000..c521f6f0368 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.layout.fallback.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntryRepository.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntryRepository.java new file mode 100644 index 00000000000..1bcb4587f05 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntryRepository.java @@ -0,0 +1,190 @@ +package org.apache.isis.sessionlog.applib.dom; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import javax.inject.Inject; + +import org.joda.time.LocalDate; + +import org.apache.isis.applib.query.Query; +import org.apache.isis.applib.services.factory.FactoryService; +import org.apache.isis.applib.services.repository.RepositoryService; +import org.apache.isis.applib.services.session.SessionLogService; +import org.apache.isis.core.config.IsisConfiguration; + +import lombok.NonNull; +import lombok.val; + +/** + * Provides supporting functionality for querying {@link SessionLogEntry session log entry} entities. + */ +public abstract class SessionLogEntryRepository { + + @Inject RepositoryService repositoryService; + @Inject FactoryService factoryService; + + private final Class sessionLogEntryClass; + + protected SessionLogEntryRepository(@NonNull Class sessionLogEntryClass) { + this.sessionLogEntryClass = sessionLogEntryClass; + } + + public void logoutAllSessions(final Timestamp logoutTimestamp) { + val allSessions = repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS)); + for (val activeEntry : allSessions) { + activeEntry.setCausedBy(SessionLogService.CausedBy.RESTART); + activeEntry.setLogoutTimestamp(logoutTimestamp); + } + } + + public SessionLogEntry create( + final String username, + final UUID sessionGuid, + final String httpSessionId, + final SessionLogService.CausedBy causedBy, + final Timestamp timestamp) { + E entry = factoryService.detachedEntity(sessionLogEntryClass); + entry.setUsername(username); + entry.setSessionGuidStr(sessionGuid.toString()); + entry.setHttpSessionId(httpSessionId); + entry.setCausedBy(causedBy); + entry.setLoginTimestamp(timestamp); + return repositoryService.persistAndFlush(entry); + } + + + public Optional findBySessionGuid(final UUID sessionUuid) { + return findBySessionGuidStr(sessionUuid.toString()); + } + + + public Optional findBySessionGuidStr(final String sessionGuidStr) { + return repositoryService.firstMatch( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_SESSION_GUID_STR) + .withParameter("sessionGuidStr", sessionGuidStr)); + } + + + public Optional findByHttpSessionId(final String httpSessionId) { + return repositoryService.firstMatch( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_HTTP_SESSION_ID) + .withParameter("httpSessionId", httpSessionId)); + } + + + public List findByUsername(final String username) { + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME) + .withParameter("username", username)); + } + + + public List findByUsernameAndFromAndTo( + final String username, + final LocalDate from, + final LocalDate to) { + val fromTs = toTimestampStartOfDayWithOffset(from, 0); + val toTs = toTimestampStartOfDayWithOffset(to, 1); + + final Query query; + if(from != null) { + if(to != null) { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN) + .withParameter("username", username) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_AFTER) + .withParameter("username", username) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE) + .withParameter("username", username) + .withParameter("to", toTs); + } else { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME) + .withParameter("username", username); + } + } + return repositoryService.allMatches(query); + } + + + public List findByFromAndTo( + final LocalDate from, + final LocalDate to) { + val fromTs = toTimestampStartOfDayWithOffset(from, 0); + val toTs = toTimestampStartOfDayWithOffset(to, 1); + + final Query query; + if(from != null) { + if(to != null) { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BETWEEN) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_AFTER) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BEFORE) + .withParameter("to", toTs); + } else { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND); + } + } + return repositoryService.allMatches(query); + } + + + public List findByUsernameAndStrictlyBefore( + final String username, + final Timestamp from) { + + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_BEFORE) + .withParameter("username", username) + .withParameter("from", from)); + } + + + public List findByUsernameAndStrictlyAfter( + final String username, + final Timestamp from) { + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_AFTER) + .withParameter("username", username) + .withParameter("from", from)); + } + + + + public List findActiveSessions() { + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS)); + } + + + + public List findRecentByUsername(final String username) { + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_RECENT_BY_USERNAME) + .withParameter("username", username) + .withLimit(10)); + + } + + private static Timestamp toTimestampStartOfDayWithOffset(final LocalDate dt, final int daysOffset) { + return dt!=null + ?new Timestamp(dt.toDateTimeAtStartOfDay().plusDays(daysOffset).getMillis()) + :null; + } + +} diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceDefault.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceDefault.java new file mode 100644 index 00000000000..e7531e40b38 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceDefault.java @@ -0,0 +1,57 @@ +package org.apache.isis.sessionlog.applib.spiimpl; + +import java.sql.Timestamp; +import java.util.Date; +import java.util.Optional; +import java.util.UUID; + +import javax.annotation.PostConstruct; +import javax.annotation.Priority; +import javax.inject.Inject; +import javax.inject.Named; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.annotation.PriorityPrecedence; +import org.apache.isis.applib.services.clock.ClockService; +import org.apache.isis.applib.services.session.SessionLogService; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository; + +import lombok.RequiredArgsConstructor; +import lombok.val; +import lombok.extern.log4j.Log4j2; + +/** + * Implementation of the Isis {@link SessionLogService} creates a log + * entry to the database (the {@link SessionLogEntry} entity) each time a + * user either logs on or logs out, or if their session expires. + */ +@Service +@RequiredArgsConstructor(onConstructor_ = {@Inject}) +@Named("isis.ext.sessionlog.SessionLoggingServiceDefault") +@Priority(PriorityPrecedence.LATE) +@Qualifier("default") +@Log4j2 +public class SessionLogServiceDefault implements SessionLogService { + + final SessionLogEntryRepository sessionLogEntryRepository; + final ClockService clockService; + + @Override + public void log(final Type type, final String username, final Date date, final CausedBy causedBy, final UUID sessionGuid, final String httpSessionId) { + if (type == Type.LOGIN) { + sessionLogEntryRepository.create(username, sessionGuid, httpSessionId, causedBy, Timestamp.from(date.toInstant())); + } else { + val sessionLogEntryIfAny = sessionLogEntryRepository.findBySessionGuid(sessionGuid); + sessionLogEntryIfAny + .ifPresent(entry -> { + entry.setLogoutTimestamp(Timestamp.from(date.toInstant())); + entry.setCausedBy(causedBy); + } + ); + } + } + +} diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceInitializer.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceInitializer.java new file mode 100644 index 00000000000..47c31f3e207 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceInitializer.java @@ -0,0 +1,45 @@ +package org.apache.isis.sessionlog.applib.spiimpl; + +import java.util.Date; +import java.util.UUID; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; + +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.events.metamodel.MetamodelEvent; +import org.apache.isis.applib.events.metamodel.MetamodelListener; +import org.apache.isis.applib.services.clock.ClockService; +import org.apache.isis.applib.services.iactnlayer.InteractionService; +import org.apache.isis.applib.services.session.SessionLogService; +import org.apache.isis.core.config.IsisConfiguration; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@Component +@RequiredArgsConstructor(onConstructor_ = {@Inject}) +public class SessionLogServiceInitializer implements MetamodelListener { + + final SessionLogEntryRepository sessionLogEntryRepository; + final InteractionService interactionService; + final ClockService clockService; + final IsisConfiguration isisConfiguration; + + @Override + public void onMetamodelLoaded() { + if (!isisConfiguration.getExtensions().getSessionLog().isAutoLogoutOnRestart()) { + return; + } + + interactionService.runAnonymous(() -> { + val timestamp = clockService.getClock().nowAsJavaSqlTimestamp(); + sessionLogEntryRepository.logoutAllSessions(timestamp); + }); + } + +} diff --git a/extensions/security/sessionlog/applib/src/test/java/org/apache/isis/sessionlog/applib/SessionLogIntegTestAbstract.java b/extensions/security/sessionlog/applib/src/test/java/org/apache/isis/sessionlog/applib/SessionLogIntegTestAbstract.java new file mode 100644 index 00000000000..ad8ae82a304 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/test/java/org/apache/isis/sessionlog/applib/SessionLogIntegTestAbstract.java @@ -0,0 +1,143 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.sessionlog.applib; + +import java.sql.Timestamp; +import java.time.Duration; +import java.time.Instant; +import java.time.temporal.TemporalAmount; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.inject.Inject; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Qualifier; + +import org.apache.isis.applib.annotation.Value; +import org.apache.isis.applib.services.session.SessionLogService; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository; +import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +public abstract class SessionLogIntegTestAbstract extends IsisIntegrationTestAbstract { + + + @Value + @RequiredArgsConstructor + static class Session { + private static AtomicInteger counter = new AtomicInteger(); + @Getter final String username; + final Instant instant; + public Date getDate() { return Date.from(instant); } + UUID sessionGuid = UUID.randomUUID(); + final String httpSessionId = "http-" + counter.incrementAndGet(); + } + @BeforeEach + void setUp() { + } + + @Test + void login_and_logout() { + + List sessions; + SessionLogEntry session; + Optional sessionIfAny; + + // given + sessions = sessionLogEntryRepository.findActiveSessions(); + Assertions.assertThat(sessions).isEmpty(); + + // when + Session session1 = new Session("fred", Instant.now().minus(Duration.ofDays(2))); + + sessionLogService.log(SessionLogService.Type.LOGIN, session1.username, session1.getDate(), SessionLogService.CausedBy.USER, session1.sessionGuid, session1.httpSessionId); + + // then + sessions = sessionLogEntryRepository.findActiveSessions(); + Assertions.assertThat(sessions).hasSize(1); + session = sessions.get(0); + Assertions.assertThat(session.getSessionGuid()).isEqualTo(session1.sessionGuid); + + // when + Session session2 = new Session("mary", Instant.now().minus(Duration.ofDays(1))); + + sessionLogService.log(SessionLogService.Type.LOGIN, session2.username, session2.getDate(), SessionLogService.CausedBy.USER, session2.sessionGuid, session2.httpSessionId); + + // then + sessions = sessionLogEntryRepository.findActiveSessions(); + Assertions.assertThat(sessions).hasSize(2); + + // then + sessions = sessionLogEntryRepository.findByUsername(session1.username); + Assertions.assertThat(sessions).hasSize(1); + Assertions.assertThat(sessions.get(0)).extracting(SessionLogEntry::getUsername).isEqualTo(session1.username); + + sessionIfAny = sessionLogEntryRepository.findBySessionGuid(session2.sessionGuid); + Assertions.assertThat(sessionIfAny).isPresent(); + Assertions.assertThat(sessionIfAny).get().extracting(SessionLogEntry::getUsername).isEqualTo(session2.username); + + sessionIfAny = sessionLogEntryRepository.findBySessionGuidStr(session1.sessionGuid.toString()); + Assertions.assertThat(sessionIfAny).isPresent(); + Assertions.assertThat(sessionIfAny).get().extracting(SessionLogEntry::getUsername).isEqualTo(session1.username); + + sessions = sessionLogEntryRepository.findByUsernameAndStrictlyAfter(session1.username, Timestamp.from(session1.instant.plus(Duration.ofMillis(10)))); + Assertions.assertThat(sessions).isEmpty(); + + sessions = sessionLogEntryRepository.findByUsernameAndStrictlyAfter(session1.username, Timestamp.from(session1.instant.minus(Duration.ofMillis(10)))); + Assertions.assertThat(sessions).hasSize(1); + + sessions = sessionLogEntryRepository.findByUsernameAndStrictlyBefore(session1.username, Timestamp.from(session1.instant.minus(Duration.ofMillis(10)))); + Assertions.assertThat(sessions).isEmpty(); + + sessions = sessionLogEntryRepository.findByUsernameAndStrictlyBefore(session1.username, Timestamp.from(session1.instant.plus(Duration.ofMillis(10)))); + Assertions.assertThat(sessions).hasSize(1); + + sessions = sessionLogEntryRepository.findRecentByUsername(session1.username); + Assertions.assertThat(sessions).hasSize(1); + + // when + sessionLogService.log(SessionLogService.Type.LOGOUT, null, session1.getDate(), SessionLogService.CausedBy.USER, session1.sessionGuid, null); + + // then + sessions = sessionLogEntryRepository.findActiveSessions(); + Assertions.assertThat(sessions).hasSize(1); + Assertions.assertThat(sessions.get(0)).extracting(SessionLogEntry::getUsername).isEqualTo(session2.username); + + sessionLogService.log(SessionLogService.Type.LOGOUT, null, session2.getDate(), SessionLogService.CausedBy.USER, session2.sessionGuid, null); + + // then + sessions = sessionLogEntryRepository.findActiveSessions(); + Assertions.assertThat(sessions).isEmpty(); + + + } + + @Inject @Qualifier("default") SessionLogService sessionLogService; + @Inject SessionLogEntryRepository sessionLogEntryRepository; + +} diff --git a/extensions/security/sessionlog/persistence-jdo/log4j2-test.xml b/extensions/security/sessionlog/persistence-jdo/log4j2-test.xml new file mode 100644 index 00000000000..0ed7986e245 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/log4j2-test.xml @@ -0,0 +1,78 @@ + + + + + ???? + %xwEx + %5p + yyyy-MM-dd HH:mm:ss.SSS + %clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + %d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/security/sessionlog/persistence-jdo/logging-dn-enhance.properties b/extensions/security/sessionlog/persistence-jdo/logging-dn-enhance.properties new file mode 100644 index 00000000000..ca165acc786 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/logging-dn-enhance.properties @@ -0,0 +1,41 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# LOG4J Configuration +# =================== + +# Basic logging goes to "datanucleus.log" +log4j.appender.A1=org.apache.log4j.FileAppender +log4j.appender.A1.File=datanucleus.log +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} (%t) %-5p [%c] - %m%n +#log4j.appender.A1.Threshold=INFO + +# Categories +# Each category can be set to a "level", and to direct to an appender + +# Default to DEBUG level for all DataNucleus categories +log4j.logger.DataNucleus = DEBUG, A1 + +log4j.category.com.mchange.v2.c3p0=INFO, A1 +log4j.category.com.mchange.v2.resourcepool=INFO, A1 +log4j.category.org.logicalcobwebs.proxool=INFO,A1 + + +# Hbase libs logging +log4j.category.org.apache.hadoop=INFO,A1 +log4j.category.org.apache.zookeeper=INFO,A1 \ No newline at end of file diff --git a/extensions/security/sessionlog/persistence-jdo/pom.xml b/extensions/security/sessionlog/persistence-jdo/pom.xml new file mode 100644 index 00000000000..ea7aa4feb68 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/pom.xml @@ -0,0 +1,76 @@ + + + + 4.0.0 + + + org.apache.isis.extensions + isis-extensions-sessionlog + 2.0.0-SNAPSHOT + ../pom.xml + + + isis-extensions-sessionlog-persistence-jdo + Apache Isis Ext - Session Log Persistence (using JDO) + + + org.apache.isis.extensions.sessionlog.jdo + org/apache/isis/extensions/sessionlog/jdo + + + + + + org.apache.isis.extensions + isis-extensions-sessionlog-applib + + + + org.apache.isis.persistence + isis-persistence-jdo-datanucleus + + + + org.apache.isis.testing + isis-testing-fixtures-applib + + + + org.apache.isis.core + isis-core-runtime + provided + + + + org.apache.isis.extensions + isis-extensions-sessionlog-applib + test + test-jar + + + + org.apache.isis.testing + isis-testing-integtestsupport-applib + test + + + + + diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/META-INF/persistence.xml b/extensions/security/sessionlog/persistence-jdo/src/main/java/META-INF/persistence.xml new file mode 100644 index 00000000000..b8820bfd014 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/META-INF/persistence.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/IsisModuleExtSessionLogPersistenceJdo.java b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/IsisModuleExtSessionLogPersistenceJdo.java new file mode 100644 index 00000000000..58f44f4e2e2 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/IsisModuleExtSessionLogPersistenceJdo.java @@ -0,0 +1,41 @@ +package org.apache.isis.sessionlog.jdo; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import org.apache.isis.persistence.jdo.datanucleus.IsisModulePersistenceJdoDatanucleus; +import org.apache.isis.sessionlog.applib.IsisModuleExtSessionLogApplib; +import org.apache.isis.sessionlog.jdo.dom.SessionLogEntry; +import org.apache.isis.sessionlog.jdo.dom.SessionLogEntryRepository; +import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib; +import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript; +import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures; +import org.apache.isis.testing.fixtures.applib.teardown.jdo.TeardownFixtureJdoAbstract; + + +@Configuration +@Import({ + // modules + IsisModuleTestingFixturesApplib.class, + IsisModuleExtSessionLogApplib.class, + IsisModulePersistenceJdoDatanucleus.class, + + // services + SessionLogEntryRepository.class, + + // entities, eager meta-model introspection + SessionLogEntry.class, +}) +public class IsisModuleExtSessionLogPersistenceJdo implements ModuleWithFixtures { + + @Override + public FixtureScript getTeardownFixture() { + return new TeardownFixtureJdoAbstract() { + @Override + protected void execute(final ExecutionContext executionContext) { + deleteFrom(SessionLogEntry.class); + } + }; + } + +} diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.java b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.java new file mode 100644 index 00000000000..e1e61766823 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.java @@ -0,0 +1,175 @@ +package org.apache.isis.sessionlog.jdo.dom; + +import java.sql.Timestamp; +import java.util.UUID; + +import javax.inject.Named; +import javax.jdo.annotations.Column; +import javax.jdo.annotations.IdentityType; +import javax.jdo.annotations.PersistenceCapable; +import javax.jdo.annotations.PrimaryKey; +import javax.jdo.annotations.Queries; +import javax.jdo.annotations.Query; + +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.services.session.SessionLogService; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry.Nq; + +import lombok.Getter; +import lombok.Setter; + +@PersistenceCapable( + identityType=IdentityType.APPLICATION, + schema = SessionLogEntry.SCHEMA, + table = SessionLogEntry.TABLE) +@Queries( { + @Query( + name = Nq.FIND_BY_SESSION_GUID_STR, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE sessionGuidStr == :sessionGuidStr"), + @Query( + name = Nq.FIND_BY_HTTP_SESSION_ID, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE httpSessionId == :httpSessionId"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + "WHERE username == :username " + + "&& loginTimestamp >= :from " + + "&& logoutTimestamp <= :to " + + "ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_AFTER, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " && loginTimestamp >= :from " + + " ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " && loginTimestamp <= :from " + + " ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND_BY_TIMESTAMP_BETWEEN, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE loginTimestamp >= :from " + + " && logoutTimestamp <= :to " + + " ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND_BY_TIMESTAMP_AFTER, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE loginTimestamp >= :from " + + " ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND_BY_TIMESTAMP_BEFORE, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE loginTimestamp <= :to " + + " ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_BEFORE, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " && loginTimestamp < :from " + + " ORDER BY loginTimestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_AFTER, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " && loginTimestamp > :from " + + " ORDER BY loginTimestamp ASC"), + @Query( + name = Nq.FIND_ACTIVE_SESSIONS, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE logoutTimestamp == null " + + " ORDER BY loginTimestamp ASC"), + @Query( + name = Nq.FIND_RECENT_BY_USERNAME, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " ORDER BY loginTimestamp DESC " + + " RANGE 0,10") +}) +@Named(SessionLogEntry.LOGICAL_TYPE_NAME) +@DomainObject( + editing = Editing.DISABLED +) +public class SessionLogEntry extends org.apache.isis.sessionlog.applib.dom.SessionLogEntry { + + public static final String FQCN = "org.apache.isis.sessionlog.jdo.dom.SessionLogEntry"; + + public SessionLogEntry( + final UUID sessionGuid, + final String httpSessionId, + final String username, + final SessionLogService.CausedBy causedBy, + final Timestamp loginTimestamp) { + super(sessionGuid, httpSessionId, username, causedBy, loginTimestamp); + } + + public SessionLogEntry() { + super(null, null, null, null, null); + } + + @PrimaryKey + @Column(allowsNull = SessionGuidStr.ALLOWS_NULL, length = SessionGuidStr.MAX_LENGTH) + @SessionGuidStr + @Getter @Setter + private String sessionGuidStr; + + + @Column(allowsNull = HttpSessionId.ALLOWS_NULL, length = HttpSessionId.MAX_LENGTH) + @HttpSessionId + @Getter @Setter + private String httpSessionId; + + + @Column(allowsNull = Username.ALLOWS_NULL, length = Username.MAX_LENGTH) + @Username + @Getter @Setter + private String username; + + + @Column(allowsNull = LoginTimestamp.ALLOWS_NULL) + @LoginTimestamp + @Getter @Setter + private Timestamp loginTimestamp; + + + @Column(allowsNull = LogoutTimestamp.ALLOWS_NULL) + @LogoutTimestamp + @Getter @Setter + private Timestamp logoutTimestamp; + + + @Column(allowsNull = CausedBy.ALLOWS_NULL) + @CausedBy + @Getter @Setter + private SessionLogService.CausedBy causedBy; + + +} diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntryRepository.java b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntryRepository.java new file mode 100644 index 00000000000..163fa416274 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntryRepository.java @@ -0,0 +1,17 @@ +package org.apache.isis.sessionlog.jdo.dom; + +import java.sql.Timestamp; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.services.session.SessionLogService; + +import lombok.NonNull; + +@Service +public class SessionLogEntryRepository extends org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository { + + public SessionLogEntryRepository() { + super(SessionLogEntry.class); + } +} diff --git a/extensions/security/sessionlog/persistence-jdo/src/test/java/org/apache/isis/sessionlog/jdo/SessionLog_IntegTest.java b/extensions/security/sessionlog/persistence-jdo/src/test/java/org/apache/isis/sessionlog/jdo/SessionLog_IntegTest.java new file mode 100644 index 00000000000..0ae5371dea7 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/test/java/org/apache/isis/sessionlog/jdo/SessionLog_IntegTest.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.sessionlog.jdo; + +import javax.inject.Inject; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; +import org.springframework.test.context.ActiveProfiles; + +import org.apache.isis.core.config.presets.IsisPresets; +import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices; +import org.apache.isis.security.bypass.IsisModuleSecurityBypass; +import org.apache.isis.sessionlog.applib.SessionLogIntegTestAbstract; +import org.apache.isis.sessionlog.jdo.dom.SessionLogEntryRepository; + +import lombok.Getter; + +@SpringBootTest( + classes = SessionLog_IntegTest.AppManifest.class +) +@ActiveProfiles("test") +public class SessionLog_IntegTest extends SessionLogIntegTestAbstract { + + + @SpringBootConfiguration + @EnableAutoConfiguration + @Import({ + IsisModuleCoreRuntimeServices.class, + IsisModuleSecurityBypass.class, + IsisModuleExtSessionLogPersistenceJdo.class, + }) + @PropertySources({ + @PropertySource(IsisPresets.UseLog4j2Test), + }) + public static class AppManifest { + } + + +} diff --git a/extensions/security/sessionlog/persistence-jdo/src/test/resources/application-test.yml b/extensions/security/sessionlog/persistence-jdo/src/test/resources/application-test.yml new file mode 100644 index 00000000000..7300d775846 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/test/resources/application-test.yml @@ -0,0 +1,26 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +isis: + persistence: + schema: + auto-create-schemas: "ISISEXTSESSIONLOG" + + +datanucleus: + schema: + generate-database: + mode: "create" diff --git a/extensions/security/sessionlog/persistence-jpa/log4j2-test.xml b/extensions/security/sessionlog/persistence-jpa/log4j2-test.xml new file mode 100644 index 00000000000..0ed7986e245 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/log4j2-test.xml @@ -0,0 +1,78 @@ + + + + + ???? + %xwEx + %5p + yyyy-MM-dd HH:mm:ss.SSS + %clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + %d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/security/sessionlog/persistence-jpa/pom.xml b/extensions/security/sessionlog/persistence-jpa/pom.xml new file mode 100644 index 00000000000..0b974455446 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/pom.xml @@ -0,0 +1,82 @@ + + + + 4.0.0 + + + org.apache.isis.extensions + isis-extensions-sessionlog + 2.0.0-SNAPSHOT + ../pom.xml + + + isis-extensions-sessionlog-persistence-jpa + Apache Isis Ext - Session Log Persistence (using JPA) + + + org.apache.isis.extensions.sessionlog.jpa + org/apache/isis/extensions/sessionlog/jpa + + + + + + org.apache.isis.extensions + isis-extensions-sessionlog-applib + + + + org.apache.isis.persistence + isis-persistence-jpa-eclipselink + + + + org.apache.isis.testing + isis-testing-fixtures-applib + + + org.apache.isis.persistence + isis-persistence-jdo-applib + + + + + + org.apache.isis.core + isis-core-runtime + provided + + + + org.apache.isis.extensions + isis-extensions-sessionlog-applib + test + test-jar + + + + org.apache.isis.testing + isis-testing-integtestsupport-applib + test + + + + + diff --git a/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/IsisModuleExtSessionLogPersistenceJpa.java b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/IsisModuleExtSessionLogPersistenceJpa.java new file mode 100644 index 00000000000..d1fed23d91f --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/IsisModuleExtSessionLogPersistenceJpa.java @@ -0,0 +1,45 @@ +package org.apache.isis.sessionlog.jpa; + +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import org.apache.isis.persistence.jpa.eclipselink.IsisModulePersistenceJpaEclipselink; +import org.apache.isis.sessionlog.applib.IsisModuleExtSessionLogApplib; +import org.apache.isis.sessionlog.jpa.dom.SessionLogEntry; +import org.apache.isis.sessionlog.jpa.dom.SessionLogEntryRepository; +import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib; +import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript; +import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures; +import org.apache.isis.testing.fixtures.applib.teardown.jdo.TeardownFixtureJdoAbstract; + + +@Configuration +@Import({ + // modules + IsisModuleTestingFixturesApplib.class, + IsisModuleExtSessionLogApplib.class, + IsisModulePersistenceJpaEclipselink.class, + + // services + SessionLogEntryRepository.class, + + // entities, eager meta-model introspection + SessionLogEntry.class, +}) +@EntityScan(basePackageClasses = { + SessionLogEntry.class, +}) +public class IsisModuleExtSessionLogPersistenceJpa implements ModuleWithFixtures { + + @Override + public FixtureScript getTeardownFixture() { + return new TeardownFixtureJdoAbstract() { + @Override + protected void execute(final ExecutionContext executionContext) { + deleteFrom(SessionLogEntry.class); + } + }; + } + +} diff --git a/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntry.java b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntry.java new file mode 100644 index 00000000000..181ebf8e2d6 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntry.java @@ -0,0 +1,178 @@ +package org.apache.isis.sessionlog.jpa.dom; + +import java.sql.Timestamp; +import java.util.UUID; + +import javax.inject.Named; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.Id; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; + +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.services.session.SessionLogService; +import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry.Nq; + +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table( + schema = SessionLogEntry.SCHEMA, + name = SessionLogEntry.TABLE +) +@NamedQueries( { + @NamedQuery( + name = Nq.FIND_BY_SESSION_GUID_STR, + query = "SELECT e " + + " FROM SessionLogEntry e " + + " WHERE e.sessionGuidStr = :sessionGuidStr"), + @NamedQuery( + name = Nq.FIND_BY_HTTP_SESSION_ID, + query = "SELECT e " + + " FROM SessionLogEntry e " + + " WHERE e.httpSessionId = :httpSessionId"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.username = :username " + + " AND e.loginTimestamp >= :from " + + " AND e.logoutTimestamp <= :to " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_AFTER, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.username = :username " + + " AND e.loginTimestamp >= :from " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.username = :username " + + " AND e.loginTimestamp <= :from " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.username = :username " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TIMESTAMP_BETWEEN, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.loginTimestamp >= :from " + + " AND e.logoutTimestamp <= :to " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TIMESTAMP_AFTER, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.loginTimestamp >= :from " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_TIMESTAMP_BEFORE, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.loginTimestamp <= :to " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_BEFORE, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.username = :username " + + " AND e.loginTimestamp < :from " + + " ORDER BY e.loginTimestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_AFTER, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.username = :username " + + " AND e.loginTimestamp > :from " + + " ORDER BY e.loginTimestamp ASC"), + @NamedQuery( + name = Nq.FIND_ACTIVE_SESSIONS, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.logoutTimestamp IS null " + + " ORDER BY e.loginTimestamp ASC"), + @NamedQuery( + name = Nq.FIND_RECENT_BY_USERNAME, + query = "SELECT e" + + " FROM SessionLogEntry e " + + " WHERE e.username = :username " + + " ORDER BY e.loginTimestamp DESC " + /*+ " LIMIT 0,10"*/) // instead use withRange on the Query.named(...) object in the repo. +}) +@EntityListeners(IsisEntityListener.class) +@Named(SessionLogEntry.LOGICAL_TYPE_NAME) +@DomainObject( + editing = Editing.DISABLED +) +public class SessionLogEntry extends org.apache.isis.sessionlog.applib.dom.SessionLogEntry { + + public SessionLogEntry( + final UUID sessionGuid, + final String httpSessionId, + final String username, + final SessionLogService.CausedBy causedBy, + final Timestamp loginTimestamp) { + super(sessionGuid, httpSessionId, username, causedBy, loginTimestamp); + } + + public SessionLogEntry() { + super(null, null, null, null, null); + } + + + @Id + @Column(nullable = SessionGuidStr.NULLABLE, length = SessionGuidStr.MAX_LENGTH) + @SessionGuidStr + @Getter @Setter + private String sessionGuidStr; + + + @Column(nullable = HttpSessionId.NULLABLE, length = HttpSessionId.MAX_LENGTH) + @HttpSessionId + @Getter @Setter + private String httpSessionId; + + + @Column(nullable = Username.NULLABLE, length = Username.MAX_LENGTH) + @Username + @Getter @Setter + private String username; + + + @Column(nullable = LoginTimestamp.NULLABLE) + @LoginTimestamp + @Getter @Setter + private Timestamp loginTimestamp; + + + @Column(nullable = LogoutTimestamp.NULLABLE) + @LogoutTimestamp + @Getter @Setter + private Timestamp logoutTimestamp; + + + @Column(nullable = CausedBy.NULLABLE) + @CausedBy + @Getter @Setter + private SessionLogService.CausedBy causedBy; + + +} diff --git a/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntryRepository.java b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntryRepository.java new file mode 100644 index 00000000000..dcc1e2add27 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntryRepository.java @@ -0,0 +1,17 @@ +package org.apache.isis.sessionlog.jpa.dom; + +import java.sql.Timestamp; + +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.services.session.SessionLogService; + +import lombok.NonNull; + +@Service +public class SessionLogEntryRepository extends org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository { + + public SessionLogEntryRepository() { + super(SessionLogEntry.class); + } +} diff --git a/extensions/security/sessionlog/persistence-jpa/src/test/java/org/apache/isis/sessionlog/jpa/SessionLog_IntegTest.java b/extensions/security/sessionlog/persistence-jpa/src/test/java/org/apache/isis/sessionlog/jpa/SessionLog_IntegTest.java new file mode 100644 index 00000000000..f10ee7b58fb --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/src/test/java/org/apache/isis/sessionlog/jpa/SessionLog_IntegTest.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.sessionlog.jpa; + +import javax.inject.Inject; + +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; +import org.springframework.test.context.ActiveProfiles; + +import org.apache.isis.core.config.presets.IsisPresets; +import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices; +import org.apache.isis.security.bypass.IsisModuleSecurityBypass; +import org.apache.isis.sessionlog.applib.SessionLogIntegTestAbstract; +import org.apache.isis.sessionlog.jpa.dom.SessionLogEntryRepository; + +import lombok.Getter; + +@SpringBootTest( + classes = SessionLog_IntegTest.AppManifest.class +) +@ActiveProfiles("test") +public class SessionLog_IntegTest extends SessionLogIntegTestAbstract { + + + @SpringBootConfiguration + @EnableAutoConfiguration + @Import({ + IsisModuleCoreRuntimeServices.class, + IsisModuleSecurityBypass.class, + IsisModuleExtSessionLogPersistenceJpa.class, + }) + @PropertySources({ + @PropertySource(IsisPresets.UseLog4j2Test), + }) + public static class AppManifest { + } + + +} diff --git a/extensions/security/sessionlog/persistence-jpa/src/test/resources/application-test.yml b/extensions/security/sessionlog/persistence-jpa/src/test/resources/application-test.yml new file mode 100644 index 00000000000..22324a031a0 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/src/test/resources/application-test.yml @@ -0,0 +1,29 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +isis: + persistence: + schema: + auto-create-schemas: "ISISEXTSESSIONLOG" + + extensions: + session-log: + auto-logout-on-restart: false + +spring: + jpa: + show-sql: true + diff --git a/extensions/security/sessionlog/pom.xml b/extensions/security/sessionlog/pom.xml new file mode 100644 index 00000000000..a3bcbea4e0f --- /dev/null +++ b/extensions/security/sessionlog/pom.xml @@ -0,0 +1,92 @@ + + + + 4.0.0 + + + org.apache.isis.extensions + isis-extensions + 2.0.0-SNAPSHOT + ../../pom.xml + + + isis-extensions-sessionlog + Apache Isis Ext - Session Log + + pom + + + org.apache.isis.extensions.sessionlog + org/apache/isis/extensions/sessionlog + + + + + + org.apache.isis.extensions + isis-extensions-sessionlog-applib + 2.0.0-SNAPSHOT + + + org.apache.isis.extensions + isis-extensions-sessionlog-applib + 2.0.0-SNAPSHOT + test + test-jar + + + + org.apache.isis.extensions + isis-extensions-sessionlog-persistence-jpa + 2.0.0-SNAPSHOT + + + + org.apache.isis.extensions + isis-extensions-sessionlog-persistence-jdo + 2.0.0-SNAPSHOT + + + + org.apache.isis.testing + isis-testing-integtestsupport + 2.0.0-SNAPSHOT + pom + import + + + + + + + + + org.apache.isis.core + isis-core-metamodel + + + + + + applib + persistence-jdo + persistence-jpa + + diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEvent.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEvent.java index d859ec0ce70..adb926c9d82 100644 --- a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEvent.java +++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEvent.java @@ -24,6 +24,7 @@ import java.time.ZoneId; import java.time.ZonedDateTime; +import javax.inject.Named; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @@ -44,8 +45,8 @@ * @since 2.0 {@index} * @apiNote implements Comparable based on epochMillis */ -@org.apache.isis.applib.annotation.Value( - logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.CalendarEvent") +@Named(IsisModuleApplib.NAMESPACE + ".value.CalendarEvent") +@org.apache.isis.applib.annotation.Value @XmlJavaTypeAdapter(CalendarEvent.JaxbAdapter.class) @Getter @With @ToString @EqualsAndHashCode diff --git a/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/E1.java b/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/E1.java index 04650ac93ba..e532b2c30a7 100644 --- a/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/E1.java +++ b/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/E1.java @@ -18,14 +18,20 @@ */ package org.apache.isis.viewer.graphql.viewer.source.gqltestdomain; -import lombok.Getter; -import lombok.Setter; +import javax.inject.Named; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; +import javax.persistence.Table; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; import org.apache.isis.applib.annotation.Property; -import org.springframework.context.annotation.Profile; -import javax.persistence.*; +import lombok.Getter; +import lombok.Setter; //@Profile("demo-jpa") @Entity @@ -33,7 +39,8 @@ schema = "public", name = "E1" ) -@DomainObject(nature = Nature.ENTITY, logicalTypeName = "gqltestdomain.E1") +@Named("gqltestdomain.E1") +@DomainObject(nature = Nature.ENTITY) public class E1 implements TestEntity, Comparable { @Id @@ -50,7 +57,7 @@ public class E1 implements TestEntity, Comparable { private E2 e2; @Override - public int compareTo(Object o) { + public int compareTo(final Object o) { E1 e1 = (E1) o; return this.getName().compareTo(e1.getName()); } diff --git a/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/E2.java b/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/E2.java index c63f58fdbe1..91341c6590c 100644 --- a/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/E2.java +++ b/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/E2.java @@ -18,23 +18,40 @@ */ package org.apache.isis.viewer.graphql.viewer.source.gqltestdomain; -import lombok.Getter; -import lombok.Setter; -import org.apache.isis.applib.annotation.*; - -import javax.inject.Inject; -import javax.persistence.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import javax.inject.Inject; +import javax.inject.Named; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.Collection; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Nature; +import org.apache.isis.applib.annotation.Property; +import org.apache.isis.applib.annotation.SemanticsOf; + +import lombok.Getter; +import lombok.Setter; + //@Profile("demo-jpa") @Entity @Table( schema = "public", name = "E2" ) -@DomainObject(nature = Nature.ENTITY, logicalTypeName = "gqltestdomain.E2") +@Named("gqltestdomain.E2") +@DomainObject(nature = Nature.ENTITY) public class E2 implements TestEntity{ @Id diff --git a/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/GQLTestDomainMenu.java b/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/GQLTestDomainMenu.java index 7877b7d172e..1f940b7800e 100644 --- a/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/GQLTestDomainMenu.java +++ b/incubator/viewers/graphql/viewer/src/test/java/org/apache/isis/viewer/graphql/viewer/source/gqltestdomain/GQLTestDomainMenu.java @@ -18,17 +18,24 @@ */ package org.apache.isis.viewer.graphql.viewer.source.gqltestdomain; -import lombok.RequiredArgsConstructor; -import org.apache.isis.applib.annotation.*; -import org.springframework.lang.Nullable; +import java.util.List; import javax.inject.Inject; -import java.util.List; +import javax.inject.Named; + +import org.springframework.lang.Nullable; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.NatureOfService; +import org.apache.isis.applib.annotation.PriorityPrecedence; +import org.apache.isis.applib.annotation.SemanticsOf; + +import lombok.RequiredArgsConstructor; +@Named("gqltestdomain.GQLTestDomainMenu") @DomainService( - nature=NatureOfService.VIEW, - logicalTypeName = "gqltestdomain.GQLTestDomainMenu" -) + nature=NatureOfService.VIEW) @javax.annotation.Priority(PriorityPrecedence.EARLY) @RequiredArgsConstructor(onConstructor_ = {@Inject}) public class GQLTestDomainMenu { diff --git a/isis-tooling.yml b/isis-tooling.yml index 752f7d80d5a..988cb1dbbd2 100644 --- a/isis-tooling.yml +++ b/isis-tooling.yml @@ -55,13 +55,13 @@ commands: Extensions: org.apache.isis.extensions "Applib: Excel": "org.apache.isis.extensions:isis-extensions-excel.*" - "Core: Command Log": "org.apache.isis.extensions:isis-extensions-command-log.*" - "Core: Command Replay": "org.apache.isis.extensions:isis-extensions-command-replay.*" + "Core: Command Log": "org.apache.isis.extensions:isis-extensions-commandlog.*" + "Core: Command Replay": "org.apache.isis.extensions:isis-extensions-commandreplay.*" #"Core: Flyway": "org.apache.isis.extensions:isis-extensions-flyway.*" "Core: Quartz": "org.apache.isis.extensions:isis-extensions-quartz.*" - #"Security: Audit Trail": "org.apache.isis.security:isis-extensions-audit-trail.*" + #"Security: Audit Trail": "org.apache.isis.security:isis-extensions-audittrail.*" "Security: Secman": "org.apache.isis.security:isis-extensions-secman.*" - #"Security: Session Log": "org.apache.isis.security:isis-extensions-session-log.*" + #"Security: Session Log": "org.apache.isis.security:isis-extensions-sessionlog.*" "Security: Shiro LDAP Realm": "org.apache.isis.security:isis-extensions-shiro-realm-ldap.*" "RO Viewer: CORS": "org.apache.isis.security:isis-extensions-cors.*" "Wicket Viewer: Excel Download": "org.apache.isis.security:isis-extensions-exceldownload.*" diff --git a/persistence/jdo/adoc/modules/ROOT/pages/hints-and-tips/jdoql-and-timestamps.adoc b/persistence/jdo/adoc/modules/ROOT/pages/hints-and-tips/jdoql-and-timestamps.adoc index ba667fae9fd..733105e4e21 100644 --- a/persistence/jdo/adoc/modules/ROOT/pages/hints-and-tips/jdoql-and-timestamps.adoc +++ b/persistence/jdo/adoc/modules/ROOT/pages/hints-and-tips/jdoql-and-timestamps.adoc @@ -6,7 +6,7 @@ Beware of entities with a property called "timestamp": you run the risk of "timestamp" being treated as a keyword in certain contexts, probably not as you intended. -By way of example, the xref:userguide:command-log:about.adoc[Command Log] module has an entity called `CommandJdo`. +By way of example, the xref:userguide:commandlog:about.adoc[Command Log] module has an entity called `CommandJdo`. This has a property called "timestamp", of type `java.sql.Timestamp`. This defines a query using JDOQL: diff --git a/persistence/jdo/adoc/modules/ROOT/pages/hints-and-tips/overriding-jdo-annotations.adoc b/persistence/jdo/adoc/modules/ROOT/pages/hints-and-tips/overriding-jdo-annotations.adoc index 3093b0ea97e..044fade10d8 100644 --- a/persistence/jdo/adoc/modules/ROOT/pages/hints-and-tips/overriding-jdo-annotations.adoc +++ b/persistence/jdo/adoc/modules/ROOT/pages/hints-and-tips/overriding-jdo-annotations.adoc @@ -28,7 +28,7 @@ The second approach (using an `.orm` file) is therefore often more useful than t A typical use case is to change the database schema for an entity. For example, various extension modules use schemas for each entity. -For example, the `AuditEntry` entity in the xref:security:audit-trail:about.adoc[audit trail] security module is annotated as: +For example, the `AuditEntry` entity in the xref:security:audittrail:about.adoc[audit trail] security module is annotated as: [source,java] ---- diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.java index 1d175f5c6aa..afa048be131 100644 --- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.java +++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.java @@ -222,7 +222,7 @@ private static void notifyJdoEntityDiscoveryListeners( if(_NullSafe.isEmpty(jdoEntityTypes)) { return; } - val jdoEntityTypesView = Collections.unmodifiableSet(jdoEntityTypes); + val jdoEntityTypesView = Collections.unmodifiableSet(jdoEntityTypes.keySet()); val dnProps = Collections.unmodifiableMap(dnSettings.getAsProperties()); jdoEntityDiscoveryListeners .forEach(listener-> @@ -266,7 +266,7 @@ private static PersistenceUnitMetaData createDefaultPersistenceUnit ( val pumd = new PersistenceUnitMetaData( "dynamic-unit", "RESOURCE_LOCAL", null); pumd.setExcludeUnlistedClasses(false); - beanTypeRegistry.getEntityTypes().stream() + beanTypeRegistry.getEntityTypes().keySet().stream() .map(Class::getName) .forEach(pumd::addClassName); return pumd; diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/beans/JdoBeanTypeClassifier.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/beans/JdoBeanTypeClassifier.java index 3ab9dc548f2..fcfc76e2434 100644 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/beans/JdoBeanTypeClassifier.java +++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/beans/JdoBeanTypeClassifier.java @@ -22,10 +22,11 @@ import javax.jdo.annotations.EmbeddedOnly; -import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.services.metamodel.BeanSort; import org.apache.isis.commons.internal.base._Strings; import org.apache.isis.commons.internal.reflection._Annotations; +import org.apache.isis.core.config.beans.IsisBeanMetaData; import org.apache.isis.core.config.beans.IsisBeanTypeClassifier; import lombok.val; @@ -37,10 +38,10 @@ public class JdoBeanTypeClassifier implements IsisBeanTypeClassifier { @Override - public BeanClassification classify( - final Class type) { + public IsisBeanMetaData classify(final Class type) { - val persistenceCapableAnnot = _Annotations.synthesize(type, javax.jdo.annotations.PersistenceCapable.class); + val persistenceCapableAnnot = _Annotations + .synthesize(type, javax.jdo.annotations.PersistenceCapable.class); if(persistenceCapableAnnot.isPresent()) { val embeddedOnlyAttribute = persistenceCapableAnnot.get().embeddedOnly(); @@ -52,36 +53,30 @@ public BeanClassification classify( return null; // don't categorize as entity ... fall through in the caller's logic } - String logicalTypeName = null; + var logicalType = LogicalType.infer(type); - val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null); - if(aDomainObject!=null) { - logicalTypeName = aDomainObject.logicalTypeName(); - } - - // don't trample over the @DomainObject(logicalTypeName=..) if present - if(_Strings.isEmpty(logicalTypeName)) { + // don't trample over the @Named(=...) if present + if(logicalType.getLogicalTypeName().equals(type.getName())) { val schema = persistenceCapableAnnot.get().schema(); if(_Strings.isNotEmpty(schema)) { val table = persistenceCapableAnnot.get().table(); - logicalTypeName = String.format("%s.%s", schema.toLowerCase(Locale.ROOT), + val logicalTypeName = String.format("%s.%s", + schema.toLowerCase(Locale.ROOT), _Strings.isNotEmpty(table) ? table : type.getSimpleName()); - } - } + logicalType = LogicalType.eager(type, logicalTypeName); - if(_Strings.isNotEmpty(logicalTypeName)) { - BeanClassification.selfManaged( - BeanSort.ENTITY, logicalTypeName); + } } - return BeanClassification.selfManaged(BeanSort.ENTITY); + + return IsisBeanMetaData.isisManaged(BeanSort.ENTITY, logicalType); } - return null; // we don't feel responsible to classify given type + return null; // we don't see fit to classify given type } diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java deleted file mode 100644 index 25799cef8be..00000000000 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator; - -import javax.inject.Inject; -import javax.jdo.annotations.Discriminator; - -import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.commons.internal.base._Strings; -import org.apache.isis.core.metamodel.context.MetaModelContext; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facetapi.FacetUtil; -import org.apache.isis.core.metamodel.facetapi.FeatureType; -import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; -import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.classname.LogicalTypeFacetFromClassName; -import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorRegistry; -import org.apache.isis.persistence.jdo.provider.entities.JdoFacetContext; - -import lombok.val; - -public class JdoDiscriminatorAnnotationFacetFactory -extends FacetFactoryAbstract -implements ObjectTypeFacetFactory { - - private final ClassSubstitutorRegistry classSubstitutorRegistry; - private final JdoFacetContext jdoFacetContext; - - @Inject - public JdoDiscriminatorAnnotationFacetFactory( - final MetaModelContext mmc, - final JdoFacetContext jdoFacetContext, - final ClassSubstitutorRegistry classSubstitutorRegistry) { - super(mmc, FeatureType.OBJECTS_ONLY); - this.jdoFacetContext = jdoFacetContext; - this.classSubstitutorRegistry = classSubstitutorRegistry; - } - - @Override - public void process(final ProcessObjectTypeContext processClassContext) { - - // only applies to JDO entities; ignore any view models - final Class cls = processClassContext.getCls(); - if(!jdoFacetContext.isPersistenceEnhanced(cls)) { - return; - } - - final Discriminator annotation = processClassContext.synthesizeOnType(Discriminator.class).orElse(null); - if (annotation == null) { - return; - } - final FacetHolder facetHolder = processClassContext.getFacetHolder(); - - final String annotationValue = annotation.value(); - final LogicalTypeFacet logicalTypeFacet; // non-null - if (!_Strings.isNullOrEmpty(annotationValue)) { - logicalTypeFacet = new LogicalTypeFacetFromJdoDiscriminatorValueAnnotation( - LogicalType.eager(cls, annotationValue), - facetHolder); - } else { - val substitute = classSubstitutorRegistry.getSubstitution(cls); - if(substitute.isNeverIntrospect()) { - return; - } - - val substituted = substitute.apply(cls); - logicalTypeFacet = new LogicalTypeFacetFromClassName( - LogicalType.eager(substituted, substituted.getCanonicalName()), - facetHolder); - - } - FacetUtil.addFacet(logicalTypeFacet); - } - - - @Override - public void process(final ProcessClassContext processClassContext) { - - // only applies to JDO entities; ignore any view models - final Class cls = processClassContext.getCls(); - if(!jdoFacetContext.isPersistenceEnhanced(cls)) { - return; - } - - final Discriminator annotation = processClassContext.synthesizeOnType(Discriminator.class).orElse(null); - if (annotation == null) { - return; - } - String annotationValueAttribute = annotation.value(); - final FacetHolder facetHolder = processClassContext.getFacetHolder(); - FacetUtil.addFacet(new JdoDiscriminatorFacetDefault(annotationValueAttribute, facetHolder)); - } - -} diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorFacetDefault.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorFacetDefault.java deleted file mode 100644 index 0fb5eb6cef8..00000000000 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorFacetDefault.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator; - -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract; -import org.apache.isis.persistence.jdo.provider.metamodel.facets.object.discriminator.JdoDiscriminatorFacet; - -public class JdoDiscriminatorFacetDefault extends SingleValueFacetAbstract implements JdoDiscriminatorFacet { - - public JdoDiscriminatorFacetDefault(String value, FacetHolder holder) { - super(JdoDiscriminatorFacet.class, value, holder); - } - -} diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/package-info.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/package-info.java deleted file mode 100644 index 4533006f177..00000000000 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/package-info.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator; \ No newline at end of file diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetFromJdoPersistenceCapableFacet.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetFromJdoPersistenceCapableFacet.java deleted file mode 100644 index 9348df7713a..00000000000 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetFromJdoPersistenceCapableFacet.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.persistence.jdo.metamodel.facets.object.domainobject.objectspecid; - -import java.util.Locale; -import java.util.Optional; - -import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.commons.internal.base._Strings; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; -import org.apache.isis.persistence.jdo.provider.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet; - -public class LogicalTypeFacetFromJdoPersistenceCapableFacet -extends LogicalTypeFacetAbstract { - - public static Optional create( - final JdoPersistenceCapableFacet persistenceCapableFacet, - final Class correspondingClass, - final FacetHolder holder) { - - if(persistenceCapableFacet.getPrecedence().isFallback()) { - return Optional.empty(); - } - final String schema = persistenceCapableFacet.getSchema(); - if(_Strings.isNullOrEmpty(schema)) { - return Optional.empty(); - } - final String logicalTypeName = - schema.toLowerCase(Locale.ROOT) + "." + persistenceCapableFacet.getTable(); - return Optional.of(new LogicalTypeFacetFromJdoPersistenceCapableFacet( - LogicalType.eager(correspondingClass, logicalTypeName), - holder)); - } - - private LogicalTypeFacetFromJdoPersistenceCapableFacet( - final LogicalType logicalType, - final FacetHolder holder) { - super(logicalType, holder, Precedence.INFERRED); - } -} diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetFactory.java index e3904db5ff3..70b0254c4ed 100644 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetFactory.java +++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetFactory.java @@ -31,7 +31,6 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory; import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory; -import org.apache.isis.persistence.jdo.metamodel.facets.object.domainobject.objectspecid.LogicalTypeFacetFromJdoPersistenceCapableFacet; import org.apache.isis.persistence.jdo.provider.entities.JdoFacetContext; import lombok.val; @@ -86,10 +85,6 @@ private boolean processJdoAnnotations(final ProcessObjectTypeContext processClas .createUsingJdo(persistenceCapableIfAny, embeddedOnlyIfAny, cls, facetHolder)) .map(jdoPersistenceCapableFacet->{ - FacetUtil.addFacetIfPresent( - LogicalTypeFacetFromJdoPersistenceCapableFacet - .create(jdoPersistenceCapableFacet, cls, facetHolder)); - FacetUtil.addFacet( jdoFacetContext.createEntityFacet(facetHolder)); @@ -115,10 +110,6 @@ private void processJpaAnnotations(final ProcessObjectTypeContext processClassCo .createUsingJpa(entityIfAny, tableIfAny, cls, facetHolder)) .ifPresent(jdoPersistenceCapableFacet->{ - FacetUtil.addFacetIfPresent( - LogicalTypeFacetFromJdoPersistenceCapableFacet - .create(jdoPersistenceCapableFacet, cls, facetHolder)); - FacetUtil.addFacet( jdoFacetContext.createEntityFacet(facetHolder)); diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/MetaModelVisitingValidatorForClauseAbstract.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/MetaModelVisitingValidatorForClauseAbstract.java index 5b3e1248941..b2f03464c21 100644 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/MetaModelVisitingValidatorForClauseAbstract.java +++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/query/MetaModelVisitingValidatorForClauseAbstract.java @@ -46,7 +46,7 @@ protected MetaModelVisitingValidatorForClauseAbstract( @Override public void validate(final ObjectSpecification objectSpec) { - if(objectSpec.isManagedBean()) { + if(objectSpec.isInjectable()) { return; } diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java deleted file mode 100644 index f9cda31e99c..00000000000 --- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator; - -import javax.jdo.annotations.Discriminator; -import javax.jdo.annotations.PersistenceCapable; - -import org.apache.isis.core.metamodel.facetapi.Facet; -import org.apache.isis.core.metamodel.facetapi.FeatureType; -import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext; -import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; -import org.apache.isis.persistence.jdo.metamodel.testing.AbstractFacetFactoryTest; -import org.apache.isis.persistence.jdo.provider.metamodel.facets.object.discriminator.JdoDiscriminatorFacet; - -import lombok.val; - -public class GivenJdoDiscriminatorAnnotationFacetFactoryTest extends AbstractFacetFactoryTest { - - private JdoDiscriminatorAnnotationFacetFactory facetFactory; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - facetFactory = new JdoDiscriminatorAnnotationFacetFactory(metaModelContext, jdoFacetContext, null); - } - - @Override - protected void tearDown() throws Exception { - facetFactory = null; - super.tearDown(); - } - - public void testFeatureTypes() { - val featureTypes = facetFactory.getFeatureTypes(); - assertTrue(contains(featureTypes, FeatureType.OBJECT)); - assertFalse(contains(featureTypes, FeatureType.PROPERTY)); - assertFalse(contains(featureTypes, FeatureType.COLLECTION)); - assertFalse(contains(featureTypes, FeatureType.ACTION)); - assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER_SCALAR)); - } - - public void testDiscriminatorValueAnnotationPickedUpOnClass() { - @Discriminator("CUS") - abstract class Customer { - } - - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, methodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(JdoDiscriminatorFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof JdoDiscriminatorFacetDefault); - } - - public void testObjectTypeAnnotationPickedUpOnClass() { - @Discriminator("CUS") - abstract class Customer { - } - - facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(Customer.class, facetHolder)); - - final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class); - assertNotNull(facet); - assertTrue(facet instanceof LogicalTypeFacetFromJdoDiscriminatorValueAnnotation); - } - - public void testIfNoEntityAnnotationThenNoFacet() { - - abstract class Customer { - } - - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, methodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class); - assertNull(facet); - } - - public void testAnnotationValue() { - @Discriminator("CUS") - abstract class Customer { - } - - facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(Customer.class, facetHolder)); - - final LogicalTypeFacet discriminatorValueFacet = facetHolder.getFacet(LogicalTypeFacet.class); - assertEquals("CUS", discriminatorValueFacet.value()); - } - - public void testNoMethodsRemoved() { - @PersistenceCapable - abstract class Customer { - } - - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, methodRemover, facetHolder)); - - assertNoMethodsRemoved(); - } -} diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java deleted file mode 100644 index 03646a696e3..00000000000 --- a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.persistence.jpa.metamodel.object.domainobject.objectspecid; - -import java.util.Locale; -import java.util.Optional; - -import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.commons.internal.base._Strings; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; -import org.apache.isis.persistence.jpa.metamodel.object.table.JpaTableFacetAnnotation; - -public class LogicalTypeFacetForTableAnnotation -extends LogicalTypeFacetAbstract { - - public static Optional create( - final JpaTableFacetAnnotation tableFacet, - final Class correspondingClass, - final FacetHolder holder) { - - if(tableFacet.getPrecedence().isFallback()) { - return Optional.empty(); - } - final String schema = tableFacet.getSchema(); - if(_Strings.isNullOrEmpty(schema)) { - return Optional.empty(); - } - final String logicalTypeName = schema.toLowerCase(Locale.ROOT) + "." + tableFacet.getTable(); - return Optional.of( - new LogicalTypeFacetForTableAnnotation( - LogicalType.eager(correspondingClass, logicalTypeName), holder)); - } - - private LogicalTypeFacetForTableAnnotation( - final LogicalType logicalType, - final FacetHolder holder) { - super(logicalType, holder); - } -} diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableAnnotationFacetFactory.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableAnnotationFacetFactory.java index e591c151140..31693dbe4c8 100644 --- a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableAnnotationFacetFactory.java +++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableAnnotationFacetFactory.java @@ -29,7 +29,6 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory; import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory; -import org.apache.isis.persistence.jpa.metamodel.object.domainobject.objectspecid.LogicalTypeFacetForTableAnnotation; import lombok.val; @@ -64,18 +63,11 @@ public void process(final ObjectTypeFacetFactory.ProcessObjectTypeContext proces val facetHolder = processClassContext.getFacetHolder(); - val jdoPersistenceCapableFacet = FacetUtil.addFacet( new JpaTableFacetAnnotationImpl( annotationSchemaAttribute, annotationTableAttribute, facetHolder)); - - FacetUtil.addFacetIfPresent( - LogicalTypeFacetForTableAnnotation - .create(jdoPersistenceCapableFacet, cls, facetHolder)); - - return; } diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/entitychangetracking/jdo/JdoEntityChangePublishingTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/entitychangetracking/jdo/JdoEntityChangePublishingTest.java index 16fcf72913f..1207c87a29c 100644 --- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/entitychangetracking/jdo/JdoEntityChangePublishingTest.java +++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/entitychangetracking/jdo/JdoEntityChangePublishingTest.java @@ -18,8 +18,6 @@ */ package org.apache.isis.testdomain.entitychangetracking.jdo; -import javax.inject.Inject; - import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -32,7 +30,6 @@ import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.testdomain.conf.Configuration_usingJdo; import org.apache.isis.testdomain.jdo.JdoInventoryManager; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; import org.apache.isis.testdomain.jdo.entities.JdoBook; import org.apache.isis.testdomain.jdo.entities.JdoProduct; import org.apache.isis.testdomain.publishing.conf.Configuration_usingEntityChangesPublishing; @@ -40,7 +37,6 @@ import org.apache.isis.testdomain.publishing.subscriber.EntityPropertyChangeSubscriberForTesting; import org.apache.isis.testdomain.util.interaction.InteractionBoundaryProbe; import org.apache.isis.testdomain.util.interaction.InteractionTestAbstract; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; import lombok.val; @@ -50,7 +46,7 @@ Configuration_usingEntityPropertyChangePublishing.class, Configuration_usingEntityChangesPublishing.class, InteractionBoundaryProbe.class, - }, + }, properties = { "logging.level.org.apache.isis.testdomain.util.rest.KVStoreForTesting=DEBUG", "logging.level.org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisTransactionJdo=DEBUG" @@ -61,7 +57,7 @@ }) class JdoEntityChangePublishingTest extends InteractionTestAbstract { - @Inject protected FixtureScripts fixtureScripts; + //@Inject protected FixtureScripts fixtureScripts; @BeforeEach void setUp() { @@ -71,10 +67,10 @@ void setUp() { EntityPropertyChangeSubscriberForTesting.clearPropertyChangeEntries(kvStoreForTesting); // given - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); + //fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); // each test runs in its own interaction context (check) - val testRunNr = (long)kvStoreForTesting.incrementCounter(JdoEntityChangePublishingTest.class, "test-run"); + val testRunNr = kvStoreForTesting.incrementCounter(JdoEntityChangePublishingTest.class, "test-run"); assertEquals(testRunNr, InteractionBoundaryProbe.totalInteractionsStarted(kvStoreForTesting)); assertJdoBookCreatePropertyChanges(); @@ -87,7 +83,7 @@ void tearDown() { System.err.println("===BEFORE TEARDOWN"); // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); + //fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); assertJdoBookDeletePropertyChanges(); @@ -102,11 +98,11 @@ void wrapperInvocation_shouldSpawnSingleTransaction() { val inventoryManager = factoryService.create(JdoInventoryManager.class); assertEquals(99., book.getPrice(), 1E-3); - + System.err.println("=1==BEFORE TX"); // spawns its own transactional boundary (check) - val product = assertTransactional( + val product = assertTransactional( ()->wrapper.wrap(inventoryManager).updateProductPrice(book, 12.)); System.err.println("=1==AFTER TX"); @@ -115,30 +111,30 @@ void wrapperInvocation_shouldSpawnSingleTransaction() { assertNoChangedObjectsPending(); assertJdoBookPriceChangePropertyChanges(); - + } - @Test + @Test void actionInteraction_shouldSpawnSingleTransaction() { // given val book = getBookSample(); - + assertEquals(99., book.getPrice(), 1E-3); System.err.println("=2==BEFORE TX"); - // spawns its own transactional boundary (check) - val product = (JdoProduct) assertTransactional( + // spawns its own transactional boundary (check) + val product = (JdoProduct) assertTransactional( ()->invokeAction(JdoInventoryManager.class, "updateProductPrice", _Lists.of(book, 12.))); System.err.println("=2==AFTER TX"); - assertEquals(12., product.getPrice(), 1E-3); + assertEquals(12., product.getPrice(), 1E-3); assertNoChangedObjectsPending(); assertJdoBookPriceChangePropertyChanges(); - + } // -- HELPER diff --git a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/wrapper/WrapperAsyncTest.java b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/wrapper/WrapperAsyncTest.java index 27911720d82..298e5cc2eef 100644 --- a/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/wrapper/WrapperAsyncTest.java +++ b/regressiontests/incubating/src/test/java/org/apache/isis/testdomain/wrapper/WrapperAsyncTest.java @@ -49,9 +49,7 @@ import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.testdomain.conf.Configuration_usingJdo; import org.apache.isis.testdomain.jdo.JdoInventoryManager; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; import org.apache.isis.testdomain.jdo.entities.JdoProduct; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract; import static org.apache.isis.applib.services.wrapper.control.AsyncControl.returning; @@ -60,7 +58,7 @@ import lombok.val; @SpringBootTest( - classes = { + classes = { Configuration_usingJdo.class, WrapperAsyncTest.ActionDomainEventListener.class } @@ -69,12 +67,12 @@ @DirtiesContext // because of the temporary installed ActionDomainEventListener class WrapperAsyncTest extends IsisIntegrationTestAbstract { - @Inject private FixtureScripts fixtureScripts; +// @Inject private FixtureScripts fixtureScripts; @Inject private RepositoryService repository; @Inject private FactoryService factoryService; @Inject private WrapperFactory wrapper; @Inject private ActionDomainEventListener actionDomainEventListener; - + @Configuration public class Config { // so that we get a new ApplicationContext. @@ -82,11 +80,11 @@ public class Config { @BeforeEach void setUp() { - // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); - - // given - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); +// // cleanup +// fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); +// +// // given +// fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); } @AfterEach @@ -142,7 +140,7 @@ void testWrapper_async_waitingOnDomainEvent() throws InterruptedException, Execu // then assertEquals(123d, productRefreshed.getPrice(), 1E-6); } - + @Service public static class ActionDomainEventListener { @@ -151,7 +149,7 @@ public static class ActionDomainEventListener { private final List events = new ArrayList<>(); @EventListener(JdoInventoryManager.UpdateProductPriceEvent.class) - public void onDomainEvent(JdoInventoryManager.UpdateProductPriceEvent event) { + public void onDomainEvent(final JdoInventoryManager.UpdateProductPriceEvent event) { events.add(event); } diff --git a/regressiontests/stable-bootstrapping/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java b/regressiontests/stable-bootstrapping/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java index 25aea5b62ee..71d6080e6f2 100644 --- a/regressiontests/stable-bootstrapping/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java +++ b/regressiontests/stable-bootstrapping/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java @@ -33,12 +33,14 @@ import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertThrows; +import org.apache.isis.applib.services.registry.ServiceRegistry; import org.apache.isis.core.config.beans.IsisBeanFactoryPostProcessorForSpring; import org.apache.isis.core.config.beans.IsisBeanTypeRegistry; import org.apache.isis.core.config.beans.IsisBeanTypeRegistryDefault; import org.apache.isis.core.config.environment.IsisSystemEnvironment; import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.core.metamodel.context.MetaModelContexts; +import org.apache.isis.core.metamodel.services.registry.ServiceRegistryDefault; import org.apache.isis.testdomain.conf.Configuration_usingStereotypes; import org.apache.isis.testdomain.model.stereotypes.MyObject; import org.apache.isis.testdomain.model.stereotypes.MyObject_mixin; @@ -48,12 +50,13 @@ import lombok.val; @SpringBootTest( - classes = { + classes = { IsisSystemEnvironment.class, MetaModelContexts.class, IsisBeanFactoryPostProcessorForSpring.class, IsisBeanTypeRegistryDefault.class, - Configuration_usingStereotypes.class + Configuration_usingStereotypes.class, + ServiceRegistryDefault.class }, properties = { // "isis.core.meta-model.introspector.parallelize=false", @@ -65,10 +68,11 @@ IsisPresets.UseLog4j2Test, }) class AutoConfigurationTest { - + @Inject private ApplicationContext applicationContext; @Inject private IsisSystemEnvironment isisSystemEnvironment; @Inject private IsisBeanTypeRegistry isisBeanTypeRegistry; + @Inject private ServiceRegistry serviceRegistry; //XXX for debugging and experimenting @Component @@ -76,54 +80,47 @@ static class BeanPostProcessor_forTesting implements BeanPostProcessor { // simply return the instantiated bean as-is @Override - public Object postProcessBeforeInitialization(Object bean, String beanName) { + public Object postProcessBeforeInitialization(final Object bean, final String beanName) { return bean; // we could potentially return any object reference here... } @Override - public Object postProcessAfterInitialization(Object bean, String beanName) { + public Object postProcessAfterInitialization(final Object bean, final String beanName) { System.out.println("Bean '" + beanName + "' created : " + bean.toString()); return bean; } } - + @BeforeEach void beforeEach() { assertNotNull(applicationContext); assertNotNull(isisSystemEnvironment); } - + @Test void domainObjects_shouldBeDiscovered() { - for(val cls : nonManaged()) { val type = isisBeanTypeRegistry.lookupIntrospectableType(cls); assertTrue(type.isPresent()); } - } @Test void domainObjects_shouldNotBeManaged() { - for(val cls : nonManaged()) { assertThrows(NoSuchBeanDefinitionException.class, ()->{ applicationContext.getBean(cls); - }); + }); } - } - + @Test void domainServices_shouldBeManaged() { - val myService = applicationContext.getBean(MyService.class); assertNotNull(myService); - assertNotNull(isisSystemEnvironment.getIocContainer().getSingletonElseFail(MyService.class)); - + assertTrue(serviceRegistry.lookupService(MyService.class).isPresent()); } - - + // we don't want those managed by Spring private static Class[] nonManaged() { val nonManaged = new Class[] {MyObject.class, MyObject_mixin.class, MyView.class}; diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java index 9ecfbdb3aef..5486678a75a 100644 --- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java +++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java @@ -34,6 +34,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.apache.isis.applib.Identifier; import org.apache.isis.applib.annotation.Action; import org.apache.isis.applib.annotation.ActionLayout; @@ -58,19 +61,17 @@ import org.apache.isis.testdomain.model.bad.InvalidActionOverloading; import org.apache.isis.testdomain.model.bad.InvalidContradictingTypeSemantics; import org.apache.isis.testdomain.model.bad.InvalidDomainObjectOnInterface; -import org.apache.isis.testdomain.model.bad.InvalidLogicalTypeNameClash; import org.apache.isis.testdomain.model.bad.InvalidMemberOverloadingWhenInherited; +import org.apache.isis.testdomain.model.bad.InvalidObjectWithAlias; import org.apache.isis.testdomain.model.bad.InvalidOrphanedActionSupport; import org.apache.isis.testdomain.model.bad.InvalidOrphanedCollectionSupport; import org.apache.isis.testdomain.model.bad.InvalidOrphanedPropertySupport; import org.apache.isis.testdomain.model.bad.InvalidPropertyAnnotationOnAction; +import org.apache.isis.testdomain.model.bad.InvalidServiceWithAlias; import org.apache.isis.testdomain.model.bad.OrphanedMemberSupportDetection; import org.apache.isis.testdomain.util.interaction.DomainObjectTesterFactory; import org.apache.isis.testing.integtestsupport.applib.validate.DomainModelValidator; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import lombok.val; @SpringBootTest( @@ -158,6 +159,19 @@ void orphanedCollectionSupport_shouldFail() { ProgrammingModelConstants.Validation.ORPHANED_METHOD, "hideMe()"); } + @Test + void aliasesOnDomainObjectsAndServices_shouldBeUnique() { + validator.assertAnyFailuresContaining( + Identifier.classIdentifier(LogicalType.fqcn(InvalidServiceWithAlias.class)), + "Logical type name (or alias) testdomain.InvalidServiceWithAlias mapped to multiple non-abstract classes:"); + //org.apache.isis.testdomain.model.bad.InvalidObjectWithAlias, org.apache.isis.testdomain.model.bad.InvalidServiceWithAlias + + validator.assertAnyFailuresContaining( + Identifier.classIdentifier(LogicalType.fqcn(InvalidObjectWithAlias.class)), + "Logical type name (or alias) testdomain.InvalidObjectWithAlias mapped to multiple non-abstract classes:"); + //org.apache.isis.testdomain.model.bad.InvalidObjectWithAlias, org.apache.isis.testdomain.model.bad.InvalidServiceWithAlias + } + @Test void actionOverloading_shouldFail() { validator.assertAnyFailuresContaining( @@ -200,16 +214,16 @@ void actionOverloading_shouldFail() { "isActive()")); } - @Test - void logicalTypeNameClash_shouldFail() { - assertLogicalTypeNameClashesAmong(Can.of( - InvalidLogicalTypeNameClash.VariantA.class, - InvalidLogicalTypeNameClash.VariantB.class - - //FIXME ISIS-2871 for some reason the value type c does not get considered - //,InvalidLogicalTypeNameClash.VariantC.class - )); - } +// @Test +// void logicalTypeNameClash_shouldFail() { +// assertLogicalTypeNameClashesAmong(Can.of( +// InvalidLogicalTypeNameClash.VariantA.class, +// InvalidLogicalTypeNameClash.VariantB.class +// +// //FIXME ISIS-2871 for some reason the value type c does not get considered +// //,InvalidLogicalTypeNameClash.VariantC.class +// )); +// } private void assertLogicalTypeNameClashesAmong(final Can> types) { diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java index 2f2cc35eda1..69057382bab 100644 --- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java +++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java @@ -41,6 +41,7 @@ import org.apache.isis.applib.annotation.Introspection.EncapsulationPolicy; import org.apache.isis.applib.annotation.Introspection.MemberAnnotationPolicy; +import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.services.jaxb.JaxbService; import org.apache.isis.applib.services.metamodel.BeanSort; import org.apache.isis.applib.services.metamodel.Config; @@ -84,6 +85,8 @@ import org.apache.isis.testdomain.model.good.ProperMemberInheritance_usingInterface; import org.apache.isis.testdomain.model.good.ProperMemberSupport; import org.apache.isis.testdomain.model.good.ProperMemberSupportDiscovery; +import org.apache.isis.testdomain.model.good.ProperObjectWithAlias; +import org.apache.isis.testdomain.model.good.ProperServiceWithAlias; import org.apache.isis.testdomain.model.good.ProperServiceWithMixin; import org.apache.isis.testdomain.model.good.ViewModelWithAnnotationOptionalUsingPrivateSupport; import org.apache.isis.testdomain.model.good.ViewModelWithEncapsulatedMembers; @@ -508,6 +511,46 @@ void mixinsOnDomainServices_shouldBeAllowed() { } + @Test + void aliasesOnDomainServices_shouldBeHonored() { + + val objectSpec = specificationLoader.specForTypeElseFail(ProperServiceWithAlias.class); + assertTrue(objectSpec.isInjectable()); + assertTrue(objectSpec.getAction("now").isPresent()); + + assertEquals(Can.of( + "testdomain.v1.ProperServiceWithAlias", + "testdomain.v2.ProperServiceWithAlias"), + objectSpec.getAliases().map(LogicalType::getLogicalTypeName)); + + assertEquals(objectSpec, + specificationLoader.specForLogicalTypeName("testdomain.v1.ProperServiceWithAlias") + .orElse(null)); + assertEquals(objectSpec, + specificationLoader.specForLogicalTypeName("testdomain.v2.ProperServiceWithAlias") + .orElse(null)); + } + + @Test + void aliasesOnDomainObjects_shouldBeHonored() { + + val objectSpec = specificationLoader.specForTypeElseFail(ProperObjectWithAlias.class); + assertTrue(objectSpec.isViewModel()); + assertTrue(objectSpec.getAction("now").isPresent()); + + assertEquals(Can.of( + "testdomain.v1.ProperObjectWithAlias", + "testdomain.v2.ProperObjectWithAlias"), + objectSpec.getAliases().map(LogicalType::getLogicalTypeName)); + + assertEquals(objectSpec, + specificationLoader.specForLogicalTypeName("testdomain.v1.ProperObjectWithAlias") + .orElse(null)); + assertEquals(objectSpec, + specificationLoader.specForLogicalTypeName("testdomain.v2.ProperObjectWithAlias") + .orElse(null)); + } + @Test void viewmodelWithEncapsulatedMembers() { diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/MetaModelRegressionTest.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/MetaModelRegressionTest.java index 1a84ccb2161..e5e0912508c 100644 --- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/MetaModelRegressionTest.java +++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/MetaModelRegressionTest.java @@ -76,9 +76,12 @@ void setUp() { val url = _Resources.getResourceUrl(getClass(), "/metamodel.xml.zip"); if(url==null) { - //createReferenceMetaModelFile(new File("/???/metamodel.xml.zip")); + //createReferenceMetaModelFile(new File("//metamodel.xml.zip")); _Exceptions.throwNotImplemented(); } + + //for maintenance + //createReferenceMetaModelFile(new File("d:/tmp/_scratch/metamodel.xml.zip")); } @Test @@ -88,7 +91,7 @@ void metaModelDiff_compareWithLastKnownGood() { factoryService.mixin(MetaModelServiceMenu.downloadMetaModelDiff.class, metaModelServiceMenu); val metamodelExport = downloadMetaModelDiff.act("metamodel.xml", namespaces(), true, - currentMetaModelAsZippedBlob()) + referenceMetaModelAsZippedBlob()) .unZip(CommonMimeType.XML) .toClob(StandardCharsets.UTF_8); @@ -101,7 +104,6 @@ void metaModelDiff_compareWithLastKnownGood() { System.err.printf("%s%n", diff); fail("Reference meta-model and current do differ."); } - } // -- HELPER diff --git a/regressiontests/stable-domainmodel/src/test/resources/metamodel.xml.zip b/regressiontests/stable-domainmodel/src/test/resources/metamodel.xml.zip index 89b24cb824e..085038772c6 100644 Binary files a/regressiontests/stable-domainmodel/src/test/resources/metamodel.xml.zip and b/regressiontests/stable-domainmodel/src/test/resources/metamodel.xml.zip differ diff --git a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CommandArgumentTest.java b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CommandArgumentTest.java index a9f2afb0a88..ecc4485f6b2 100644 --- a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CommandArgumentTest.java +++ b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/CommandArgumentTest.java @@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -68,7 +69,8 @@ class CommandArgumentTest extends InteractionTestAbstract { @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) - @DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName="regressiontests.CommandResult") + @Named("regressiontests.CommandResult") + @DomainObject(nature=Nature.VIEW_MODEL) @NoArgsConstructor @AllArgsConstructor(staticName = "of") public static class CommandResult { @@ -82,7 +84,8 @@ public static class CommandResult { @XmlRootElement(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) - @DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName="regressiontests.CommandArgDemo") + @Named("regressiontests.CommandArgDemo") + @DomainObject(nature=Nature.VIEW_MODEL) public static class CommandArgDemo { @Action diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/injecting/jdo/JdoEntityInjectingTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/injecting/jdo/JdoEntityInjectingTest.java index e36f8f5bd9f..fe8cc623570 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/injecting/jdo/JdoEntityInjectingTest.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/injecting/jdo/JdoEntityInjectingTest.java @@ -38,12 +38,11 @@ import org.apache.isis.commons.internal.primitives._Longs.Range; import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.testdomain.conf.Configuration_usingJdo; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; +import org.apache.isis.testdomain.jdo.JdoTestFixtures; import org.apache.isis.testdomain.jdo.entities.JdoBook; import org.apache.isis.testdomain.jdo.entities.JdoProduct; import org.apache.isis.testdomain.util.dto.BookDto; import org.apache.isis.testdomain.util.kv.KVStoreForTesting; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract; import lombok.val; @@ -64,19 +63,15 @@ @Log4j2 class JdoEntityInjectingTest extends IsisIntegrationTestAbstract { - @Inject private FixtureScripts fixtureScripts; + @Inject private JdoTestFixtures jdoTestFixtures; @Inject private RepositoryService repository; @Inject private KVStoreForTesting kvStore; @Test @Order(0) @Rollback(false) void init() { - // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); - kvStore.clear(JdoBook.class); - // given - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); - assertInjectCountRange(1, 3); //TODO there is some injection redundancy + jdoTestFixtures.reinstall(()->kvStore.clear(JdoBook.class)); + assertInjectCountRange(3, 9); //TODO there is some injection redundancy } @@ -133,7 +128,7 @@ private long getInjectCount() { private JdoBook getSampleBook() { val books = repository.allInstances(JdoProduct.class); - assertEquals(1, books.size(), "book count"); + assertEquals(3, books.size(), "book count"); val book = books.get(0); assertEquals(BookDto.sample().getName(), book.getName(), "book name"); return (JdoBook)book; diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoBootstrappingTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoBootstrappingTest.java index c235f688498..f60d4194623 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoBootstrappingTest.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoBootstrappingTest.java @@ -19,12 +19,11 @@ package org.apache.isis.testdomain.persistence.jdo; import java.sql.SQLException; -import java.util.HashSet; -import java.util.Set; import javax.inject.Inject; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; @@ -37,12 +36,11 @@ import static org.junit.Assert.assertNotNull; import static org.junit.jupiter.api.Assertions.assertEquals; +import org.apache.isis.commons.collections.Can; import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.testdomain.conf.Configuration_usingJdo; import org.apache.isis.testdomain.jdo.JdoTestFixtures; -import org.apache.isis.testdomain.jdo.entities.JdoBook; import org.apache.isis.testdomain.jdo.entities.JdoInventory; -import org.apache.isis.testdomain.jdo.entities.JdoProduct; import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract; import lombok.val; @@ -64,33 +62,13 @@ static void beforeAll() throws SQLException { // Util_H2Console.main(null); } - void cleanUp() { - testFixtures.cleanUpRepository(); - } - - void setUp() { - - // setup sample Inventory - Set products = new HashSet<>(); - - products.add(JdoBook.of("Sample Book", "A sample book for testing.", 99., "Sample Author", "Sample ISBN", - "Sample Publisher")); - - val inventory = JdoInventory.of("Sample Inventory", products); - repositoryService.persist(inventory); - } - + @Disabled @Test @Order(1) @Rollback(false) void sampleInventoryShouldBeSetUp() { - // given - expected pre condition: no inventories - - cleanUp(); - assertEquals(0, repositoryService.allInstances(JdoInventory.class).size()); - - // when - - setUp(); + // when - expected condition before install: no inventories + testFixtures.reinstall(()-> + assertEquals(0, repositoryService.allInstances(JdoInventory.class).size())); // then - expected post condition: ONE inventory @@ -100,14 +78,21 @@ void sampleInventoryShouldBeSetUp() { val inventory = inventories.get(0); assertNotNull(inventory); assertNotNull(inventory.getProducts()); - assertEquals(1, inventory.getProducts().size()); + assertEquals(3, inventory.getProducts().size()); + + val expectedBookTitles = JdoTestFixtures.expectedBookTitles(); + + val multipleBooks = Can.ofCollection(inventory.getProducts()) + .filter(book->expectedBookTitles.contains(book.getName())); + + assertEquals(3, multipleBooks.size()); - val product = inventory.getProducts().iterator().next(); - assertEquals("Sample Book", product.getName()); + val firstProduct = inventory.getProducts().iterator().next(); - testFixtures.assertHasPersistenceId(product); + testFixtures.assertHasPersistenceId(firstProduct); } + @Disabled @Test @Order(2) @Rollback(false) void aSecondRunShouldWorkAsWell() { sampleInventoryShouldBeSetUp(); diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoBootstrappingTest_usingFixtures.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoBootstrappingTest_usingFixtures.java deleted file mode 100644 index 099b94f224a..00000000000 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoBootstrappingTest_usingFixtures.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.isis.testdomain.persistence.jdo; - -import javax.inject.Inject; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -import static org.junit.Assert.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.apache.isis.core.config.beans.IsisBeanFactoryPostProcessorForSpring; -import org.apache.isis.testdomain.conf.Configuration_usingJdo; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; -import org.apache.isis.testdomain.jdo.JdoTestFixtures; -import org.apache.isis.testdomain.jdo.entities.JdoInventory; -import org.apache.isis.testdomain.util.dto.BookDto; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; -import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract; - -import lombok.val; - -@SpringBootTest( - classes = { - IsisBeanFactoryPostProcessorForSpring.class, - Configuration_usingJdo.class, - }, - properties = { - "logging.config=log4j2-debug-persistence.xml", - //IsisPresets.DebugPersistence, - }) -@Transactional -class JdoBootstrappingTest_usingFixtures -extends IsisIntegrationTestAbstract { - - @Inject private JdoTestFixtures testFixtures; - @Inject protected FixtureScripts fixtureScripts; - - @BeforeEach - void setUp() { - // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); - // given - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); - } - - @Test - void sampleInventoryShouldBeSetUp() { - - val inventories = repositoryService.allInstances(JdoInventory.class); - assertEquals(1, inventories.size()); - - val inventory = inventories.get(0); - assertNotNull(inventory); - assertNotNull(inventory.getProducts()); - assertEquals(1, inventory.getProducts().size()); - - val product = inventory.getProducts().iterator().next(); - assertEquals(BookDto.sample().getName(), product.getName()); - - testFixtures.assertHasPersistenceId(product); - - } - -} diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest.java index 94c137df0a4..9bac466e989 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest.java @@ -51,7 +51,7 @@ //@Transactional ... we manage transaction ourselves class JdoExceptionTranslationTest extends RegressionTestAbstract { - @Inject private JdoTestFixtures testFixtures; + @Inject private JdoTestFixtures jdoTestFixtures; @BeforeAll static void beforeAll() throws SQLException { @@ -62,8 +62,6 @@ static void beforeAll() throws SQLException { @Test void booksUniqueByIsbn_whenViolated_shouldThrowTranslatedException() { - run(()->testFixtures.setUp3Books()); - // when adding a book for which one with same ISBN already exists in the database, // we expect to see a Spring recognized DataAccessException been thrown @@ -81,7 +79,7 @@ void booksUniqueByIsbn_whenViolated_shouldThrowTranslatedException() { // add a conflicting book (unique ISBN violation) - testFixtures.addABookTo(inventory); + jdoTestFixtures.addABookTo(inventory); }); @@ -101,7 +99,7 @@ void booksUniqueByIsbn_whenViolated_shouldThrowTranslatedException() { assertNotNull(inventory.getProducts()); assertEquals(3, inventory.getProducts().size()); - testFixtures.assertInventoryHasBooks(inventory.getProducts(), 1, 2, 3); + jdoTestFixtures.assertInventoryHasBooks(inventory.getProducts(), 1, 2, 3); }); } diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest_usingTransactional.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest_usingTransactional.java index 0887694019e..25a59b4ce76 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest_usingTransactional.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoExceptionTranslationTest_usingTransactional.java @@ -73,16 +73,6 @@ static void beforeAll() throws SQLException { } @Test @Order(1) - @Transactional @Rollback(false) - void booksUniqueByIsbn_setupPhase() { - interactionService.runAnonymous(()->{ - - testFixtures.setUp3Books(); - - }); - } - - @Test @Order(2) void booksUniqueByIsbn_whenViolated_shouldThrowTranslatedException() { // when adding a book for which one with same ISBN already exists in the database, @@ -107,7 +97,7 @@ void booksUniqueByIsbn_whenViolated_shouldThrowTranslatedException() { } - @Test @Order(3) + @Test @Order(2) @Transactional @Rollback(false) void booksUniqueByIsbn_verifyPhase() { @@ -131,17 +121,4 @@ void booksUniqueByIsbn_verifyPhase() { } - @Test @Order(4) - @Transactional @Rollback(false) - void booksUniqueByIsbn_cleanupPhase() { - - interactionService.runAnonymous(()->{ - - testFixtures.cleanUpRepository(); - - }); - - } - - } diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoJaxbTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoJaxbTest.java index 2bff68f31fb..cea1850da29 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoJaxbTest.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoJaxbTest.java @@ -20,7 +20,6 @@ import javax.inject.Inject; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; @@ -42,21 +41,16 @@ //@Transactional class JdoJaxbTest extends RegressionTestAbstract { - @Inject private JdoTestFixtures testFixtures; + @Inject private JdoTestFixtures jdoTestFixtures; @Inject private JaxbService jaxbService; - @BeforeEach - void setUp() throws InterruptedException { - run(()->testFixtures.setUp3Books()); - } - @Test void inventoryJaxbVm_shouldRoundtripProperly() { val xml = call(()->{ - val inventoryJaxbVm = testFixtures.setUpViewmodelWith3Books(); + val inventoryJaxbVm = jdoTestFixtures.setUpViewmodelWith3Books(); // assert initial reference is populated as expected - testFixtures.assertPopulatedWithDefaults(inventoryJaxbVm); + jdoTestFixtures.assertPopulatedWithDefaults(inventoryJaxbVm); // start round-trip return jaxbService.toXml(inventoryJaxbVm); }); @@ -66,7 +60,7 @@ void inventoryJaxbVm_shouldRoundtripProperly() { val recoveredVm = serviceInjector.injectServicesInto( jaxbService.fromXml(JdoInventoryJaxbVm.class, xml)); - testFixtures.assertPopulatedWithDefaults(recoveredVm); + jdoTestFixtures.assertPopulatedWithDefaults(recoveredVm); }); } diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoQueryTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoQueryTest.java index 74a3fb05f41..beb1be1abde 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoQueryTest.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/persistence/jdo/JdoQueryTest.java @@ -56,7 +56,7 @@ class JdoQueryTest extends IsisIntegrationTestAbstract { // @Inject private JdoSupportService jdoSupport; - @Inject private JdoTestFixtures testFixtures; + @Inject private JdoTestFixtures jdoTestFixtures; @BeforeAll static void beforeAll() throws SQLException { @@ -67,8 +67,6 @@ static void beforeAll() throws SQLException { @Test @Order(1) void sampleInventory_shouldBeSetUpWith3Books() { - testFixtures.setUp3Books(); - // when val inventories = repositoryService.allInstances(JdoInventory.class); @@ -82,19 +80,19 @@ void sampleInventory_shouldBeSetUpWith3Books() { assertNotNull(inventory.getProducts()); assertEquals(3, inventory.getProducts().size()); - testFixtures.assertInventoryHasBooks(inventory.getProducts(), 1, 2, 3); + jdoTestFixtures.assertInventoryHasBooks(inventory.getProducts(), 1, 2, 3); } @Test @Order(2) @Disabled("broken won't fix") void sampleInventory_shouldSupportQueryCount() { - testFixtures.setUp3Books(); + //testFixtures.setUp3Books(); - testFixtures.assertInventoryHasBooks(repositoryService + jdoTestFixtures.assertInventoryHasBooks(repositoryService .allMatches(Query.allInstances(JdoBook.class)), 1, 2, 3); - testFixtures.assertInventoryHasBooks(repositoryService + jdoTestFixtures.assertInventoryHasBooks(repositoryService .allMatches(Query.allInstances(JdoBook.class) .withLimit(2)), 1, 2); @@ -103,14 +101,14 @@ void sampleInventory_shouldSupportQueryCount() { @Test @Order(3) @Disabled("start not supported, should throw unsupported exception maybe?") void sampleInventory_shouldSupportQueryStart() { - testFixtures.setUp3Books(); + //testFixtures.setUp3Books(); - testFixtures.assertInventoryHasBooks(repositoryService + jdoTestFixtures.assertInventoryHasBooks(repositoryService .allMatches(Query.allInstances(JdoBook.class) .withStart(1)), 2, 3); - testFixtures.assertInventoryHasBooks(repositoryService + jdoTestFixtures.assertInventoryHasBooks(repositoryService .allMatches(Query.allInstances(JdoBook.class) .withRange(1, 1)), 2); @@ -119,13 +117,13 @@ void sampleInventory_shouldSupportQueryStart() { @Test @Order(4) @Disabled("broken won't fix") void sampleInventory_shouldSupportNamedQueriesThroughApplib() { - testFixtures.setUp3Books(); + //testFixtures.setUp3Books(); val query = Query.named(JdoBook.class, "findAffordableBooks") .withParameter("priceUpperBound", 60.); val affordableBooks = repositoryService.allMatches(query); - testFixtures.assertInventoryHasBooks(affordableBooks, 1, 2); + jdoTestFixtures.assertInventoryHasBooks(affordableBooks, 1, 2); } // @Test @Order(4) diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/timestamping/jdo/JdoTimestampingTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/timestamping/jdo/JdoTimestampingTest.java index cd7e69cb86a..5daa12f96f3 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/timestamping/jdo/JdoTimestampingTest.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/timestamping/jdo/JdoTimestampingTest.java @@ -20,7 +20,6 @@ import javax.inject.Inject; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -29,18 +28,16 @@ import org.apache.isis.applib.services.repository.RepositoryService; import org.apache.isis.testdomain.conf.Configuration_usingJdo; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; import org.apache.isis.testdomain.jdo.entities.JdoProduct; import org.apache.isis.testdomain.jdo.entities.JdoProductComment; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract; import lombok.val; @SpringBootTest( - classes = { + classes = { Configuration_usingJdo.class - }, + }, properties = { // "logging.config=log4j2-debug-persistence.xml", // IsisPresets.DebugPersistence, @@ -48,22 +45,11 @@ @Transactional class JdoTimestampingTest extends IsisIntegrationTestAbstract { - @Inject private FixtureScripts fixtureScripts; @Inject private RepositoryService repository; - @BeforeEach - void setUp() { - - // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); - - // given - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); - } - @Test void updatedByAt_shouldBeFilledInByTheTimestampingService() { - + val product = repository.allInstances(JdoProduct.class).listIterator().next(); assertNotNull(product); @@ -72,10 +58,10 @@ void updatedByAt_shouldBeFilledInByTheTimestampingService() { comment.setComment("Awesome Book!"); repository.persist(comment); - + assertNotNull(comment.getUpdatedAt()); assertNotNull(comment.getUpdatedBy()); - + } } diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactionService.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactionService.java index 329e5c167b1..9862dac0baf 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactionService.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactionService.java @@ -18,47 +18,50 @@ */ package org.apache.isis.testdomain.transactions.jdo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - import javax.inject.Inject; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.apache.isis.applib.services.repository.RepositoryService; import org.apache.isis.applib.services.xactn.TransactionService; import org.apache.isis.commons.internal.exceptions._Exceptions; import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.testdomain.conf.Configuration_usingJdo; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; +import org.apache.isis.testdomain.jdo.JdoTestFixtures; +import org.apache.isis.testdomain.jdo.JdoTestFixtures.Lock; import org.apache.isis.testdomain.jdo.entities.JdoBook; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; import lombok.val; @SpringBootTest( - classes = { + classes = { Configuration_usingJdo.class, }) @TestPropertySource(IsisPresets.UseLog4j2Test) -class JdoTransactionRollbackTest_usingTransactionService -{ +class JdoTransactionRollbackTest_usingTransactionService { - @Inject private FixtureScripts fixtureScripts; + @Inject private JdoTestFixtures jdoTestFixtures; @Inject private TransactionService transactionService; @Inject private RepositoryService repository; + private Lock lock; + @BeforeEach void setUp() { - - transactionService.runWithinCurrentTransactionElseCreateNew(()->{ - // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); - - }); + // clear repository + lock = jdoTestFixtures.clearAndAquireLock(); + } + + @AfterEach + void restore() { + lock.release(); } @Test @@ -68,8 +71,8 @@ void happyCaseTx_shouldCommit() { // expected pre condition assertEquals(0, repository.allInstances(JdoBook.class).size()); - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); - + jdoTestFixtures.install(lock); + // expected post condition assertEquals(1, repository.allInstances(JdoBook.class).size()); }); @@ -85,10 +88,11 @@ void whenExceptionWithinTx_shouldRollback() { }); val result = transactionService.runWithinCurrentTransactionElseCreateNew(()->{ - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); - throw _Exceptions.unrecoverable("Test: force current tx to rollback"); - }); - + //fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); + jdoTestFixtures.install(lock); + throw _Exceptions.unrecoverable("Test: force current tx to rollback"); + }); + assertTrue(result.isFailure()); transactionService.runWithinCurrentTransactionElseCreateNew(()->{ diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactional.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactional.java index f943bfcd5f0..3b45109e6c8 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactional.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionRollbackTest_usingTransactional.java @@ -34,9 +34,9 @@ import org.apache.isis.applib.services.repository.RepositoryService; import org.apache.isis.commons.internal.debug._Probe; import org.apache.isis.testdomain.conf.Configuration_usingJdo; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; +import org.apache.isis.testdomain.jdo.JdoTestFixtures; +import org.apache.isis.testdomain.jdo.JdoTestFixtures.Lock; import org.apache.isis.testdomain.jdo.entities.JdoBook; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; /** * These tests use the {@code @Transactional} annotation as provided by Spring. @@ -57,18 +57,17 @@ @Transactional //@TestPropertySource(IsisPresets.UseLog4j2Test) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class JdoTransactionRollbackTest_usingTransactional -{ +class JdoTransactionRollbackTest_usingTransactional { - @Inject private FixtureScripts fixtureScripts; + @Inject private JdoTestFixtures jdoTestFixtures; @Inject private RepositoryService repository; @Inject private InteractionService interactionService; + private static Lock lock; @Test @Order(1) @Commit - void cleanup_justInCase() { - - // cleanup just in case - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); + void clearRepository() { + // clear repository + lock = jdoTestFixtures.clearAndAquireLock(); } @Test @Order(2) @@ -83,12 +82,13 @@ void happyCaseTx_shouldCommit() { _Probe.errOut("before fixture"); - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); + jdoTestFixtures.install(lock); + //fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); _Probe.errOut("after fixture"); // expected post condition - assertEquals(1, repository.allInstances(JdoBook.class).size()); + assertEquals(3, repository.allInstances(JdoBook.class).size()); }); @@ -109,4 +109,9 @@ void previousTest_shouldHaveBeenRolledBack() { } + @Test @Order(4) @Commit + void restoreDefaultCondition() { + lock.release(); + } + } diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionScopeListenerTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionScopeListenerTest.java index 246bfad5baf..883781e0b33 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionScopeListenerTest.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/transactions/jdo/JdoTransactionScopeListenerTest.java @@ -20,6 +20,7 @@ import javax.inject.Inject; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -32,11 +33,11 @@ import org.apache.isis.applib.services.xactn.TransactionService; import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.testdomain.conf.Configuration_usingJdo; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; +import org.apache.isis.testdomain.jdo.JdoTestFixtures; +import org.apache.isis.testdomain.jdo.JdoTestFixtures.Lock; import org.apache.isis.testdomain.jdo.entities.JdoBook; import org.apache.isis.testdomain.util.interaction.InteractionBoundaryProbe; import org.apache.isis.testdomain.util.kv.KVStoreForTesting; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; @SpringBootTest( classes = { @@ -50,11 +51,12 @@ */ class JdoTransactionScopeListenerTest { - @Inject private FixtureScripts fixtureScripts; + @Inject private JdoTestFixtures jdoTestFixtures; @Inject private TransactionService transactionService; @Inject private RepositoryService repository; @Inject private InteractionService interactionService; @Inject private KVStoreForTesting kvStoreForTesting; + private Lock lock; /* Expectations: * 1. for each InteractionScope there should be a new InteractionBoundaryProbe instance @@ -67,15 +69,15 @@ class JdoTransactionScopeListenerTest { @BeforeEach void setUp() { - // new InteractionScope with a new transaction (#1) - interactionService.runAnonymous(()->{ - - // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); - - }); + // clear repository + lock = jdoTestFixtures.clearAndAquireLock(); + } + @AfterEach + void restore() { + // restore repository + lock.release(); } @Test @@ -90,21 +92,20 @@ void sessionScopedProbe_shouldBeReused_andBeAwareofTransactionBoundaries() { // reuse transaction (#2) transactionService.runWithinCurrentTransactionElseCreateNew(()->{ - - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); - + // + 1 interaction + 1 transaction + jdoTestFixtures.install(lock); }); // expected post condition // reuse transaction (#2) - assertEquals(1, repository.allInstances(JdoBook.class).size()); + assertEquals(3, repository.allInstances(JdoBook.class).size()); }); - assertEquals(2, InteractionBoundaryProbe.totalInteractionsStarted(kvStoreForTesting)); - assertEquals(2, InteractionBoundaryProbe.totalInteractionsEnded(kvStoreForTesting)); - assertEquals(2, InteractionBoundaryProbe.totalTransactionsEnding(kvStoreForTesting)); - assertEquals(2, InteractionBoundaryProbe.totalTransactionsCommitted(kvStoreForTesting)); + assertEquals(3, InteractionBoundaryProbe.totalInteractionsStarted(kvStoreForTesting)); + assertEquals(3, InteractionBoundaryProbe.totalInteractionsEnded(kvStoreForTesting)); + assertEquals(3, InteractionBoundaryProbe.totalTransactionsEnding(kvStoreForTesting)); + assertEquals(3, InteractionBoundaryProbe.totalTransactionsCommitted(kvStoreForTesting)); } diff --git a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/wrapper/jdo/JdoWrapperSyncTest.java b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/wrapper/jdo/JdoWrapperSyncTest.java index 9b1d454674f..c492096da65 100644 --- a/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/wrapper/jdo/JdoWrapperSyncTest.java +++ b/regressiontests/stable-persistence-jdo/src/test/java/org/apache/isis/testdomain/wrapper/jdo/JdoWrapperSyncTest.java @@ -22,7 +22,6 @@ import javax.inject.Inject; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; @@ -35,10 +34,8 @@ import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.testdomain.conf.Configuration_usingJdo; import org.apache.isis.testdomain.jdo.JdoInventoryManager; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; import org.apache.isis.testdomain.jdo.entities.JdoBook; import org.apache.isis.testdomain.jdo.entities.JdoProduct; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; import org.apache.isis.testing.integtestsupport.applib.IsisIntegrationTestAbstract; import lombok.val; @@ -51,20 +48,10 @@ @TestPropertySource(IsisPresets.UseLog4j2Test) class JdoWrapperSyncTest extends IsisIntegrationTestAbstract { - @Inject private FixtureScripts fixtureScripts; @Inject private RepositoryService repository; @Inject private FactoryService facoryService; @Inject private WrapperFactory wrapper; - @BeforeEach - void setUp() { - // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); - - // given - fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); - } - @Test void testWrapper_waitingOnDomainEvent() throws InterruptedException, ExecutionException { @@ -74,14 +61,12 @@ void testWrapper_waitingOnDomainEvent() throws InterruptedException, ExecutionEx .mapToDouble(JdoProduct::getPrice) .sum(); - assertEquals(39d, sumOfPrices, 1E-6); + assertEquals(167d, sumOfPrices, 1E-6); val products = wrapper.wrap(inventoryManager).listAllProducts(); - assertEquals(1, products.size()); + assertEquals(3, products.size()); assertEquals(JdoBook.class, products.get(0).getClass()); } - - } diff --git a/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/RestServiceStressTest.java b/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/RestServiceStressTest.java index 37238d1cbdd..333c3511488 100644 --- a/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/RestServiceStressTest.java +++ b/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/RestServiceStressTest.java @@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIfSystemProperty; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; diff --git a/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/RestServiceTest.java b/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/RestServiceTest.java index 07e1d71b7c4..29dcbf51377 100644 --- a/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/RestServiceTest.java +++ b/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/RestServiceTest.java @@ -24,7 +24,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; @@ -34,6 +34,8 @@ import org.apache.isis.core.config.presets.IsisPresets; import org.apache.isis.testdomain.conf.Configuration_usingJdo; +import org.apache.isis.testdomain.jdo.JdoInventoryJaxbVm; +import org.apache.isis.testdomain.jdo.JdoTestFixtures; import org.apache.isis.testdomain.jdo.entities.JdoBook; import org.apache.isis.testdomain.util.rest.RestEndpointService; import org.apache.isis.viewer.restfulobjects.jaxrsresteasy4.IsisModuleViewerRestfulObjectsJaxrsResteasy4; @@ -53,6 +55,24 @@ class RestServiceTest { @LocalServerPort int port; // just for reference (not used) @Inject RestEndpointService restService; + @Test + void httpSessionInfo() { + + val useRequestDebugLogging = false; + val restfulClient = restService.newClient(useRequestDebugLogging); + + val digest = restService.getHttpSessionInfo(restfulClient) + .ifFailure(Assertions::fail); + + val httpSessionInfo = digest.getValue().orElseThrow(); + + assertNotNull(httpSessionInfo); + + // NB: this works only because we excluded wicket viewer from the app. + assertEquals("no http-session", httpSessionInfo); + + } + @Test void bookOfTheWeek_viaRestEndpoint() { @@ -103,14 +123,12 @@ void multipleBooks_viaRestEndpoint() throws JAXBException { val digest = restService.getMultipleBooks(restfulClient) .ifFailure(Assertions::fail); - val multipleBooks = digest.getValue().orElseThrow(); - - assertEquals(2, multipleBooks.size()); + val expectedBookTitles = JdoTestFixtures.expectedBookTitles(); - for(val book : multipleBooks) { - assertEquals("MultipleBooksTest", book.getName()); - } + val multipleBooks = digest.getValue().orElseThrow() + .filter(book->expectedBookTitles.contains(book.getName())); + assertEquals(3, multipleBooks.size()); } @Test @@ -147,27 +165,50 @@ void multipleBooks_asDto_viaRestEndpoint() throws JAXBException { assertEquals(2, multipleBooks.size()); for(val book : multipleBooks) { - assertEquals("MultipleBooksTest", book.getName()); + assertEquals("MultipleBooksAsDtoTest", book.getName()); } } @Test - void httpSessionInfo() { + void inventoryAsJaxbVm_viaRestEndpoint() { + + assertTrue(restService.getPort()>0); val useRequestDebugLogging = false; val restfulClient = restService.newClient(useRequestDebugLogging); - val digest = restService.getHttpSessionInfo(restfulClient) + val digest = restService.getInventoryAsJaxbVm(restfulClient) .ifFailure(Assertions::fail); - val httpSessionInfo = digest.getValue().orElseThrow(); + final JdoInventoryJaxbVm inventoryAsJaxbVm = digest.getValue().orElseThrow(); - assertNotNull(httpSessionInfo); + assertNotNull(inventoryAsJaxbVm); + assertEquals("Bookstore", inventoryAsJaxbVm.getName()); - // NB: this works only because we excluded wicket viewer from the app. - assertEquals("no http-session", httpSessionInfo); + } + + @Test + void listBooks_fromInventoryAsJaxbVm_viaRestEndpoint() { + + assertTrue(restService.getPort()>0); + + val useRequestDebugLogging = false; + val restfulClient = restService.newClient(useRequestDebugLogging); + + val digest = restService.getBooksFromInventoryAsJaxbVm(restfulClient) + .ifFailure(Assertions::fail); + + val books = digest.getValue().orElseThrow(); + + val expectedBookTitles = JdoTestFixtures.expectedBookTitles(); + + val multipleBooks = books + .filter(book->expectedBookTitles.contains(book.getName())); + + assertEquals(3, multipleBooks.size()); } + } diff --git a/regressiontests/stable-viewers-jdo/src/main/java/org/apache/isis/testdomain/viewers/jdo/wkt/TestAppJdoWkt.java b/regressiontests/stable-viewers-jdo/src/main/java/org/apache/isis/testdomain/viewers/jdo/wkt/TestAppJdoWkt.java index 9786c55beac..a71504d43ba 100644 --- a/regressiontests/stable-viewers-jdo/src/main/java/org/apache/isis/testdomain/viewers/jdo/wkt/TestAppJdoWkt.java +++ b/regressiontests/stable-viewers-jdo/src/main/java/org/apache/isis/testdomain/viewers/jdo/wkt/TestAppJdoWkt.java @@ -19,6 +19,7 @@ package org.apache.isis.testdomain.viewers.jdo.wkt; import javax.inject.Inject; +import javax.inject.Named; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -40,6 +41,7 @@ import org.apache.isis.testdomain.jdo.JdoInventoryJaxbVm; import org.apache.isis.testdomain.jdo.JdoTestFixtures; import org.apache.isis.testdomain.model.valuetypes.composite.CalendarEventJaxbVm; +import org.apache.isis.viewer.restfulobjects.jaxrsresteasy4.IsisModuleViewerRestfulObjectsJaxrsResteasy4; import org.apache.isis.viewer.wicket.viewer.IsisModuleViewerWicketViewer; /** @@ -53,6 +55,9 @@ // UI (Wicket Viewer) IsisModuleViewerWicketViewer.class, + IsisModuleViewerRestfulObjectsJaxrsResteasy4.class, + + XrayEnable.class // for debugging only }) public class TestAppJdoWkt extends SpringBootServletInitializer { @@ -68,10 +73,9 @@ public static void main(final String[] args) { SpringApplication.run(new Class[] { TestAppJdoWkt.class }, args); } + @Named("testdomain.jdo.TestHomePage") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "testdomain.jdo.TestHomePage" - ) + nature=Nature.VIEW_MODEL) @HomePage public static class TestHomePage { @@ -85,7 +89,7 @@ public static class TestHomePage { @Action @ActionLayout(sequence = "0.1") public TestHomePage setup() { - testFixtures.setUp3Books(); + //testFixtures.install(); return this; } diff --git a/regressiontests/stable-viewers-jdo/src/test/java/org/apache/isis/testdomain/viewers/jdo/wkt/InteractionTestJdoWkt.java b/regressiontests/stable-viewers-jdo/src/test/java/org/apache/isis/testdomain/viewers/jdo/wkt/InteractionTestJdoWkt.java index 4baec2b2ebc..61d35338b6c 100644 --- a/regressiontests/stable-viewers-jdo/src/test/java/org/apache/isis/testdomain/viewers/jdo/wkt/InteractionTestJdoWkt.java +++ b/regressiontests/stable-viewers-jdo/src/test/java/org/apache/isis/testdomain/viewers/jdo/wkt/InteractionTestJdoWkt.java @@ -71,12 +71,8 @@ class InteractionTestJdoWkt extends RegressionTestAbstract { @BeforeEach void setUp() throws InterruptedException { - wktTester = wicketTesterFactory.createTester(JdoBook::fromDto); - - run(()->{ - testFixtures.setUp3Books(); - }); + //testFixtures.install(); } @AfterEach diff --git a/regressiontests/stable-viewers-jpa/src/main/java/org/apache/isis/testdomain/viewers/jpa/wkt/TestAppJpaWkt.java b/regressiontests/stable-viewers-jpa/src/main/java/org/apache/isis/testdomain/viewers/jpa/wkt/TestAppJpaWkt.java index 119411e8cc3..74333e32b05 100644 --- a/regressiontests/stable-viewers-jpa/src/main/java/org/apache/isis/testdomain/viewers/jpa/wkt/TestAppJpaWkt.java +++ b/regressiontests/stable-viewers-jpa/src/main/java/org/apache/isis/testdomain/viewers/jpa/wkt/TestAppJpaWkt.java @@ -19,6 +19,7 @@ package org.apache.isis.testdomain.viewers.jpa.wkt; import javax.inject.Inject; +import javax.inject.Named; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -72,10 +73,9 @@ public static void main(final String[] args) { SpringApplication.run(new Class[] { TestAppJpaWkt.class }, args); } + @Named("testdomain.jpa.TestHomePage") @DomainObject( - nature=Nature.VIEW_MODEL, - logicalTypeName = "testdomain.jpa.TestHomePage" - ) + nature=Nature.VIEW_MODEL) @HomePage public static class TestHomePage { diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryJaxbVm.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryJaxbVm.java index 6d3737ef8cc..05f118ac0c5 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryJaxbVm.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryJaxbVm.java @@ -24,6 +24,7 @@ import java.util.Optional; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -56,10 +57,12 @@ "books", "booksForTab1", "booksForTab2"} ) @XmlAccessorType(XmlAccessType.FIELD) +@Named("testdomain.jdo.JdoInventoryJaxbVm") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "testdomain.jdo.JdoInventoryJaxbVm" -) + nature=Nature.VIEW_MODEL, + aliased={ + "testdomain.jdo.JdoInventoryJaxbVmAlias" + }) public class JdoInventoryJaxbVm { @XmlTransient @Inject diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryResource.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryResource.java index 5e763d3da5c..fe8b3d35c5f 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryResource.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryResource.java @@ -19,6 +19,7 @@ package org.apache.isis.testdomain.jdo; import java.util.List; +import java.util.function.Consumer; import java.util.stream.Collectors; import javax.inject.Inject; @@ -33,6 +34,7 @@ import org.apache.isis.applib.annotation.NatureOfService; import org.apache.isis.applib.annotation.ParameterLayout; import org.apache.isis.applib.annotation.PriorityPrecedence; +import org.apache.isis.applib.services.factory.FactoryService; import org.apache.isis.applib.services.repository.RepositoryService; import org.apache.isis.commons.internal.base._NullSafe; import org.apache.isis.commons.internal.collections._Lists; @@ -45,13 +47,16 @@ @Named("testdomain.jdo.InventoryResource") @DomainService( - nature = NatureOfService.REST + nature = NatureOfService.REST, + aliased = "testdomain.jdo.InventoryResourceAlias" // <-- as tested with RestEndpointService ) @javax.annotation.Priority(PriorityPrecedence.EARLY) @RequiredArgsConstructor(onConstructor_ = { @Inject }) public class JdoInventoryResource { final RepositoryService repository; + final FactoryService factoryService; + final JdoTestFixtures jdoTestFixtures; @Action public List listProducts() { @@ -83,20 +88,9 @@ public BookDto recommendedBookOfTheWeekDto() { @Action public List multipleBooks( - - @ParameterLayout(named = "") final - int nrOfBooks - - ) { - - val books = _Lists.newArrayList(); - - // for this test we do not care if we generate duplicates - for(int i=0; i multipleBooksAsDto( - @ParameterLayout(named = "") final - int nrOfBooks - - ) { + int nrOfBooks) { val books = _Lists.newArrayList(); + createMultipleBooks("MultipleBooksAsDtoTest", nrOfBooks, newBook->books.add(BookDto.from(newBook))); + return books; + } + + @Action + public JdoInventoryJaxbVm inventoryAsJaxbVm() { + val inventoryJaxbVm = factoryService.viewModel(new JdoInventoryJaxbVm()); + val books = listBooks(); + if(_NullSafe.size(books)>0) { + inventoryJaxbVm.setName("Bookstore"); + inventoryJaxbVm.setBooks(books); + inventoryJaxbVm.setFavoriteBook(books.get(0)); + } + return inventoryJaxbVm; + } + + // -- HELPER + + private List createMultipleBooks( + final String bookTitle, + final int nrOfBooks, + final Consumer onNewBook) { + + val books = _Lists.newArrayList(); // for this test we do not care if we generate duplicates for(int i=0; i> { - PurgeAll { - @Override - public BuilderScriptWithoutResult builder() { - return new BuilderScriptWithoutResult() { - - @Override - protected void execute(final ExecutionContext ec) { - - repository.allInstances(JdoInventory.class) - .forEach(repository::remove); - - repository.allInstances(JdoBook.class) - .forEach(repository::remove); - - repository.allInstances(JdoProduct.class) - .forEach(repository::remove); - - } - - @Inject private RepositoryService repository; - - }; - } - }, - - InventoryWith1Book { - @Override - public BuilderScriptWithResult builder() { - return new BuilderScriptWithResult() { - - @Override - protected Object buildResult(final ExecutionContext ec) { - - val products = new HashSet(); - - products.add(JdoBook.fromDto(BookDto.sample())); - - val inventory = JdoInventory.of("Sample Inventory", products); - repository.persist(inventory); - - return inventory; - - } - - @Inject private RepositoryService repository; - - }; - } - }, +// PurgeAll { +// @Override +// public BuilderScriptWithoutResult builder() { +// return new BuilderScriptWithoutResult() { +// +// @Override +// protected void execute(final ExecutionContext ec) { +// +// repository.allInstances(JdoInventory.class) +// .forEach(repository::remove); +// +// repository.allInstances(JdoBook.class) +// .forEach(repository::remove); +// +// repository.allInstances(JdoProduct.class) +// .forEach(repository::remove); +// +// } +// +// @Inject private RepositoryService repository; +// +// }; +// } +// }, +// +// InventoryWith1Book { +// @Override +// public BuilderScriptWithResult builder() { +// return new BuilderScriptWithResult() { +// +// @Override +// protected Object buildResult(final ExecutionContext ec) { +// +// val products = new HashSet(); +// +// products.add(JdoBook.fromDto(BookDto.sample())); +// +// val inventory = JdoInventory.of("Sample Inventory", products); +// repository.persist(inventory); +// +// return inventory; +// +// } +// +// @Inject private RepositoryService repository; +// +// }; +// } +// }, SvenApplicationUser { @Override diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoTestFixtures.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoTestFixtures.java index 5f301c3e89c..efc2a814554 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoTestFixtures.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoTestFixtures.java @@ -19,8 +19,10 @@ package org.apache.isis.testdomain.jdo; import java.util.Collection; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import java.util.concurrent.LinkedBlockingQueue; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -32,47 +34,83 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.apache.isis.applib.events.metamodel.MetamodelListener; +import org.apache.isis.applib.services.bookmark.Bookmark; import org.apache.isis.applib.services.bookmark.BookmarkService; import org.apache.isis.applib.services.factory.FactoryService; +import org.apache.isis.applib.services.iactnlayer.InteractionService; import org.apache.isis.applib.services.repository.RepositoryService; import org.apache.isis.commons.collections.Can; +import org.apache.isis.commons.internal.assertions._Assert; import org.apache.isis.commons.internal.base._NullSafe; +import org.apache.isis.commons.internal.base._Oneshot; +import org.apache.isis.commons.internal.base._Refs; +import org.apache.isis.commons.internal.base._Refs.BooleanAtomicReference; import org.apache.isis.commons.internal.base._Strings; import org.apache.isis.testdomain.jdo.entities.JdoBook; import org.apache.isis.testdomain.jdo.entities.JdoInventory; import org.apache.isis.testdomain.jdo.entities.JdoProduct; import org.apache.isis.testdomain.util.dto.BookDto; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.val; @Service -public class JdoTestFixtures { +public class JdoTestFixtures implements MetamodelListener { @Inject private RepositoryService repository; @Inject private FactoryService factoryService; @Inject private BookmarkService bookmarkService; - - public void cleanUpRepository() { - repository.allInstances(JdoInventory.class).forEach(repository::remove); - repository.allInstances(JdoBook.class).forEach(repository::remove); - repository.allInstances(JdoProduct.class).forEach(repository::remove); + @Inject private InteractionService interactionService; + + @RequiredArgsConstructor + public static class Lock { + private final _Oneshot release = new _Oneshot(); + private final JdoTestFixtures jdoTestFixtures; + public void release() { + release.trigger(()->jdoTestFixtures.release(this)); + } } - public void setUp3Books() { + private BooleanAtomicReference isInstalled = _Refs.booleanAtomicRef(false); - cleanUpRepository(); - // given - expected pre condition: no inventories - assertEquals(0, repository.allInstances(JdoInventory.class).size()); + private LinkedBlockingQueue lockQueue = new LinkedBlockingQueue<>(1); - // setup sample Inventory with 3 Books - SortedSet products = new TreeSet<>(); - BookDto.samples() - .map(JdoBook::fromDto) - .forEach(products::add); + @Override + public void onMetamodelLoaded() { + install(); + } - val inventory = JdoInventory.of("Sample Inventory", products); - repository.persistAndFlush(inventory); + public void install(final Lock lock) { + _Assert.assertEquals(lockQueue.peek(), lock); + install(); + } + + public void reinstall(final Runnable onBeforeInstall) { + isInstalled.compute(isInst->{ + interactionService.runAnonymous(()->{ + cleanUpRepository(); + onBeforeInstall.run(); + setUp3Books(); + }); + return false; + }); + } + + @SneakyThrows + public Lock clearAndAquireLock() { + Lock lock; + lockQueue.put(lock = new Lock(this)); // put next lock on the queue; blocks until space available + clear(); + return lock; + } + + @SneakyThrows + void release(final Lock lock) { + reinstall(()->{}); + lockQueue.take(); // remove lock from queue } public void addABookTo(final JdoInventory inventory) { @@ -81,6 +119,10 @@ public void addABookTo(final JdoInventory inventory) { "Sample Publisher")); } + public Bookmark getJdoInventoryJaxbVmAsBookmark() { + return bookmarkService.bookmarkForElseFail(setUpViewmodelWith3Books()); + } + public JdoInventoryJaxbVm setUpViewmodelWith3Books() { val inventoryJaxbVm = factoryService.viewModel(new JdoInventoryJaxbVm()); val books = inventoryJaxbVm.listBooks(); @@ -140,4 +182,55 @@ public void assertHasPersistenceId(final Object entity) { //System.err.printf("%s%n", bookmark); } + public static Set expectedBookTitles() { + val expectedTitles = Set.of("Dune", "The Foundation", "The Time Machine"); + return expectedTitles; + } + + // -- HELPER + + private void clear() { + + + + isInstalled.computeIfTrue(()->{ + interactionService.runAnonymous(()->{ + cleanUpRepository(); + }); + return false; + }); + } + + private void install() { + isInstalled.computeIfFalse(()->{ + interactionService.runAnonymous(()->{ + cleanUpRepository(); + setUp3Books(); + }); + return true; + }); + } + + private void cleanUpRepository() { + repository.allInstances(JdoInventory.class).forEach(repository::remove); + repository.allInstances(JdoBook.class).forEach(repository::remove); + repository.allInstances(JdoProduct.class).forEach(repository::remove); + } + + private void setUp3Books() { + + // given - expected pre condition: no inventories + assertEquals(0, repository.allInstances(JdoInventory.class).size()); + + // setup sample Inventory with 3 Books + SortedSet products = new TreeSet<>(); + + BookDto.samples() + .map(JdoBook::fromDto) + .forEach(products::add); + + val inventory = JdoInventory.of("Sample Inventory", products); + repository.persistAndFlush(inventory); + } + } diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoBook.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoBook.java index 627633e58e2..783a11e2703 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoBook.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoBook.java @@ -19,6 +19,7 @@ package org.apache.isis.testdomain.jdo.entities; import javax.inject.Inject; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.Discriminator; import javax.jdo.annotations.PersistenceCapable; @@ -54,9 +55,9 @@ @PersistenceCapable //@Inheritance(strategy=InheritanceStrategy.SUPERCLASS_TABLE) @Discriminator(value="Book") +@Named("testdomain.jdo.Book") @DomainObject( - logicalTypeName = "testdomain.jdo.Book" - , entityChangePublishing = Publishing.ENABLED + entityChangePublishing = Publishing.ENABLED , actionDomainEvent = JdoBook.ActionDomainEvent.class , propertyDomainEvent = JdoBook.PropertyDomainEvent.class diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoInventory.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoInventory.java index 43443dcf62b..1518baad19a 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoInventory.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoInventory.java @@ -20,6 +20,7 @@ import java.util.Set; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -43,8 +44,8 @@ @PersistenceCapable(identityType=IdentityType.DATASTORE, schema = "testdomain") @DatastoreIdentity(strategy=IdGeneratorStrategy.IDENTITY, column="id") @Version(strategy= VersionStrategy.DATE_TIME, column="version") +@Named("testdomain.jdo.Inventory") @DomainObject( - logicalTypeName = "testdomain.jdo.Inventory", entityChangePublishing = Publishing.ENABLED) @XmlJavaTypeAdapter(PersistentEntityAdapter.class) @NoArgsConstructor @AllArgsConstructor(staticName = "of") @ToString diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProduct.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProduct.java index e4c6c62643c..571ba601ccf 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProduct.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProduct.java @@ -20,6 +20,7 @@ import java.util.List; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.Discriminator; @@ -52,10 +53,8 @@ @DatastoreIdentity( strategy=javax.jdo.annotations.IdGeneratorStrategy.INCREMENT, column="id") -@DomainObject( - logicalTypeName = "testdomain.jdo.Product" - ) - +@Named("testdomain.jdo.Product") +@DomainObject @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @ToString diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProductComment.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProductComment.java index 811119e543c..1b42fee02d4 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProductComment.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/entities/JdoProductComment.java @@ -20,6 +20,7 @@ import java.sql.Timestamp; +import javax.inject.Named; import javax.jdo.annotations.Column; import javax.jdo.annotations.DatastoreIdentity; import javax.jdo.annotations.IdGeneratorStrategy; @@ -34,8 +35,8 @@ @PersistenceCapable @DatastoreIdentity(strategy=IdGeneratorStrategy.IDENTITY, column="id") -@DomainObject( - logicalTypeName = "testdomain.jdo.ProductComment") +@Named("testdomain.jdo.ProductComment") +@DomainObject public class JdoProductComment implements OnUpdatedByAndAt { @Property @Column(allowsNull = "false") diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryJaxbVm.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryJaxbVm.java index aa44555d217..74231a13f75 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryJaxbVm.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryJaxbVm.java @@ -24,6 +24,7 @@ import java.util.Optional; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -56,10 +57,9 @@ "books", "booksForTab1", "booksForTab2"} ) @XmlAccessorType(XmlAccessType.FIELD) +@Named("testdomain.jpa.JpaInventoryJaxbVm") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "testdomain.jpa.JpaInventoryJaxbVm" -) + nature=Nature.VIEW_MODEL) public class JpaInventoryJaxbVm { @XmlTransient @Inject diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java index ae624a10b15..2da9ba12590 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaBook.java @@ -19,6 +19,7 @@ package org.apache.isis.testdomain.jpa.entities; import javax.inject.Inject; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; @@ -56,9 +57,9 @@ @Entity @EntityListeners(IsisEntityListener.class) @DiscriminatorValue("Book") +@Named("testdomain.jpa.Book") @DomainObject( - logicalTypeName = "testdomain.jpa.Book" - , entityChangePublishing = Publishing.ENABLED + entityChangePublishing = Publishing.ENABLED , actionDomainEvent = JpaBook.ActionDomainEvent.class , propertyDomainEvent = JpaBook.PropertyDomainEvent.class diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaEntityGeneratedLongId.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaEntityGeneratedLongId.java index b437278d8bb..070a10feabc 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaEntityGeneratedLongId.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaEntityGeneratedLongId.java @@ -18,6 +18,7 @@ */ package org.apache.isis.testdomain.jpa.entities; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -34,14 +35,14 @@ import lombok.ToString; @Entity +@Named("testdomain.jpa.GeneratedLongId") @DomainObject( - logicalTypeName = "testdomain.jpa.GeneratedLongId", entityChangePublishing = Publishing.DISABLED) @NoArgsConstructor @ToString public class JpaEntityGeneratedLongId { - public JpaEntityGeneratedLongId(String name) { + public JpaEntityGeneratedLongId(final String name) { this.name = name; } diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaEntityNonGeneratedStringId.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaEntityNonGeneratedStringId.java index 348ca050e1a..87dfd0f2908 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaEntityNonGeneratedStringId.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaEntityNonGeneratedStringId.java @@ -18,6 +18,7 @@ */ package org.apache.isis.testdomain.jpa.entities; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @@ -34,8 +35,8 @@ import lombok.ToString; @Entity +@Named("testdomain.jpa.NonGeneratedStringId") @DomainObject( - logicalTypeName = "testdomain.jpa.NonGeneratedStringId", entityChangePublishing = Publishing.DISABLED) @NoArgsConstructor @AllArgsConstructor diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java index edf2142ec7e..317f39c0007 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaInventory.java @@ -20,6 +20,7 @@ import java.util.Set; +import javax.inject.Named; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; @@ -43,8 +44,8 @@ import lombok.ToString; @Entity +@Named("testdomain.jpa.Inventory") @DomainObject( - logicalTypeName = "testdomain.jpa.Inventory", entityChangePublishing = Publishing.ENABLED) @NamedQuery( name = "JpaInventory.findAffordableProducts", diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java index fe1f252e653..14629ba1173 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProduct.java @@ -20,6 +20,7 @@ import java.util.List; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; @@ -55,8 +56,8 @@ @DiscriminatorColumn( name="product_type", discriminatorType = DiscriminatorType.STRING) -@DomainObject( - logicalTypeName = "testdomain.jpa.Product") +@Named("testdomain.jpa.Product") +@DomainObject @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) @ToString diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java index df5d4dd6fed..17f6cc62aa6 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/entities/JpaProductComment.java @@ -20,6 +20,7 @@ import java.sql.Timestamp; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -36,8 +37,8 @@ import lombok.Setter; @Entity -@DomainObject( - logicalTypeName = "testdomain.jpa.ProductComment") +@Named("testdomain.jpa.ProductComment") +@DomainObject public class JpaProductComment implements OnUpdatedByAndAt { @Id diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/Employee.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/Employee.java index bb4ef35fcb5..4f38187961e 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/Employee.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/Employee.java @@ -18,6 +18,7 @@ */ package org.apache.isis.testdomain.jpa.springdata; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @@ -32,7 +33,8 @@ import lombok.ToString; @Entity -@DomainObject(logicalTypeName = "testdomain.jpa.springdata.Employee") +@Named("testdomain.jpa.springdata.Employee") +@DomainObject @Getter @Setter @ToString @EqualsAndHashCode @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Employee { @@ -45,7 +47,7 @@ public class Employee { private String lastName; - public Employee(String firstName, String lastName) { + public Employee(final String firstName, final String lastName) { this.firstName = firstName; this.lastName = lastName; } diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/EmployeeManager.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/EmployeeManager.java index 14ccace3201..b6d51c2a2a4 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/EmployeeManager.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/springdata/EmployeeManager.java @@ -21,12 +21,14 @@ import java.util.List; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Nature; -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName = "testdomain.jpa.springdata.EmployeeManager") +@Named("testdomain.jpa.springdata.EmployeeManager") +@DomainObject(nature=Nature.VIEW_MODEL) public class EmployeeManager { @Inject private EmployeeRepository employeeRepo; diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/actnsemantics/BlobDemo.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/actnsemantics/BlobDemo.java index 9ff60ee9818..69dae091eb0 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/actnsemantics/BlobDemo.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/actnsemantics/BlobDemo.java @@ -18,6 +18,7 @@ */ package org.apache.isis.testdomain.model.actnsemantics; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -43,7 +44,8 @@ @XmlRootElement(name = "BlobDemo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName="regressiontests.BlobDemo") +@Named("regressiontests.BlobDemo") +@DomainObject(nature=Nature.VIEW_MODEL) @Log4j2 public class BlobDemo { diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidLogicalTypeNameClash.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidLogicalTypeNameClash.java index 4d8097c030d..a23abb3f4c7 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidLogicalTypeNameClash.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidLogicalTypeNameClash.java @@ -23,12 +23,13 @@ import org.apache.isis.applib.annotation.Nature; import org.apache.isis.applib.annotation.Value; -public class InvalidLogicalTypeNameClash { +//TODO this is now captured by Spring - it fails early; remove eventually +class InvalidLogicalTypeNameClash { // logical type name clash: should fail validation - @DomainObject(nature = Nature.VIEW_MODEL, - logicalTypeName = "isis.testdomain.InvalidLogicalTypeNameClash") - public static class VariantA { + //@Named("isis.testdomain.InvalidLogicalTypeNameClash") + @DomainObject(nature = Nature.VIEW_MODEL) + private static class VariantA { @Action public boolean anAction() { @@ -38,9 +39,9 @@ public boolean anAction() { } // logical type name clash: should fail validation - @DomainObject(nature = Nature.VIEW_MODEL, - logicalTypeName = "isis.testdomain.InvalidLogicalTypeNameClash") - public static class VariantB { + //@Named("isis.testdomain.InvalidLogicalTypeNameClash") + @DomainObject(nature = Nature.VIEW_MODEL) + private static class VariantB { @Action public boolean anAction() { @@ -50,11 +51,10 @@ public boolean anAction() { } // logical type name clash: should fail validation - @Value( - logicalTypeName = "isis.testdomain.InvalidLogicalTypeNameClash") - public static class VariantC { + //@Named("isis.testdomain.InvalidLogicalTypeNameClash") + @Value + private static class VariantC { } - } diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidObjectWithAlias.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidObjectWithAlias.java new file mode 100644 index 00000000000..5a02801f1fa --- /dev/null +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidObjectWithAlias.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.testdomain.model.bad; + +import javax.inject.Named; + +import org.joda.time.LocalDateTime; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Nature; + +@Named("testdomain.InvalidObjectWithAlias") +@DomainObject(nature = Nature.VIEW_MODEL, + aliased = { + "testdomain.v0.InvalidObjectWithAlias", + "testdomain.v0.InvalidServiceWithAlias", // <-- expected collision (validation error) + }) +public class InvalidObjectWithAlias { + + @Action public LocalDateTime now() { + return LocalDateTime.now(); + } + +} diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidServiceWithAlias.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidServiceWithAlias.java new file mode 100644 index 00000000000..3c28e944206 --- /dev/null +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidServiceWithAlias.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.testdomain.model.bad; + +import javax.inject.Named; + +import org.joda.time.LocalDateTime; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.NatureOfService; + +@Named("testdomain.InvalidServiceWithAlias") +@DomainService(nature = NatureOfService.VIEW, + aliased = { + "testdomain.v0.InvalidServiceWithAlias", + "testdomain.v0.InvalidObjectWithAlias", // <-- expected collision (validation error) + }) +public class InvalidServiceWithAlias { + + @Action public LocalDateTime now() { + return LocalDateTime.now(); + } + +} diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ElementTypeConcrete.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ElementTypeConcrete.java index 7e46ed7cd24..7b39b16cce7 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ElementTypeConcrete.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ElementTypeConcrete.java @@ -18,9 +18,12 @@ */ package org.apache.isis.testdomain.model.good; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; -@DomainObject(logicalTypeName = "isis.testdomain.ElementTypeConcrete") +@Named("isis.testdomain.ElementTypeConcrete") +@DomainObject public class ElementTypeConcrete extends ElementTypeAbstract implements ElementTypeInterface { diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface.java index 6e7ebc45cdb..e80d14b2b7b 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface.java @@ -18,10 +18,11 @@ */ package org.apache.isis.testdomain.model.good; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.annotation.Property; -@LogicalTypeName("isis.testdomain.ProperInterface") +@Named("isis.testdomain.ProperInterface") public interface ProperInterface { // -- read/write exemplar diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface2.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface2.java index 5d15fd5ce6f..d9d03bf0c5a 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface2.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperInterface2.java @@ -18,10 +18,11 @@ */ package org.apache.isis.testdomain.model.good; -import org.apache.isis.applib.annotation.LogicalTypeName; +import javax.inject.Named; + import org.apache.isis.applib.annotation.Property; -@LogicalTypeName("isis.testdomain.ProperInterface2") +@Named("isis.testdomain.ProperInterface2") public interface ProperInterface2 extends ProperInterface { diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperObjectWithAlias.java similarity index 58% rename from persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java rename to regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperObjectWithAlias.java index bc5942e3b30..031cd01e49a 100644 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperObjectWithAlias.java @@ -16,20 +16,26 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator; +package org.apache.isis.testdomain.model.good; -import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; +import javax.inject.Named; -public class LogicalTypeFacetFromJdoDiscriminatorValueAnnotation -extends LogicalTypeFacetAbstract { +import org.joda.time.LocalDateTime; - public LogicalTypeFacetFromJdoDiscriminatorValueAnnotation( - final LogicalType logicalType, - final FacetHolder holder) { - super(logicalType, holder); +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.applib.annotation.Nature; + +@Named("testdomain.ProperObjectWithAlias") +@DomainObject(nature = Nature.VIEW_MODEL, + aliased = { + "testdomain.v1.ProperObjectWithAlias", + "testdomain.v2.ProperObjectWithAlias", + }) +public class ProperObjectWithAlias { + + @Action public LocalDateTime now() { + return LocalDateTime.now(); } } - diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperServiceWithAlias.java similarity index 57% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java rename to regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperServiceWithAlias.java index 8e43e636def..2735c2090c5 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/good/ProperServiceWithAlias.java @@ -16,21 +16,26 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.core.metamodel.facets.object.logicaltype.classname; +package org.apache.isis.testdomain.model.good; -import org.apache.isis.applib.id.LogicalType; -import org.apache.isis.core.metamodel.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; +import javax.inject.Named; -/** - * @since 2.0 - */ -public class LogicalTypeFacetFromIoCNamingStrategy -extends LogicalTypeFacetAbstract { +import org.joda.time.LocalDateTime; + +import org.apache.isis.applib.annotation.Action; +import org.apache.isis.applib.annotation.DomainService; +import org.apache.isis.applib.annotation.NatureOfService; + +@Named("testdomain.ProperServiceWithAlias") +@DomainService(nature = NatureOfService.VIEW, + aliased = { + "testdomain.v1.ProperServiceWithAlias", + "testdomain.v2.ProperServiceWithAlias", + }) +public class ProperServiceWithAlias { - LogicalTypeFacetFromIoCNamingStrategy( - final LogicalType logicalType, final FacetHolder holder) { - super(logicalType, holder, Precedence.INFERRED); + @Action public LocalDateTime now() { + return LocalDateTime.now(); } } diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionDemo.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionDemo.java index a596c11e8c6..06083cdaf2f 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionDemo.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionDemo.java @@ -23,6 +23,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -51,7 +52,8 @@ @XmlRootElement(name = "InteractionDemo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName="regressiontests.InteractionDemo", editing=Editing.ENABLED) +@Named("regressiontests.InteractionDemo") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) public class InteractionDemo { @Property( diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo.java index 9afe283e13d..5ecad02dd45 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/interaction/InteractionNpmDemo.java @@ -18,6 +18,7 @@ */ package org.apache.isis.testdomain.model.interaction; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -34,7 +35,8 @@ @XmlRootElement(name = "InteractionNpmDemo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName="regressiontests.InteractionNpmDemo", editing=Editing.ENABLED) +@Named("regressiontests.InteractionNpmDemo") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) public class InteractionNpmDemo { } diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/layout/LayoutDemo.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/layout/LayoutDemo.java index ec72849a1e0..71078bc587e 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/layout/LayoutDemo.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/layout/LayoutDemo.java @@ -18,6 +18,7 @@ */ package org.apache.isis.testdomain.model.layout; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -36,7 +37,8 @@ @XmlRootElement(name = "LayoutDemo") @XmlType @XmlAccessorType(XmlAccessType.FIELD) -@DomainObject(nature=Nature.VIEW_MODEL, logicalTypeName="regressiontests.LayoutDemo", editing=Editing.ENABLED) +@Named("regressiontests.LayoutDemo") +@DomainObject(nature=Nature.VIEW_MODEL, editing=Editing.ENABLED) public class LayoutDemo { @Property diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExample.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExample.java index 3e5d2000597..47bf9d29847 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExample.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExample.java @@ -35,6 +35,8 @@ import java.util.UUID; import java.util.stream.Stream; +import javax.inject.Named; + import org.apache.isis.applib.annotation.Action; import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.DomainObject; @@ -91,8 +93,8 @@ public final Class getValueType() { // -- EXAMPLES - BASIC + @Named("isis.testdomain.valuetypes.ValueTypeExampleBoolean") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleBoolean", nature = Nature.BEAN) public static class ValueTypeExampleBoolean extends ValueTypeExample { @@ -102,8 +104,8 @@ public static class ValueTypeExampleBoolean private Boolean updateValue = Boolean.FALSE; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleCharacter") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleCharacter", nature = Nature.BEAN) public static class ValueTypeExampleCharacter extends ValueTypeExample { @@ -113,8 +115,8 @@ public static class ValueTypeExampleCharacter private Character updateValue = 'b'; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleString") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleString", nature = Nature.BEAN) public static class ValueTypeExampleString extends ValueTypeExample { @@ -124,8 +126,8 @@ public static class ValueTypeExampleString private String updateValue = "anotherString"; } + @Named("isis.testdomain.valuetypes.ValueTypeExamplePassword") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExamplePassword", nature = Nature.BEAN) public static class ValueTypeExamplePassword extends ValueTypeExample { @@ -135,8 +137,8 @@ public static class ValueTypeExamplePassword private Password updateValue = Password.of("anotherPassword"); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleBufferedImage") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleBufferedImage", nature = Nature.BEAN) public static class ValueTypeExampleBufferedImage extends ValueTypeExample { @@ -147,8 +149,8 @@ public static class ValueTypeExampleBufferedImage private BufferedImage updateValue = new BufferedImage(8, 8, BufferedImage.TYPE_INT_RGB); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleBlob") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleBlob", nature = Nature.BEAN) public static class ValueTypeExampleBlob extends ValueTypeExample { @@ -158,8 +160,8 @@ public static class ValueTypeExampleBlob private Blob updateValue = Blob.of("anotherBlob", CommonMimeType.BIN, new byte[] {3, 4}); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleClob") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleClob", nature = Nature.BEAN) public static class ValueTypeExampleClob extends ValueTypeExample { @@ -169,8 +171,8 @@ public static class ValueTypeExampleClob private Clob updateValue = Clob.of("anotherClob", CommonMimeType.TXT, "ef"); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleLocalResourcePath") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleLocalResourcePath", nature = Nature.BEAN) public static class ValueTypeExampleLocalResourcePath extends ValueTypeExample { @@ -180,8 +182,8 @@ public static class ValueTypeExampleLocalResourcePath private LocalResourcePath updateValue = new LocalResourcePath("img/b"); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleUrl") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleUrl", nature = Nature.BEAN) public static class ValueTypeExampleUrl extends ValueTypeExample { @@ -195,8 +197,8 @@ private static URL url(final String url) { } } + @Named("isis.testdomain.valuetypes.ValueTypeExampleMarkup") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleMarkup", nature = Nature.BEAN) public static class ValueTypeExampleMarkup extends ValueTypeExample { @@ -206,8 +208,8 @@ public static class ValueTypeExampleMarkup private Markup updateValue = Markup.valueOf("anotherMarkup"); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleUuid") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleUuid", nature = Nature.BEAN) public static class ValueTypeExampleUuid extends ValueTypeExample { @@ -217,8 +219,8 @@ public static class ValueTypeExampleUuid private UUID updateValue = UUID.randomUUID(); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleLocale") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleLocale", nature = Nature.BEAN) public static class ValueTypeExampleLocale extends ValueTypeExample { @@ -230,8 +232,8 @@ public static class ValueTypeExampleLocale // -- EXAMPLES - NUMBERS + @Named("isis.testdomain.valuetypes.ValueTypeExampleByte") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleByte", nature = Nature.BEAN) public static class ValueTypeExampleByte extends ValueTypeExample { @@ -241,8 +243,8 @@ public static class ValueTypeExampleByte private Byte updateValue = 0; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleShort") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleShort", nature = Nature.BEAN) public static class ValueTypeExampleShort extends ValueTypeExample { @@ -252,8 +254,8 @@ public static class ValueTypeExampleShort private Short updateValue = 0; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleInteger") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleInteger", nature = Nature.BEAN) public static class ValueTypeExampleInteger extends ValueTypeExample { @@ -263,8 +265,8 @@ public static class ValueTypeExampleInteger private Integer updateValue = 0; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleLong") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleLong", nature = Nature.BEAN) public static class ValueTypeExampleLong extends ValueTypeExample { @@ -274,8 +276,8 @@ public static class ValueTypeExampleLong private Long updateValue = 0L; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleFloat") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleFloat", nature = Nature.BEAN) public static class ValueTypeExampleFloat extends ValueTypeExample { @@ -285,8 +287,8 @@ public static class ValueTypeExampleFloat private Float updateValue = 0.f; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleDouble") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleDouble", nature = Nature.BEAN) public static class ValueTypeExampleDouble extends ValueTypeExample { @@ -296,8 +298,8 @@ public static class ValueTypeExampleDouble private Double updateValue = 0.; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleBigInteger") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleBigInteger", nature = Nature.BEAN) public static class ValueTypeExampleBigInteger extends ValueTypeExample { @@ -307,8 +309,8 @@ public static class ValueTypeExampleBigInteger private BigInteger updateValue = BigInteger.ZERO; } + @Named("isis.testdomain.valuetypes.ValueTypeExampleBigDecimal") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleBigDecimal", nature = Nature.BEAN) public static class ValueTypeExampleBigDecimal extends ValueTypeExample { @@ -320,8 +322,8 @@ public static class ValueTypeExampleBigDecimal // -- EXAMPLES - TEMPORAL - LEGACY + @Named("isis.testdomain.valuetypes.ValueTypeExampleJavaUtilDate") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleJavaUtilDate", nature = Nature.BEAN) public static class ValueTypeExampleJavaUtilDate extends ValueTypeExample { @@ -331,8 +333,8 @@ public static class ValueTypeExampleJavaUtilDate private java.util.Date updateValue = new java.util.Date(0L); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleJavaSqlDate") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleJavaSqlDate", nature = Nature.BEAN) public static class ValueTypeExampleJavaSqlDate extends ValueTypeExample { @@ -342,8 +344,8 @@ public static class ValueTypeExampleJavaSqlDate private java.sql.Date updateValue = new java.sql.Date(0L); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleJavaSqlTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleJavaSqlTime", nature = Nature.BEAN) public static class ValueTypeExampleJavaSqlTime extends ValueTypeExample { @@ -353,8 +355,8 @@ public static class ValueTypeExampleJavaSqlTime private java.sql.Time updateValue = new java.sql.Time(0L); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleTimestamp") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleTimestamp", nature = Nature.BEAN) public static class ValueTypeExampleTimestamp extends ValueTypeExample { @@ -366,8 +368,8 @@ public static class ValueTypeExampleTimestamp // -- EXAMPLES - TEMPORAL - JAVA TIME + @Named("isis.testdomain.valuetypes.ValueTypeExampleLocalDate") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleLocalDate", nature = Nature.BEAN) public static class ValueTypeExampleLocalDate extends ValueTypeExample { @@ -377,8 +379,8 @@ public static class ValueTypeExampleLocalDate private LocalDate updateValue = LocalDate.now().plusDays(2); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleLocalDateTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleLocalDateTime", nature = Nature.BEAN) public static class ValueTypeExampleLocalDateTime extends ValueTypeExample { @@ -388,8 +390,9 @@ public static class ValueTypeExampleLocalDateTime private LocalDateTime updateValue = LocalDateTime.now().plusDays(2).plusSeconds(15); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleLocalTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleLocalTime", + nature = Nature.BEAN) public static class ValueTypeExampleLocalTime extends ValueTypeExample { @@ -399,8 +402,8 @@ public static class ValueTypeExampleLocalTime private LocalTime updateValue = LocalTime.now().plusSeconds(15); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleOffsetDateTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleOffsetDateTime", nature = Nature.BEAN) public static class ValueTypeExampleOffsetDateTime extends ValueTypeExample { @@ -410,8 +413,8 @@ public static class ValueTypeExampleOffsetDateTime private OffsetDateTime updateValue = OffsetDateTime.now().plusDays(2).plusSeconds(15); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleOffsetTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleOffsetTime", nature = Nature.BEAN) public static class ValueTypeExampleOffsetTime extends ValueTypeExample { @@ -421,8 +424,8 @@ public static class ValueTypeExampleOffsetTime private OffsetTime updateValue = OffsetTime.now().plusSeconds(15); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleZonedDateTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleZonedDateTime", nature = Nature.BEAN) public static class ValueTypeExampleZonedDateTime extends ValueTypeExample { @@ -434,8 +437,8 @@ public static class ValueTypeExampleZonedDateTime // -- EXAMPLES - TEMPORAL - JODA TIME + @Named("isis.testdomain.valuetypes.ValueTypeExampleJodaDateTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleJodaDateTime", nature = Nature.BEAN) public static class ValueTypeExampleJodaDateTime extends ValueTypeExample { @@ -445,8 +448,8 @@ public static class ValueTypeExampleJodaDateTime private org.joda.time.DateTime updateValue = org.joda.time.DateTime.now().plusDays(2).plusSeconds(15); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleJodaLocalDateTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleJodaLocalDateTime", nature = Nature.BEAN) public static class ValueTypeExampleJodaLocalDateTime extends ValueTypeExample { @@ -456,8 +459,8 @@ public static class ValueTypeExampleJodaLocalDateTime private org.joda.time.LocalDateTime updateValue = org.joda.time.LocalDateTime.now().plusDays(2).plusSeconds(15); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleJodaLocalDate") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleJodaLocalDate", nature = Nature.BEAN) public static class ValueTypeExampleJodaLocalDate extends ValueTypeExample { @@ -467,8 +470,8 @@ public static class ValueTypeExampleJodaLocalDate private org.joda.time.LocalDate updateValue = org.joda.time.LocalDate.now().plusDays(2); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleJodaLocalTime") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleJodaLocalTime", nature = Nature.BEAN) public static class ValueTypeExampleJodaLocalTime extends ValueTypeExample { @@ -480,8 +483,8 @@ public static class ValueTypeExampleJodaLocalTime // -- EXAMPLES - META MODEL + @Named("isis.testdomain.valuetypes.ValueTypeExampleApplicationFeatureId") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleApplicationFeatureId", nature = Nature.BEAN) public static class ValueTypeExampleApplicationFeatureId extends ValueTypeExample { @@ -495,7 +498,7 @@ public static class ValueTypeExampleApplicationFeatureId //TODO TreeNode // @DomainObject( -// logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleTreeNode", +// @Named("isis.testdomain.valuetypes.ValueTypeExampleTreeNode", // nature = Nature.BEAN) public static class ValueTypeExampleTreeNode extends ValueTypeExample> { @@ -521,8 +524,8 @@ public static enum ExampleEnum { HALLO, WORLD } + @Named("isis.testdomain.valuetypes.ValueTypeExampleEnum") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleEnum", nature = Nature.BEAN) public static class ValueTypeExampleEnum extends ValueTypeExample { @@ -534,8 +537,8 @@ public static class ValueTypeExampleEnum // -- EXAMPLES - COMPOSITES + @Named("isis.testdomain.valuetypes.ValueTypeExampleCalendarEvent") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleCalendarEvent", nature = Nature.BEAN) public static class ValueTypeExampleCalendarEvent extends ValueTypeExample { @@ -549,8 +552,8 @@ public static class ValueTypeExampleCalendarEvent // -- EXAMPLES - OTHER + @Named("isis.testdomain.valuetypes.ValueTypeExampleBookmark") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleBookmark", nature = Nature.BEAN) public static class ValueTypeExampleBookmark extends ValueTypeExample { @@ -560,8 +563,8 @@ public static class ValueTypeExampleBookmark private Bookmark updateValue = Bookmark.parseElseFail("c:d"); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleOidDto") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleOidDto", nature = Nature.BEAN) public static class ValueTypeExampleOidDto extends ValueTypeExample { @@ -571,8 +574,8 @@ public static class ValueTypeExampleOidDto private OidDto updateValue = Bookmark.parseElseFail("c:d").toOidDto(); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleChangesDto") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleChangesDto", nature = Nature.BEAN) public static class ValueTypeExampleChangesDto extends ValueTypeExample { @@ -582,8 +585,8 @@ public static class ValueTypeExampleChangesDto private ChangesDto updateValue = new ChangesDto(); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleCommandDto") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleCommandDto", nature = Nature.BEAN) public static class ValueTypeExampleCommandDto extends ValueTypeExample { @@ -593,8 +596,8 @@ public static class ValueTypeExampleCommandDto private CommandDto updateValue = new CommandDto(); } + @Named("isis.testdomain.valuetypes.ValueTypeExampleInteractionDto") @DomainObject( - logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleInteractionDto", nature = Nature.BEAN) public static class ValueTypeExampleInteractionDto extends ValueTypeExample { diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/composite/CalendarEventJaxbVm.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/composite/CalendarEventJaxbVm.java index 5a5885cd9f3..0516a8a984f 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/composite/CalendarEventJaxbVm.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/composite/CalendarEventJaxbVm.java @@ -20,6 +20,7 @@ import java.util.List; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -50,10 +51,9 @@ propOrder = {"nextEvent", "events"} ) @XmlAccessorType(XmlAccessType.FIELD) +@Named("testdomain.val.CalendarEventJaxbVm") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "testdomain.val.CalendarEventJaxbVm" -) + nature=Nature.VIEW_MODEL) public class CalendarEventJaxbVm { @Property(editing = Editing.ENABLED) diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJdo.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJdo.java index 8b7bcb68990..8c73bbbbcb4 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJdo.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/publishing/PublishingTestFactoryJdo.java @@ -18,14 +18,12 @@ */ package org.apache.isis.testdomain.publishing; -import java.util.HashSet; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import javax.inject.Inject; import javax.inject.Named; -import javax.jdo.JDOHelper; import javax.jdo.PersistenceManagerFactory; import org.springframework.context.annotation.Import; @@ -41,20 +39,17 @@ import org.apache.isis.applib.services.wrapper.control.SyncControl; import org.apache.isis.applib.services.xactn.TransactionService; import org.apache.isis.commons.collections.Can; -import org.apache.isis.commons.internal.debug._Probe; import org.apache.isis.commons.internal.exceptions._Exceptions; import org.apache.isis.commons.internal.functions._Functions.CheckedConsumer; import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction; import org.apache.isis.core.metamodel.interactions.managed.PropertyInteraction; import org.apache.isis.core.metamodel.objectmanager.ObjectManager; import org.apache.isis.core.metamodel.spec.ManagedObject; -import org.apache.isis.testdomain.jdo.JdoTestDomainPersona; +import org.apache.isis.testdomain.jdo.JdoTestFixtures; +import org.apache.isis.testdomain.jdo.JdoTestFixtures.Lock; import org.apache.isis.testdomain.jdo.entities.JdoBook; -import org.apache.isis.testdomain.jdo.entities.JdoInventory; -import org.apache.isis.testdomain.jdo.entities.JdoProduct; import org.apache.isis.testdomain.publishing.PublishingTestFactoryAbstract.CommitListener; import org.apache.isis.testdomain.util.dto.BookDto; -import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts; import static org.apache.isis.applib.services.wrapper.control.AsyncControl.returningVoid; @@ -75,9 +70,9 @@ public class PublishingTestFactoryJdo private final RepositoryService repository; private final WrapperFactory wrapper; private final ObjectManager objectManager; - private final FixtureScripts fixtureScripts; private final CommitListener commitListener; private final FactoryService factoryService; + private final JdoTestFixtures jdoTestFixtures; @Getter(onMethod_ = {@Override}, value = AccessLevel.PROTECTED) private final InteractionService interactionService; @@ -87,12 +82,16 @@ public class PublishingTestFactoryJdo @Named("transaction-aware-pmf-proxy") private final PersistenceManagerFactory pmf; + private Lock lock = null; // -- TEST SETUP @Override protected void releaseContext(final PublishingTestContext context) { - + if(lock!=null) { + lock.release(); + lock = null; + } } @Override @@ -106,7 +105,7 @@ protected void setupEntity(final PublishingTestContext context) { case ENTITY_PERSISTING: // given - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); + lock = jdoTestFixtures.clearAndAquireLock(); break; case ENTITY_LOADING: @@ -115,7 +114,7 @@ protected void setupEntity(final PublishingTestContext context) { case ENTITY_REMOVAL: // given - setupBookForJdo(); + //jdoTestFixtures.install(lock); break; default: throw _Exceptions.unmatchedCase(context.getScenario()); @@ -146,7 +145,7 @@ protected void programmaticExecution( context.runGiven(); //when - setupBookForJdo(); + jdoTestFixtures.install(lock); break; case ENTITY_LOADING: @@ -400,37 +399,6 @@ protected void wrapperAsyncExecutionWithRules( // -- TEST SETUP - private void setupBookForJdo() { - - val pm = pmf.getPersistenceManager(); - - // cleanup - fixtureScripts.runPersona(JdoTestDomainPersona.PurgeAll); - - // given Inventory with 1 Book - - val products = new HashSet(); - - val detachedNewBook = JdoBook.fromDto(BookDto.sample()); - - products.add(detachedNewBook); - - val inventory = JdoInventory.of("Sample Inventory", products); - pm.makePersistent(inventory); - - inventory.getProducts().forEach(product->{ - val prod = pm.makePersistent(product); - - _Probe.errOut("PROD ID: %s", JDOHelper.getObjectId(prod)); - - }); - - //fixtureScripts.runPersona(JdoTestDomainPersona.InventoryWith1Book); - - pm.flush(); - - } - @SneakyThrows private void withBookDo(final CheckedConsumer transactionalBookConsumer) { val book = repository.allInstances(JdoBook.class).listIterator().next(); diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/rest/RestEndpointService.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/rest/RestEndpointService.java index 833b3e001b7..6982836332e 100644 --- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/rest/RestEndpointService.java +++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/util/rest/RestEndpointService.java @@ -29,10 +29,13 @@ import org.springframework.stereotype.Service; import org.apache.isis.applib.client.SuppressionType; +import org.apache.isis.applib.services.iactnlayer.InteractionService; import org.apache.isis.commons.collections.Can; import org.apache.isis.commons.functional.Try; import org.apache.isis.core.config.RestEasyConfiguration; import org.apache.isis.core.config.viewer.web.WebAppContextPath; +import org.apache.isis.testdomain.jdo.JdoInventoryJaxbVm; +import org.apache.isis.testdomain.jdo.JdoTestFixtures; import org.apache.isis.testdomain.jdo.entities.JdoBook; import org.apache.isis.testdomain.ldap.LdapConstants; import org.apache.isis.testdomain.util.dto.BookDto; @@ -41,26 +44,20 @@ import org.apache.isis.viewer.restfulobjects.client.log.ClientConversationFilter; import lombok.NonNull; +import lombok.RequiredArgsConstructor; import lombok.val; import lombok.extern.log4j.Log4j2; @Service @Log4j2 +@RequiredArgsConstructor(onConstructor_ = {@Inject}) public class RestEndpointService { private final Environment environment; private final RestEasyConfiguration restEasyConfiguration; private final WebAppContextPath webAppContextPath; - - @Inject - public RestEndpointService( - final Environment environment, - final RestEasyConfiguration restEasyConfiguration, - final WebAppContextPath webAppContextPath) { - this.environment = environment; - this.restEasyConfiguration = restEasyConfiguration; - this.webAppContextPath = webAppContextPath; - } + private final JdoTestFixtures jdoTestFixtures; + private final InteractionService interactionService; public int getPort() { if(port==null) { @@ -69,7 +66,7 @@ public int getPort() { return port; } - private static final String INVENTORY_RESOURCE = "services/testdomain.jdo.InventoryResource"; + private static final String INVENTORY_RESOURCE = "services/testdomain.jdo.InventoryResourceAlias"; // -- NEW CLIENT @@ -85,7 +82,8 @@ public RestfulClient newClient( val restRootPath = String.format("http://localhost:%d%s/", getPort(), - webAppContextPath.prependContextPath(this.restEasyConfiguration.getJaxrs().getDefaultPath()) + webAppContextPath + .prependContextPath(this.restEasyConfiguration.getJaxrs().getDefaultPath()) ); log.debug("new restful client created for {}", restRootPath); @@ -111,15 +109,16 @@ public RestfulClient newClient( // -- NEW REQUEST BUILDER - public Invocation.Builder newInvocationBuilder(final RestfulClient client, final String actionPath) { - return client.request(actionPath, SuppressionType.ALL); + public Invocation.Builder newInvocationBuilder(final RestfulClient client, final String endpointPath) { + return client.request(endpointPath, SuppressionType.ALL); } // -- ENDPOINTS public Try getRecommendedBookOfTheWeek(final RestfulClient client) { - val request = newInvocationBuilder(client, INVENTORY_RESOURCE + "/actions/recommendedBookOfTheWeek/invoke"); + val request = newInvocationBuilder(client, + INVENTORY_RESOURCE + "/actions/recommendedBookOfTheWeek/invoke"); val args = client.arguments() .build(); @@ -131,7 +130,8 @@ public Try getRecommendedBookOfTheWeek(final RestfulClient client) { public Try getRecommendedBookOfTheWeekDto(final RestfulClient client) { - val request = newInvocationBuilder(client, INVENTORY_RESOURCE + "/actions/recommendedBookOfTheWeekDto/invoke"); + val request = newInvocationBuilder(client, + INVENTORY_RESOURCE + "/actions/recommendedBookOfTheWeekDto/invoke"); val args = client.arguments() .build(); @@ -143,7 +143,8 @@ public Try getRecommendedBookOfTheWeekDto(final RestfulClient client) { public Try> getMultipleBooks(final RestfulClient client) throws JAXBException { - val request = newInvocationBuilder(client, INVENTORY_RESOURCE + "/actions/multipleBooks/invoke"); + val request = newInvocationBuilder(client, + INVENTORY_RESOURCE + "/actions/multipleBooks/invoke"); val args = client.arguments() .addActionParameter("nrOfBooks", 2) .build(); @@ -157,7 +158,8 @@ public Try> getMultipleBooks(final RestfulClient client) throws JAX public Try storeBook(final RestfulClient client, final JdoBook newBook) throws JAXBException { - val request = newInvocationBuilder(client, INVENTORY_RESOURCE + "/actions/storeBook/invoke"); + val request = newInvocationBuilder(client, + INVENTORY_RESOURCE + "/actions/storeBook/invoke"); val args = client.arguments() .addActionParameter("newBook", BookDto.from(newBook).encode()) .build(); @@ -170,7 +172,8 @@ public Try storeBook(final RestfulClient client, final JdoBook newBook) public Try getRecommendedBookOfTheWeekAsDto(final RestfulClient client) { - val request = newInvocationBuilder(client, INVENTORY_RESOURCE + "/actions/recommendedBookOfTheWeekAsDto/invoke"); + val request = newInvocationBuilder(client, + INVENTORY_RESOURCE + "/actions/recommendedBookOfTheWeekAsDto/invoke"); val args = client.arguments() .build(); @@ -182,7 +185,8 @@ public Try getRecommendedBookOfTheWeekAsDto(final RestfulClient client) public Try> getMultipleBooksAsDto(final RestfulClient client) throws JAXBException { - val request = newInvocationBuilder(client, INVENTORY_RESOURCE + "/actions/multipleBooksAsDto/invoke"); + val request = newInvocationBuilder(client, + INVENTORY_RESOURCE + "/actions/multipleBooksAsDto/invoke"); val args = client.arguments() .addActionParameter("nrOfBooks", 2) .build(); @@ -193,10 +197,41 @@ public Try> getMultipleBooksAsDto(final RestfulClient client) throw return digest; } + public Try getInventoryAsJaxbVm(final RestfulClient client) { + + val request = newInvocationBuilder(client, + INVENTORY_RESOURCE + "/actions/inventoryAsJaxbVm/invoke"); + val args = client.arguments() + .build(); + + val response = request.post(args); + val digest = client.digest(response, JdoInventoryJaxbVm.class); + return digest; + } + + public Try> getBooksFromInventoryAsJaxbVm(final RestfulClient client) { + + val objectId = interactionService.callAnonymous( + ()->jdoTestFixtures.getJdoInventoryJaxbVmAsBookmark().getIdentifier()); + + // using domain object alias ... + val request = newInvocationBuilder(client, + "objects/testdomain.jdo.JdoInventoryJaxbVmAlias/" + + objectId + "/actions/listBooks/invoke"); + + val args = client.arguments() + .build(); + + val response = request.post(args); + val digest = client.digestList(response, JdoBook.class, new GenericType>() {}); + + return digest; + } public Try getHttpSessionInfo(final RestfulClient client) { - val request = newInvocationBuilder(client, INVENTORY_RESOURCE + "/actions/httpSessionInfo/invoke"); + val request = newInvocationBuilder(client, + INVENTORY_RESOURCE + "/actions/httpSessionInfo/invoke"); val args = client.arguments() .build(); @@ -206,7 +241,6 @@ public Try getHttpSessionInfo(final RestfulClient client) { return digest; } - // -- HELPER private Integer port; @@ -216,5 +250,4 @@ private void init() { port = Integer.parseInt(environment.getProperty("local.server.port")); } - } diff --git a/security/adoc/modules/ROOT/pages/about.adoc b/security/adoc/modules/ROOT/pages/about.adoc index 37fed9373ae..12ca5afbd1f 100644 --- a/security/adoc/modules/ROOT/pages/about.adoc +++ b/security/adoc/modules/ROOT/pages/about.adoc @@ -51,10 +51,10 @@ A further aspect of security is auditing: recording what data was modified by wh Apache Isis provides the xref:refguide:applib:index/services/iactn/InteractionContext.adoc[InteractionContext] can be used to track the actions being invoked, and the xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber] captures what data was modified as a result (auditing). When xref:refguide:applib:index/services/iactn/Interaction.adoc[Interaction]s are persisted (eg by way of the xref:mappings:outbox-publisher:about.adoc[Outbox Publisher] mapping module) then this provides excellent traceability. -The xref:security:audit-trail:about.adoc[Audit Trail] module provides an implementation of the xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber] that persists audit entries to the database. +The xref:security:audittrail:about.adoc[Audit Trail] module provides an implementation of the xref:refguide:applib:index/services/publishing/spi/EntityPropertyChangeSubscriber.adoc[EntityPropertyChangeSubscriber] that persists audit entries to the database. For xref:refguide:applib:index/services/publishing/spi/CommandSubscriber.adoc[CommandSubscriber] SPI can be also be used to capture actions. -The xref:userguide:command-log:about.adoc[Command Log] extension provides a simple implementation of this SPI. +The xref:userguide:commandlog:about.adoc[Command Log] extension provides a simple implementation of this SPI. == Programmers' API diff --git a/security/adoc/modules/ROOT/partials/extensions.adoc b/security/adoc/modules/ROOT/partials/extensions.adoc index e60b6aab2e8..cfa9a0f37d5 100644 --- a/security/adoc/modules/ROOT/partials/extensions.adoc +++ b/security/adoc/modules/ROOT/partials/extensions.adoc @@ -1,5 +1,5 @@ include::security:shiro-realm-ldap:partial$module-nav.adoc[] include::security:spring-oauth2:partial$module-nav.adoc[] include::security:secman:partial$module-nav.adoc[] -include::security:audit-trail:partial$module-nav.adoc[] -include::security:session-log:partial$module-nav.adoc[] +include::security:audittrail:partial$module-nav.adoc[] +include::security:sessionlog:partial$module-nav.adoc[] diff --git a/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/ArchitectureDomainRules.java b/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/ArchitectureDomainRules.java index 8a052bd55b7..0d324d3abb9 100644 --- a/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/ArchitectureDomainRules.java +++ b/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/ArchitectureDomainRules.java @@ -26,7 +26,6 @@ import java.util.function.Predicate; import javax.inject.Inject; -import javax.inject.Named; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @@ -58,7 +57,6 @@ import org.apache.isis.applib.annotation.DomainServiceLayout; import org.apache.isis.applib.annotation.Nature; import org.apache.isis.applib.annotation.Property; -import org.apache.isis.commons.internal.base._Strings; import lombok.val; import lombok.experimental.UtilityClass; @@ -73,15 +71,16 @@ @UtilityClass public class ArchitectureDomainRules { - /** - * This rule requires that classes annotated with the {@link DomainObject} annotation must specify their - * {@link DomainObject#logicalTypeName() logicalTypeName}. - */ - public static ArchRule every_DomainObject_must_specify_logicalTypeName() { + /* + * This rule requires that classes annotated with the {@link DomainObject} annotation must specify a + * {@link Named#value() logicalTypeName}. + * TODO we deprecated DomainObject#logicalTypeName + *//* + public static ArchRule every_DomainObject_must_specify_named() { return classes() .that().areAnnotatedWith(DomainObject.class) .should().beAnnotatedWith(DomainObject_logicalTypeName()); - } + }*/ // Spring takes care of naming Beans it manages! // /** @@ -107,31 +106,14 @@ public static ArchRule every_logicalTypeName_must_be_unique() { .and(new DescribedPredicate<>("have an logicalTypeName") { @Override public boolean apply(final JavaClass javaClass) { - val domainObjectIfAny = javaClass.tryGetAnnotationOfType(DomainObject.class); - if (domainObjectIfAny.isPresent() && !_Strings.isNullOrEmpty(domainObjectIfAny.get().logicalTypeName())) { - return true; - } - val namedIfAny = javaClass.tryGetAnnotationOfType(Named.class); - if (namedIfAny.isPresent() && !_Strings.isNullOrEmpty(namedIfAny.get().value())) { - return true; - } - - return false; + return _LogicalNaming.hasExplicitLogicalName(javaClass); } }) .should(new ArchCondition<>("be unique") { @Override public void check(final JavaClass javaClass, final ConditionEvents conditionEvents) { - val domainObjectIfAny = javaClass.tryGetAnnotationOfType(DomainObject.class); - String logicalTypeName = null; - if (domainObjectIfAny.isPresent()) { - logicalTypeName = domainObjectIfAny.get().logicalTypeName(); - } else { - val namedIfAny = javaClass.tryGetAnnotationOfType(Named.class); - if (namedIfAny.isPresent()) { - logicalTypeName = namedIfAny.get().value(); - } - } + val logicalTypeName = _LogicalNaming.logicalNameFor(javaClass); + final JavaClass existing = javaClassByLogicalTypeName.get(logicalTypeName); if (existing != null) { conditionEvents.add( diff --git a/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/ArchitectureJdoRules.java b/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/ArchitectureJdoRules.java index 94e673e5590..16aeacecc9d 100644 --- a/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/ArchitectureJdoRules.java +++ b/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/ArchitectureJdoRules.java @@ -39,7 +39,6 @@ import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.fields; import org.apache.isis.applib.annotation.DomainObject; -import org.apache.isis.commons.internal.base._Strings; import lombok.val; import lombok.experimental.UtilityClass; @@ -58,22 +57,21 @@ public static ArchRule every_logicalTypeName_and_jdo_discriminator_must_be_same( .that().areAnnotatedWith(DomainObject.class) .and(new DescribedPredicate<>("have a logicalTypeName") { @Override - public boolean apply(JavaClass javaClass) { - val domainObjectIfAny = javaClass.tryGetAnnotationOfType(DomainObject.class); - return domainObjectIfAny.isPresent() && !_Strings.isNullOrEmpty(domainObjectIfAny.get().logicalTypeName()); + public boolean apply(final JavaClass javaClass) { + return _LogicalNaming.hasExplicitLogicalName(javaClass); } }) .and(new DescribedPredicate<>("have a @Discriminator") { @Override - public boolean apply(JavaClass javaClass) { + public boolean apply(final JavaClass javaClass) { val discriminatorIfAny = javaClass.tryGetAnnotationOfType(Discriminator.class); return discriminatorIfAny.isPresent(); } }) .should(new ArchCondition<>("be the same") { @Override - public void check(JavaClass javaClass, ConditionEvents conditionEvents) { - val logicalTypeName = javaClass.getAnnotationOfType(DomainObject.class).logicalTypeName(); + public void check(final JavaClass javaClass, final ConditionEvents conditionEvents) { + val logicalTypeName = _LogicalNaming.logicalNameFor(javaClass); val discriminatorValue = javaClass.getAnnotationOfType(Discriminator.class).value(); if (!Objects.equals(logicalTypeName, discriminatorValue)) { conditionEvents.add( @@ -253,7 +251,7 @@ public static ArchRule every_injected_field_of_jdo_PersistenceCapable_must_be_an static DescribedPredicate areEntities() { return new DescribedPredicate<>("are entities") { @Override - public boolean apply(JavaClass input) { + public boolean apply(final JavaClass input) { return input.isAnnotatedWith(PersistenceCapable.class); } }; diff --git a/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/_LogicalNaming.java b/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/_LogicalNaming.java new file mode 100644 index 00000000000..1c1629566f3 --- /dev/null +++ b/testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/_LogicalNaming.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.testing.archtestsupport.applib.classrules; + +import java.util.Optional; + +import javax.inject.Named; + +import com.tngtech.archunit.core.domain.JavaClass; + +import org.apache.isis.applib.annotation.DomainObject; +import org.apache.isis.commons.internal.base._Strings; + +import lombok.val; +import lombok.experimental.UtilityClass; + +@UtilityClass +class _LogicalNaming { + + public String logicalNameFor(final JavaClass javaClass) { + return explicitLogicalNameFor(javaClass) + .orElseGet(javaClass::getName); + } + + public Optional explicitLogicalNameFor(final JavaClass javaClass) { + + val domainObjectIfAny = javaClass.tryGetAnnotationOfType(DomainObject.class); + String logicalTypeName = null; + if (domainObjectIfAny.isPresent()) { + logicalTypeName = _Strings.emptyToNull(domainObjectIfAny.get().logicalTypeName()); + } + // override on presence + val namedIfAny = javaClass.tryGetAnnotationOfType(Named.class); + if (namedIfAny.isPresent()) { + logicalTypeName = namedIfAny.get().value(); + } + + return _Strings.nonEmpty(logicalTypeName); + + } + + public boolean hasExplicitLogicalName(final JavaClass javaClass) { + return explicitLogicalNameFor(javaClass).isPresent(); + } + + +} diff --git a/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/DomainArchTests.java b/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/DomainArchTests.java index b8acb7dd2fe..64dfa8318c9 100644 --- a/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/DomainArchTests.java +++ b/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/DomainArchTests.java @@ -29,7 +29,6 @@ import static org.apache.isis.testing.archtestsupport.applib.classrules.ArchitectureDomainRules.every_Collection_mixin_must_follow_naming_convention; import static org.apache.isis.testing.archtestsupport.applib.classrules.ArchitectureDomainRules.every_Controller_must_be_follow_naming_conventions; import static org.apache.isis.testing.archtestsupport.applib.classrules.ArchitectureDomainRules.every_DomainObject_must_also_be_annotated_with_DomainObjectLayout; -import static org.apache.isis.testing.archtestsupport.applib.classrules.ArchitectureDomainRules.every_DomainObject_must_specify_logicalTypeName; import static org.apache.isis.testing.archtestsupport.applib.classrules.ArchitectureDomainRules.every_DomainService_must_also_be_annotated_with_DomainServiceLayout; import static org.apache.isis.testing.archtestsupport.applib.classrules.ArchitectureDomainRules.every_Property_mixin_must_follow_naming_convention; import static org.apache.isis.testing.archtestsupport.applib.classrules.ArchitectureDomainRules.every_Repository_must_follow_naming_conventions; @@ -50,9 +49,10 @@ public class DomainArchTests { public static ArchRule every_DomainObject_must_also_be_annotated_with_DomainObjectLayout = every_DomainObject_must_also_be_annotated_with_DomainObjectLayout(); - @ArchTest - public static ArchRule every_DomainObject_must_specify_logicalTypeName = - every_DomainObject_must_specify_logicalTypeName(); +// TODO we deprecated DomainObject#logicalTypeName +// @ArchTest +// public static ArchRule every_DomainObject_must_specify_logicalTypeName = +// every_DomainObject_must_specify_logicalTypeName(); @ArchTest public static ArchRule every_DomainService_must_also_be_annotated_with_DomainServiceLayout = diff --git a/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/dom/SerializableViewModel.java b/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/dom/SerializableViewModel.java index 44d23faeb8e..1ea03a5ec30 100644 --- a/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/dom/SerializableViewModel.java +++ b/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/dom/SerializableViewModel.java @@ -21,12 +21,14 @@ import java.io.Serializable; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; import org.apache.isis.applib.annotation.Nature; -@DomainObject(nature = Nature.VIEW_MODEL, logicalTypeName = "SerializableViewModel") +@Named("SerializableViewModel") +@DomainObject(nature = Nature.VIEW_MODEL) @DomainObjectLayout() public class SerializableViewModel implements Serializable { diff --git a/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/dom/SomeDomainObject.java b/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/dom/SomeDomainObject.java index 38992d825b3..cd3b801f142 100644 --- a/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/dom/SomeDomainObject.java +++ b/testing/archtestsupport/applib/src/test/java/org/apache/isis/testing/archtestsupport/applib/domain/dom/SomeDomainObject.java @@ -18,10 +18,13 @@ */ package org.apache.isis.testing.archtestsupport.applib.domain.dom; +import javax.inject.Named; + import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainObjectLayout; -@DomainObject(logicalTypeName = "foo") +@Named("foo") +@DomainObject @DomainObjectLayout() public class SomeDomainObject { } diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResult.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResult.java index 78b0471e0ab..57449cd9b10 100644 --- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResult.java +++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureResult.java @@ -19,6 +19,7 @@ package org.apache.isis.testing.fixtures.applib.fixturescripts; import javax.inject.Inject; +import javax.inject.Named; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @@ -43,10 +44,9 @@ /** * @since 1.x {@index} */ +@Named(FixtureResult.LOGICAL_TYPE_NAME) @DomainObject( - nature = Nature.VIEW_MODEL, - logicalTypeName = FixtureResult.LOGICAL_TYPE_NAME - ) + nature = Nature.VIEW_MODEL) @DomainObjectLayout(paged=500) @XmlRootElement(name = "fixtureResult") @XmlType( @@ -83,7 +83,7 @@ public Object getObject() { return bookmarkService.lookup(Bookmark.parse(objectBookmark).orElse(null)).orElse(null); } - public void setObject(Object object) { + public void setObject(final Object object) { this.objectBookmark = bookmarkService.bookmarkForElseFail(object).toString(); } diff --git a/testing/specsupport/applib/pom.xml b/testing/specsupport/applib/pom.xml index b3d728b814e..a1366587b08 100644 --- a/testing/specsupport/applib/pom.xml +++ b/testing/specsupport/applib/pom.xml @@ -94,7 +94,7 @@ io.cucumber messages - 18.0.0 + 19.0.0 diff --git a/tooling/cli/adoc/modules/tooling-cli/examples/isis-tooling.yml b/tooling/cli/adoc/modules/tooling-cli/examples/isis-tooling.yml index 752f7d80d5a..988cb1dbbd2 100644 --- a/tooling/cli/adoc/modules/tooling-cli/examples/isis-tooling.yml +++ b/tooling/cli/adoc/modules/tooling-cli/examples/isis-tooling.yml @@ -55,13 +55,13 @@ commands: Extensions: org.apache.isis.extensions "Applib: Excel": "org.apache.isis.extensions:isis-extensions-excel.*" - "Core: Command Log": "org.apache.isis.extensions:isis-extensions-command-log.*" - "Core: Command Replay": "org.apache.isis.extensions:isis-extensions-command-replay.*" + "Core: Command Log": "org.apache.isis.extensions:isis-extensions-commandlog.*" + "Core: Command Replay": "org.apache.isis.extensions:isis-extensions-commandreplay.*" #"Core: Flyway": "org.apache.isis.extensions:isis-extensions-flyway.*" "Core: Quartz": "org.apache.isis.extensions:isis-extensions-quartz.*" - #"Security: Audit Trail": "org.apache.isis.security:isis-extensions-audit-trail.*" + #"Security: Audit Trail": "org.apache.isis.security:isis-extensions-audittrail.*" "Security: Secman": "org.apache.isis.security:isis-extensions-secman.*" - #"Security: Session Log": "org.apache.isis.security:isis-extensions-session-log.*" + #"Security: Session Log": "org.apache.isis.security:isis-extensions-sessionlog.*" "Security: Shiro LDAP Realm": "org.apache.isis.security:isis-extensions-shiro-realm-ldap.*" "RO Viewer: CORS": "org.apache.isis.security:isis-extensions-cors.*" "Wicket Viewer: Excel Download": "org.apache.isis.security:isis-extensions-exceldownload.*" diff --git a/tooling/cli/src/test/resources/org/apache/isis/tooling/cli/test/isis-tooling.yml b/tooling/cli/src/test/resources/org/apache/isis/tooling/cli/test/isis-tooling.yml index 34684964fc6..2ab9114ba21 100644 --- a/tooling/cli/src/test/resources/org/apache/isis/tooling/cli/test/isis-tooling.yml +++ b/tooling/cli/src/test/resources/org/apache/isis/tooling/cli/test/isis-tooling.yml @@ -55,13 +55,13 @@ commands: Extensions: org.apache.isis.extensions "Applib: Excel": "org.apache.isis.extensions:isis-extensions-excel.*" - "Core: Command Log": "org.apache.isis.extensions:isis-extensions-command-log.*" - "Core: Command Replay": "org.apache.isis.extensions:isis-extensions-command-replay.*" + "Core: Command Log": "org.apache.isis.extensions:isis-extensions-commandlog.*" + "Core: Command Replay": "org.apache.isis.extensions:isis-extensions-commandreplay.*" #"Core: Flyway": "org.apache.isis.extensions:isis-extensions-flyway.*" "Core: Quartz": "org.apache.isis.extensions:isis-extensions-quartz.*" - #"Security: Audit Trail": "org.apache.isis.security:isis-extensions-audit-trail.*" + #"Security: Audit Trail": "org.apache.isis.security:isis-extensions-audittrail.*" "Security: Secman": "org.apache.isis.security:isis-extensions-secman.*" - #"Security: Session Log": "org.apache.isis.security:isis-extensions-session-log.*" + #"Security: Session Log": "org.apache.isis.security:isis-extensions-sessionlog.*" "Security: Shiro LDAP Realm": "org.apache.isis.security:isis-extensions-shiro-realm-ldap.*" "RO Viewer: CORS": "org.apache.isis.security:isis-extensions-cors.*" "Wicket Viewer: Excel Download": "org.apache.isis.security:isis-extensions-exceldownload.*" diff --git a/tooling/pom.xml b/tooling/pom.xml index 701aa7f82b2..ffafd98d98a 100644 --- a/tooling/pom.xml +++ b/tooling/pom.xml @@ -40,7 +40,7 @@ org.apache.isis.tooling org/apache/isis/tooling - 2.5.3 + 2.5.4 7.1.1 3.8.5 4.6.3 diff --git a/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/AsciiDoc.java b/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/AsciiDoc.java index e845be03021..73322e15822 100644 --- a/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/AsciiDoc.java +++ b/valuetypes/asciidoc/applib/src/main/java/org/apache/isis/valuetypes/asciidoc/applib/value/AsciiDoc.java @@ -21,6 +21,7 @@ import java.io.Serializable; import java.util.Objects; +import javax.inject.Named; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.apache.isis.applib.IsisModuleApplib; @@ -36,8 +37,8 @@ * * @since 2.0 {@index} */ -@org.apache.isis.applib.annotation.Value( - logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.AsciiDoc") +@Named(IsisModuleApplib.NAMESPACE + ".value.AsciiDoc") +@org.apache.isis.applib.annotation.Value @EqualsAndHashCode @XmlJavaTypeAdapter(AsciiDocJaxbAdapter.class) // for JAXB view model support public final class AsciiDoc implements Serializable { diff --git a/valuetypes/asciidoc/pom.xml b/valuetypes/asciidoc/pom.xml index 3c66c39ad2b..e86bebe32e7 100644 --- a/valuetypes/asciidoc/pom.xml +++ b/valuetypes/asciidoc/pom.xml @@ -29,7 +29,7 @@ pom - 2.5.3 + 2.5.4 diff --git a/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Markdown.java b/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Markdown.java index ffc6154567c..f16d5b520e2 100644 --- a/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Markdown.java +++ b/valuetypes/markdown/applib/src/main/java/org/apache/isis/valuetypes/markdown/applib/value/Markdown.java @@ -21,6 +21,7 @@ import java.io.Serializable; import java.util.Objects; +import javax.inject.Named; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.apache.isis.applib.IsisModuleApplib; @@ -36,8 +37,8 @@ * * @since 2.0 {@index} */ -@org.apache.isis.applib.annotation.Value( - logicalTypeName = IsisModuleApplib.NAMESPACE + ".value.Markdown") +@Named(IsisModuleApplib.NAMESPACE + ".value.Markdown") +@org.apache.isis.applib.annotation.Value @EqualsAndHashCode @XmlJavaTypeAdapter(MarkdownJaxbAdapter.class) // for JAXB view model support public class Markdown implements Serializable { diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java index 3338030ba11..3cdb23d011f 100644 --- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java +++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java @@ -164,7 +164,7 @@ public JsonRepresentation render() { return null; } - final boolean isService = objectAdapter.getSpecification().isManagedBean(); + final boolean isService = objectAdapter.getSpecification().isInjectable(); if (!(mode.isArgs())) { @@ -434,7 +434,7 @@ private void addUpdatePropertiesLinkIfRequired() { if (!ManagedObjects.isIdentifiable(objectAdapter)) { return; } - final boolean isService = objectAdapter.getSpecification().isManagedBean(); + final boolean isService = objectAdapter.getSpecification().isInjectable(); if(isService) { return; } diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java index ae6c6d21dd4..0834a33954a 100644 --- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java +++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/DomainTypeReprRenderer.java @@ -189,7 +189,7 @@ protected void putExtensionsDescriptionIfAvailable() { } protected void putExtensionsIfService() { - getExtensions().mapPut("isService", objectSpecification.isManagedBean()); + getExtensions().mapPut("isService", objectSpecification.isInjectable()); } } diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java index 5dde58c6d24..12d3c0f8a59 100644 --- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java +++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/TypeActionResultReprRenderer.java @@ -71,7 +71,7 @@ public JsonRepresentation render() { } protected void putExtensionsIfService() { - getExtensions().mapPut("isService", objectSpecification.isManagedBean()); + getExtensions().mapPut("isService", objectSpecification.isInjectable()); } } \ No newline at end of file diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java index cc0dc1acd05..a2df3893a7f 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java @@ -149,9 +149,9 @@ public Response service( val resourceContext = createResourceContext( RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS, RepresentationService.Intent.ALREADY_PERSISTENT); - val serviceAdapter = getServiceAdapter(serviceId); + val serviceAdapter = _DomainResourceHelper.getServiceAdapter(resourceContext, serviceId); - final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(resourceContext, null, JsonRepresentation.newMap()); + val renderer = new DomainObjectReprRenderer(resourceContext, null, JsonRepresentation.newMap()); renderer.usingLinkToBuilder(new DomainServiceLinkTo()) .with(serviceAdapter) .includesSelf(); @@ -214,8 +214,7 @@ public Response actionPrompt( val resourceContext = createResourceContext( RepresentationType.OBJECT_ACTION, Where.OBJECT_FORMS, RepresentationService.Intent.ALREADY_PERSISTENT); - val serviceAdapter = getServiceAdapter(serviceId); - val domainResourceHelper = _DomainResourceHelper.ofServiceResource(resourceContext, serviceAdapter); + val domainResourceHelper = _DomainResourceHelper.ofServiceResource(resourceContext, serviceId); return _EndpointLogging.response(log, "GET /services/{}/actions/{}", serviceId, actionId, domainResourceHelper.actionPrompt(actionId)); @@ -284,8 +283,7 @@ public Response invokeActionQueryOnly( final JsonRepresentation arguments = resourceContext.getQueryStringAsJsonRepr(); - val serviceAdapter = getServiceAdapter(serviceId); - val domainResourceHelper = _DomainResourceHelper.ofServiceResource(resourceContext, serviceAdapter); + val domainResourceHelper = _DomainResourceHelper.ofServiceResource(resourceContext, serviceId); return _EndpointLogging.response(log, "GET /services/{}/actions/{}/invoke", serviceId, actionId, domainResourceHelper.invokeActionQueryOnly(actionId, arguments)); @@ -311,8 +309,7 @@ public Response invokeActionIdempotent( final JsonRepresentation arguments = resourceContext.getQueryStringAsJsonRepr(); - val serviceAdapter = getServiceAdapter(serviceId); - val domainResourceHelper = _DomainResourceHelper.ofServiceResource(resourceContext, serviceAdapter); + val domainResourceHelper = _DomainResourceHelper.ofServiceResource(resourceContext, serviceId); return _EndpointLogging.response(log, "PUT /services/{}/actions/{}/invoke", serviceId, actionId, domainResourceHelper.invokeActionIdempotent(actionId, arguments)); @@ -337,8 +334,7 @@ public Response invokeAction( final JsonRepresentation arguments = resourceContext.getQueryStringAsJsonRepr(); - val serviceAdapter = getServiceAdapter(serviceId); - val domainResourceHelper = _DomainResourceHelper.ofServiceResource(resourceContext, serviceAdapter); + val domainResourceHelper = _DomainResourceHelper.ofServiceResource(resourceContext, serviceId); return _EndpointLogging.response(log, "POST /services/{}/actions/{}/invoke", serviceId, actionId, domainResourceHelper.invokeAction(actionId, arguments)); @@ -357,6 +353,4 @@ public Response deleteInvokeActionNotAllowed( "Deleting an action invocation resource is not allowed.")); } - - } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ResourceAbstract.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ResourceAbstract.java index f28ab1a7ea7..162f31d575d 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ResourceAbstract.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ResourceAbstract.java @@ -165,15 +165,6 @@ protected ManagedObject getObjectAdapterElseThrowNotFound( bookmark))); } - protected ManagedObject getServiceAdapter(final String serviceId) { - final ManagedObject serviceAdapter = metaModelContext.lookupServiceAdapterById(serviceId); - if(serviceAdapter==null) { - throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.NOT_FOUND, - "Could not locate service '%s'", serviceId); - } - return serviceAdapter; - } - protected SpecificationLoader getSpecificationLoader() { return metaModelContext.getSpecificationLoader(); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/_DomainResourceHelper.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/_DomainResourceHelper.java index 40c893aa584..5fa24661514 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/_DomainResourceHelper.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/_DomainResourceHelper.java @@ -22,8 +22,12 @@ import javax.ws.rs.core.Response; +import org.springframework.lang.Nullable; + import org.apache.isis.applib.Identifier; import org.apache.isis.applib.annotation.SemanticsOf; +import org.apache.isis.applib.id.LogicalType; +import org.apache.isis.applib.services.registry.ServiceRegistry; import org.apache.isis.applib.services.xactn.TransactionService; import org.apache.isis.commons.functional.Railway; import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction; @@ -34,7 +38,9 @@ import org.apache.isis.core.metamodel.interactions.managed.MemberInteraction.AccessIntent; import org.apache.isis.core.metamodel.spec.ManagedObject; import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation; +import org.apache.isis.viewer.restfulobjects.applib.RestfulResponse.HttpStatusCode; import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext; +import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException; import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer; import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectLinkTo; import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainServiceLinkTo; @@ -60,8 +66,9 @@ public static _DomainResourceHelper ofObjectResource( public static _DomainResourceHelper ofServiceResource( final IResourceContext resourceContext, - final ManagedObject objectAdapter) { - return new _DomainResourceHelper(resourceContext, objectAdapter, new DomainServiceLinkTo()); + final String serviceIdOrAlias) { + return new _DomainResourceHelper(resourceContext, + getServiceAdapter(resourceContext, serviceIdOrAlias), new DomainServiceLinkTo()); } private _DomainResourceHelper( @@ -305,8 +312,32 @@ private Response invokeAction( // dependencies (from context) // ////////////////////////////////////// + //TODO pretty low level stuff; maybe move the logic to metamodel module + static ManagedObject getServiceAdapter( + final IResourceContext resourceContext, + final @Nullable String serviceIdOrAlias) { + + val mmc = resourceContext.getMetaModelContext(); + + final ManagedObject serviceAdapter = mmc.getSpecificationLoader() + .lookupLogicalType(serviceIdOrAlias) + .map(LogicalType::getLogicalTypeName) + .map(mmc::lookupServiceAdapterById) + .orElse(null); + + if(serviceAdapter==null) { + throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.NOT_FOUND, + "Could not locate service '%s'", serviceIdOrAlias); + } + return serviceAdapter; + } + private T lookupService(final Class serviceType) { - return resourceContext.getMetaModelContext().getServiceRegistry().lookupServiceElseFail(serviceType); + return getServiceRegistry().lookupServiceElseFail(serviceType); + } + + private ServiceRegistry getServiceRegistry() { + return resourceContext.getMetaModelContext().getServiceRegistry(); } } diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java index 223f7a2f413..9c926005925 100644 --- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java +++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java @@ -18,6 +18,8 @@ */ package org.apache.isis.viewer.wicket.viewer.integration; +import java.util.UUID; + import org.apache.wicket.Session; import org.apache.wicket.authroles.authentication.AuthenticatedWebSession; import org.apache.wicket.authroles.authorization.strategies.role.Roles; @@ -28,7 +30,7 @@ import org.apache.isis.applib.services.clock.ClockService; import org.apache.isis.applib.services.iactnlayer.InteractionContext; import org.apache.isis.applib.services.iactnlayer.InteractionService; -import org.apache.isis.applib.services.session.SessionLoggingService; +import org.apache.isis.applib.services.session.SessionLogService; import org.apache.isis.applib.services.user.ImpersonatedUserHolder; import org.apache.isis.applib.services.user.UserMemento; import org.apache.isis.applib.services.user.UserMemento.AuthenticationSource; @@ -63,7 +65,9 @@ public static AuthenticatedWebSessionForIsis get() { @Getter protected transient IsisAppCommonContext commonContext; + @Getter private BreadcrumbModel breadcrumbModel; + @Getter private BookmarkedPagesModel bookmarkedPagesModel; /** @@ -71,6 +75,17 @@ public static AuthenticatedWebSessionForIsis get() { */ private InteractionContext authentication; + @Getter + private UUID sessionGuid; + private String cachedSessionId; + + public String getCachedSessionId() { + if (cachedSessionId == null && Session.exists()) { + cachedSessionId = getId(); + } + return cachedSessionId; + } + public AuthenticatedWebSessionForIsis(final Request request) { super(request); } @@ -79,7 +94,7 @@ public void init(final IsisAppCommonContext commonContext) { this.commonContext = commonContext; bookmarkedPagesModel = new BookmarkedPagesModel(commonContext); breadcrumbModel = new BreadcrumbModel(commonContext); - + sessionGuid = UUID.randomUUID(); } @Override @@ -88,7 +103,7 @@ public synchronized boolean authenticate(final String username, final String pas authenticationRequest.addRole(UserMemento.AUTHORIZED_USER_ROLE); this.authentication = getAuthenticationManager().authenticate(authenticationRequest); if (this.authentication != null) { - log(SessionLoggingService.Type.LOGIN, username, null); + log(SessionLogService.Type.LOGIN, username, null); return true; } else { return false; @@ -124,11 +139,11 @@ public synchronized void onInvalidate() { super.onInvalidate(); val causedBy = RequestCycle.get() != null - ? SessionLoggingService.CausedBy.USER - : SessionLoggingService.CausedBy.SESSION_EXPIRATION; + ? SessionLogService.CausedBy.USER + : SessionLogService.CausedBy.SESSION_EXPIRATION; - log(SessionLoggingService.Type.LOGOUT, userName, causedBy); + log(SessionLogService.Type.LOGOUT, userName, causedBy); } /** @@ -204,28 +219,16 @@ public synchronized void detach() { super.detach(); } - // ///////////////////////////////////////////////// - // Breadcrumbs and Bookmarks support - // ///////////////////////////////////////////////// - @Override - public BreadcrumbModel getBreadcrumbModel() { - return breadcrumbModel; - } - - @Override - public BookmarkedPagesModel getBookmarkedPagesModel() { - return bookmarkedPagesModel; - } protected AuthenticationManager getAuthenticationManager() { return commonContext.getAuthenticationManager(); } private void log( - final SessionLoggingService.Type type, + final SessionLogService.Type type, final String username, - final SessionLoggingService.CausedBy causedBy) { + final SessionLogService.CausedBy causedBy) { val interactionFactory = getInteractionService(); @@ -235,10 +238,9 @@ private void log( val now = virtualClock().nowAsJavaUtilDate(); - // use hashcode as session identifier, to avoid re-binding http sessions if using Session#getId() - int sessionHashCode = System.identityHashCode(AuthenticatedWebSessionForIsis.this); + String httpSessionId = AuthenticatedWebSessionForIsis.this.getCachedSessionId(); sessionLoggingServices.forEach(sessionLoggingService -> - sessionLoggingService.log(type, username, now, causedBy, Integer.toString(sessionHashCode)) + sessionLoggingService.log(type, username, now, causedBy, getSessionGuid(), httpSessionId) ); }; @@ -249,8 +251,8 @@ private void log( } } - protected Can getSessionLoggingServices() { - return commonContext.getServiceRegistry().select(SessionLoggingService.class); + protected Can getSessionLoggingServices() { + return commonContext.getServiceRegistry().select(SessionLogService.class); } protected InteractionService getInteractionService() { diff --git a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_Authenticate.java b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_Authenticate.java index c1bab48667b..f9990c88945 100644 --- a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_Authenticate.java +++ b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_Authenticate.java @@ -37,7 +37,7 @@ import org.apache.isis.applib.services.iactnlayer.InteractionLayerTracker; import org.apache.isis.applib.services.iactnlayer.InteractionService; import org.apache.isis.applib.services.registry.ServiceRegistry; -import org.apache.isis.applib.services.session.SessionLoggingService; +import org.apache.isis.applib.services.session.SessionLogService; import org.apache.isis.applib.services.user.ImpersonatedUserHolder; import org.apache.isis.commons.collections.Can; import org.apache.isis.commons.functional.ThrowingRunnable; @@ -83,7 +83,7 @@ public void setUp() throws Exception { allowing(mockCommonContext).getServiceRegistry(); will(returnValue(mockServiceRegistry)); - allowing(mockServiceRegistry).select(SessionLoggingService.class); + allowing(mockServiceRegistry).select(SessionLogService.class); will(returnValue(Can.empty())); allowing(mockCommonContext).lookupServiceElseFail(InteractionService.class); diff --git a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_SignIn.java b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_SignIn.java index 5477562dc0a..471af287552 100644 --- a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_SignIn.java +++ b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_SignIn.java @@ -35,7 +35,7 @@ import org.apache.isis.applib.services.iactnlayer.InteractionService; import org.apache.isis.applib.services.registry.ServiceRegistry; -import org.apache.isis.applib.services.session.SessionLoggingService; +import org.apache.isis.applib.services.session.SessionLogService; import org.apache.isis.commons.collections.Can; import org.apache.isis.commons.functional.ThrowingRunnable; import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2; @@ -80,7 +80,7 @@ public void signInJustDelegatesToAuthenticateAndSavesState() { allowing(mockCommonContext).getServiceRegistry(); will(returnValue(mockServiceRegistry)); - allowing(mockServiceRegistry).select(SessionLoggingService.class); + allowing(mockServiceRegistry).select(SessionLogService.class); will(returnValue(Can.empty())); allowing(mockCommonContext).lookupServiceElseFail(InteractionService.class); diff --git a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_TestAbstract.java b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_TestAbstract.java index 74cf1d99d67..088ba763014 100644 --- a/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_TestAbstract.java +++ b/viewers/wicket/viewer/src/test/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis_TestAbstract.java @@ -28,7 +28,7 @@ import org.apache.isis.applib.services.iactnlayer.InteractionService; import org.apache.isis.applib.services.registry.ServiceRegistry; -import org.apache.isis.applib.services.session.SessionLoggingService; +import org.apache.isis.applib.services.session.SessionLogService; import org.apache.isis.commons.functional.ThrowingRunnable; import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2; import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode; @@ -55,7 +55,7 @@ protected void setUp() throws Exception { allowing(mockCommonContext).getServiceRegistry(); will(returnValue(mockServiceRegistry)); - allowing(mockServiceRegistry).lookupService(SessionLoggingService.class); + allowing(mockServiceRegistry).lookupService(SessionLogService.class); will(returnValue(Optional.empty())); allowing(mockCommonContext).lookupServiceElseFail(InteractionService.class);