From dcd6b0d024ffe64b6f12bf9d2192a73457fb4e0f Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Tue, 24 May 2022 06:43:14 +0200 Subject: [PATCH 01/43] ISIS-3063: adds annot. @Aliased; deprecates others in favor of @Named --- .../isis/applib/annotation/Aliased.java | 54 +++++++++++++++++++ .../isis/applib/annotation/DomainObject.java | 3 +- .../isis/applib/annotation/DomainService.java | 1 - .../applib/annotation/LogicalTypeName.java | 7 ++- 4 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java new file mode 100644 index 00000000000..8768f262945 --- /dev/null +++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java @@ -0,0 +1,54 @@ +/* + * 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.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.inject.Named; + +import org.apache.isis.applib.services.bookmark.Bookmark; + +/** + * Introduced to allow for historic bookmarks to be resolved to + * their corresponding new types. + * @see Bookmark + * @see Named + * + * @since 2.0 {@index} + */ +@Inherited +@Target({ + ElementType.TYPE, + ElementType.ANNOTATION_TYPE +}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Aliased { + + /** + * Alternative logical type name(s) for the annotated type. + * @see Bookmark + * @see Named + */ + String[] value() default {}; + +} 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..7d10da9d6f3 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 @@ -185,9 +185,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..1106ad67b1e 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 @@ -76,7 +76,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 { /** From b1a44a0f62656e764c77283e5a7b292408015f3c Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Tue, 24 May 2022 07:04:15 +0200 Subject: [PATCH 02/43] ISIS-3063: adds @Named support on interfaces and abstract types --- ...alTypeFacetForAnnotationFacetFactory.java} | 20 ++++--- .../LogicalTypeFacetForNamedAnnotation.java | 52 +++++++++++++++++++ .../object/logicaltype/LogicalTypeFacet.java | 10 ++-- .../dflt/ProgrammingModelFacetsJava11.java | 4 +- .../specloader/SpecificationLoader.java | 5 +- .../dom/_infra/values/ValueHolder.java | 4 +- .../objects/other/mixins/CountHolder.java | 4 +- .../isis/blobs/holder/IsisBlobHolder.java | 5 +- .../isis/clobs/holder/IsisClobHolder.java | 5 +- .../holder/IsisLocalResourcePathHolder.java | 5 +- .../isis/markups/holder/IsisMarkupHolder.java | 5 +- .../passwords/holder/IsisPasswordHolder.java | 5 +- .../asciidocs/holder/IsisAsciiDocHolder.java | 5 +- .../cal/holder/IsisCalendarEventHolder.java | 5 +- .../markdowns/holder/IsisMarkdownHolder.java | 5 +- .../holder/JavaAwtBufferedImageHolder.java | 4 +- .../booleans/holder/WrapperBooleanHolder.java | 4 +- .../bytes/holder/WrapperByteHolder.java | 4 +- .../holder/WrapperCharacterHolder.java | 4 +- .../doubles/holder/WrapperDoubleHolder.java | 4 +- .../floats/holder/WrapperFloatHolder.java | 4 +- .../integers/holder/WrapperIntegerHolder.java | 4 +- .../longs/holder/WrapperLongHolder.java | 4 +- .../shorts/holder/WrapperShortHolder.java | 4 +- .../strings/holder/JavaLangStringHolder.java | 4 +- .../holder/JavaMathBigDecimalHolder.java | 4 +- .../holder/JavaMathBigIntegerHolder.java | 4 +- .../javanet/urls/holder/JavaNetUrlHolder.java | 4 +- .../javasqldate/holder/JavaSqlDateHolder.java | 4 +- .../holder/JavaSqlTimestampHolder.java | 4 +- .../holder/JavaTimeLocalDateHolder.java | 4 +- .../holder/JavaTimeLocalDateTimeHolder.java | 4 +- .../holder/JavaTimeLocalTimeHolder.java | 4 +- .../holder/JavaTimeOffsetDateTimeHolder.java | 4 +- .../holder/JavaTimeOffsetTimeHolder.java | 4 +- .../holder/JavaTimeZonedDateTimeHolder.java | 4 +- .../holder/JavaUtilDateHolder.java | 4 +- .../uuids/holder/JavaUtilUuidHolder.java | 4 +- .../holder/JodaDateTimeHolder.java | 4 +- .../holder/JodaLocalDateHolder.java | 4 +- .../holder/JodaLocalDateTimeHolder.java | 4 +- .../holder/JodaLocalTimeHolder.java | 4 +- .../holder/PrimitiveBooleanHolder.java | 5 +- .../bytes/holder/PrimitiveByteHolder.java | 4 +- .../chars/holder/PrimitiveCharHolder.java | 4 +- .../doubles/holder/PrimitiveDoubleHolder.java | 4 +- .../floats/holder/PrimitiveFloatHolder.java | 4 +- .../ints/holder/PrimitiveIntHolder.java | 4 +- .../longs/holder/PrimitiveLongHolder.java | 4 +- .../shorts/holder/PrimitiveShortHolder.java | 4 +- .../model/good/ProperInterface.java | 5 +- .../model/good/ProperInterface2.java | 5 +- 52 files changed, 180 insertions(+), 110 deletions(-) rename core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/{LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java => LogicalTypeFacetForAnnotationFacetFactory.java} (77%) create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java 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/LogicalTypeFacetForAnnotationFacetFactory.java similarity index 77% rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory.java rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForAnnotationFacetFactory.java index 3f8929172ab..150f630006f 100644 --- 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/LogicalTypeFacetForAnnotationFacetFactory.java @@ -19,6 +19,7 @@ package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype; import javax.inject.Inject; +import javax.inject.Named; import org.apache.isis.applib.annotation.LogicalTypeName; import org.apache.isis.core.metamodel.commons.ClassExtensions; @@ -30,11 +31,11 @@ import lombok.val; -public class LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory +public class LogicalTypeFacetForAnnotationFacetFactory extends FacetFactoryAbstract { @Inject - public LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory( + public LogicalTypeFacetForAnnotationFacetFactory( final MetaModelContext mmc, final MethodByClassMap postConstructMethodsCache) { super(mmc, FeatureType.OBJECTS_ONLY); @@ -42,20 +43,25 @@ public LogicalTypeFacetForLogicalTypeNameAnnotationFacetFactory( @Override public void process(final ProcessClassContext processClassContext) { - val logicalTypeNameIfAny = processClassContext.synthesizeOnType(LogicalTypeName.class); + val cls = processClassContext.getCls(); + val facetHolder = processClassContext.getFacetHolder(); + // deprecated annotation @LogicalTypeName if(cls.isInterface() || ClassExtensions.isAbstract(cls)) { - - val facetHolder = processClassContext.getFacetHolder(); - + val logicalTypeNameIfAny = processClassContext.synthesizeOnType(LogicalTypeName.class); FacetUtil.addFacetIfPresent( LogicalTypeFacetForLogicalTypeNameAnnotation .create(logicalTypeNameIfAny, cls, facetHolder)); - } + val namedIfAny = processClassContext.synthesizeOnType(Named.class); + + FacetUtil.addFacetIfPresent( + LogicalTypeFacetForNamedAnnotation + .create(namedIfAny, cls, facetHolder)); + } } diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java new file mode 100644 index 00000000000..b72c99a315c --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java @@ -0,0 +1,52 @@ +/* + * 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 java.util.Optional; + +import javax.inject.Named; + +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; + +public class LogicalTypeFacetForNamedAnnotation +extends LogicalTypeFacetAbstract { + + public static Optional create( + final Optional namedIfAny, + final Class correspondingClass, + final FacetHolder holder) { + + return namedIfAny + .map(annot->annot.value()) + .filter(_Strings::isNotEmpty) + .map(logicalTypeName -> new LogicalTypeFacetForNamedAnnotation( + LogicalType.eager(correspondingClass, logicalTypeName), + holder)); + } + + private LogicalTypeFacetForNamedAnnotation( + final LogicalType logicalType, + final FacetHolder holder) { + super(logicalType, holder, Precedence.DEFAULT); + } +} 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/LogicalTypeFacet.java index 3c615f49c52..e5b7f0827b2 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/LogicalTypeFacet.java @@ -18,15 +18,15 @@ */ 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.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. 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..e0fb1088afb 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,7 @@ 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.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory; 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,7 +191,7 @@ 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)); + addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new LogicalTypeFacetForAnnotationFacetFactory(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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 { From 540babf530bd1b6ef956a9997209394be73509d3 Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Tue, 24 May 2022 12:20:08 +0200 Subject: [PATCH 03/43] ISIS-3063: instate @Named as replacement for annot. attr. logicalTypeName=... --- .../isis/applib/annotation/SemanticsOf.java | 5 +- .../apache/isis/applib/annotation/Value.java | 4 +- .../isis/applib/domain/DomainObjectList.java | 9 +- .../apache/isis/applib/graph/SimpleEdge.java | 5 +- .../isis/applib/graph/tree/TreeNode.java | 5 +- .../apache/isis/applib/id/LogicalType.java | 55 ++++++++++++ .../services/appfeat/ApplicationFeature.java | 13 +-- .../appfeat/ApplicationFeatureSort.java | 5 +- .../ApplicationFeatureViewModel.java | 6 +- .../appfeatui/ApplicationNamespace.java | 7 +- .../services/appfeatui/ApplicationType.java | 7 +- .../appfeatui/ApplicationTypeAction.java | 7 +- .../appfeatui/ApplicationTypeCollection.java | 7 +- .../appfeatui/ApplicationTypeMember.java | 7 +- .../appfeatui/ApplicationTypeProperty.java | 7 +- .../applib/services/bookmark/Bookmark.java | 6 +- .../confview/ConfigurationProperty.java | 6 +- .../confview/ConfigurationViewmodel.java | 6 +- .../applib/services/jaxb/IsisSchemas.java | 5 +- .../isis/applib/services/layout/Style.java | 6 +- .../applib/services/menu/MenuBarsService.java | 7 +- .../isis/applib/services/swagger/Format.java | 5 +- .../applib/services/swagger/Visibility.java | 12 ++- .../applib/services/user/RoleMemento.java | 7 +- .../applib/services/user/UserMemento.java | 10 +-- .../org/apache/isis/applib/value/Blob.java | 4 +- .../org/apache/isis/applib/value/Clob.java | 5 +- .../isis/applib/value/LocalResourcePath.java | 4 +- .../org/apache/isis/applib/value/Markup.java | 4 +- .../apache/isis/applib/value/Password.java | 4 +- .../isis/core/config/IsisConfiguration.java | 5 +- .../beans/IsisBeanTypeClassifierDefault.java | 20 ++++- .../DomainObjectAnnotationFacetFactory.java | 2 +- ...calTypeFacetForDomainObjectAnnotation.java | 1 + ...TypeFacetForLogicalTypeNameAnnotation.java | 1 + .../LogicalTypeFacetForNamedAnnotation.java | 2 +- .../LogicalTypeFacetForValueAnnotation.java | 1 + .../ValueAnnotationFacetFactory.java | 2 + .../metamodel/inspect/model/ActionNode.java | 3 +- .../inspect/model/CollectionNode.java | 3 +- .../inspect/model/FacetAttrNode.java | 4 +- .../inspect/model/FacetGroupNode.java | 3 +- .../metamodel/inspect/model/FacetNode.java | 3 +- .../inspect/model/ParameterNode.java | 3 +- .../metamodel/inspect/model/PropertyNode.java | 6 +- .../metamodel/inspect/model/TypeNode.java | 6 +- .../appfeat/ApplicationFeatureDefault.java | 5 +- .../specimpl/ObjectSpecificationAbstract.java | 24 ++--- .../dflt/ObjectSpecificationDefault.java | 16 ++-- ...omainObjectAnnotationFacetFactoryTest.java | 22 +++-- .../ObjectTypeAnnotationFacetFactoryTest.java | 22 ++--- ...icalTypeFacetFromClassNameFactoryTest.java | 21 +++-- .../core/metamodel/services/grid/Bar.java | 7 +- .../authentication/logout/LogoutMenu.java | 4 +- .../_interactions/InteractionDtoVm.java | 7 +- .../associateWith/ActionAssociateWithVm.java | 5 +- .../child/ActionAssociateWithChildVm.java | 5 +- .../ActionCommandPublishingEntity.java | 7 +- .../jdo/ActionCommandPublishingJdo.java | 3 +- .../jpa/ActionCommandPublishingJpa.java | 6 +- .../domainEvent/ActionDomainEventVm.java | 6 +- .../ActionExecutionPublishingEntity.java | 7 +- .../jdo/ActionExecutionPublishingJdo.java | 3 +- .../jpa/ActionExecutionPublishingJpa.java | 6 +- .../actions/Action/hidden/ActionHiddenVm.java | 6 +- .../Action/restrictTo/ActionRestrictToVm.java | 6 +- .../Action/semantics/ActionSemanticsVm.java | 6 +- .../actions/Action/typeOf/ActionTypeOfVm.java | 6 +- .../typeOf/child/ActionTypeOfChildVm.java | 6 +- .../position/ActionLayoutPositionVm.java | 5 +- .../ActionLayoutPromptStyleVm.java | 6 +- .../progmodel/assoc/AssociatedActionDemo.java | 4 +- .../actions/progmodel/assoc/DemoItem.java | 5 +- .../actions/progmodel/depargs/DemoItem.java | 4 +- .../depargs/DependentArgsActionDemo.java | 6 +- .../domainEvent/CollectionDomainEventVm.java | 3 +- .../child/CollectionDomainEventChildVm.java | 6 +- ...ainObjectEntityChangePublishingEntity.java | 7 +- .../DomainObjectEntityChangePublishingVm.java | 7 +- ...tEntityChangePublishingDisabledEntity.java | 7 +- ...jectEntityChangePublishingDisabledJdo.java | 5 +- ...jectEntityChangePublishingDisabledJpa.java | 3 +- ...ctEntityChangePublishingEnabledEntity.java | 7 +- ...bjectEntityChangePublishingEnabledJdo.java | 5 +- ...bjectEntityChangePublishingEnabledJpa.java | 3 +- ...ePublishingEnabledMetaAnnotatedEntity.java | 7 +- ...angePublishingEnabledMetaAnnotatedJdo.java | 5 +- ...angePublishingEnabledMetaAnnotatedJpa.java | 3 +- ...shingEnabledMetaAnnotOverriddenEntity.java | 7 +- ...blishingEnabledMetaAnnotOverriddenJdo.java | 5 +- ...blishingEnabledMetaAnnotOverriddenJpa.java | 3 +- .../jaxbrefentity/JaxbRefEntity.java | 7 +- .../StatefulVmJaxbRefsEntity.java | 6 +- .../jaxbrefentity/jdo/JaxbRefJdo.java | 5 +- .../jaxbrefentity/jpa/JaxbRefJpa.java | 5 +- .../usingjaxb/StatefulVmUsingJaxb.java | 10 +-- .../other/embedded/EmbeddedTypeVm.java | 4 +- .../other/embedded/jdo/NumberConstantJdo.java | 4 +- .../other/embedded/jpa/NumberConstantJpa.java | 4 +- .../persistence/NumberConstantEntity.java | 7 +- .../other/mixins/FibonacciNumberVm.java | 8 +- .../domain/objects/other/mixins/MixinVm.java | 4 +- .../PropertyCommandPublishingEntity.java | 7 +- .../jdo/PropertyCommandPublishingJdo.java | 3 +- .../jpa/PropertyCommandPublishingJpa.java | 6 +- .../domainEvent/PropertyDomainEventVm.java | 6 +- .../Property/editing/PropertyEditingVm.java | 3 +- .../PropertyExecutionPublishingEntity.java | 7 +- .../jdo/PropertyExecutionPublishingJdo.java | 6 +- .../jpa/PropertyExecutionPublishingJpa.java | 6 +- .../fileAccept/PropertyFileAcceptVm.java | 6 +- .../Property/hidden/PropertyHiddenVm.java | 6 +- .../hidden/child/PropertyHiddenChildVm.java | 6 +- .../maxLength/PropertyMaxLengthVm.java | 6 +- .../mustSatisfy/PropertyMustSatisfyVm.java | 6 +- .../optionality/PropertyOptionalityVm.java | 6 +- .../projecting/PropertyProjectingVm.java | 6 +- .../child/PropertyProjectingChildVm.java | 6 +- .../jdo/PropertyProjectingChildJdo.java | 3 +- .../jpa/PropertyProjectingChildJpa.java | 6 +- .../PropertyProjectingChildEntity.java | 7 +- .../regexPattern/PropertyRegexPatternVm.java | 6 +- .../Property/snapshot/PropertySnapshotVm.java | 6 +- .../cssClass/PropertyLayoutCssClassVm.java | 6 +- .../PropertyLayoutDescribedAsVm.java | 6 +- .../hidden/PropertyLayoutHiddenVm.java | 6 +- .../child/PropertyLayoutHiddenChildVm.java | 6 +- .../PropertyLayoutLabelPositionVm.java | 6 +- .../multiLine/PropertyLayoutMultiLineVm.java | 6 +- .../named/PropertyLayoutNamedVm.java | 6 +- .../PropertyLayout/navigable/FileNodeVm.java | 4 +- .../renderDay/PropertyLayoutRenderDayVm.java | 9 +- .../PropertyLayoutRepaintingVm.java | 6 +- .../PropertyLayoutTypicalLengthVm.java | 6 +- .../customui/vm/WhereInTheWorldVm.java | 9 +- .../layout/describedAs/DescribedAsVm.java | 4 +- .../dom/featured/layout/tabs/TabDemo.java | 4 +- .../demoapp/dom/homepage/DemoHomePage.java | 6 +- .../ErrorReportingServiceDemoVm.java | 4 +- .../EventBusServiceDemoVm.java | 7 +- .../core/eventbusservice/EventLogEntry.java | 5 +- .../eventbusservice/EventLogEntryJdo.java | 4 +- .../eventbusservice/EventLogEntryJpa.java | 4 +- .../EventSubscriberDemoImplementation.java | 4 +- .../messageservice/MessageServiceDemoVm.java | 6 +- .../wrapperFactory/WrapperFactoryEntity.java | 7 +- .../wrapperFactory/jdo/WrapperFactoryJdo.java | 3 +- .../wrapperFactory/jpa/WrapperFactoryJpa.java | 3 +- .../XmlSnapshotParentVm.java | 6 +- .../child/XmlSnapshotChildVm.java | 8 +- .../peer/XmlSnapshotPeerVm.java | 8 +- .../peer/child/XmlSnapshotPeerChildVm.java | 8 +- .../secman/apptenancy/AppTenancyVm.java | 6 +- .../secman/apptenancy/jdo/TenantedJdo.java | 6 +- .../secman/apptenancy/jpa/TenantedJpa.java | 6 +- .../persistence/TenantedEntity.java | 7 +- .../dom/types/isis/blobs/IsisBlobs.java | 4 +- .../dom/types/isis/blobs/jdo/IsisBlobJdo.java | 8 +- .../dom/types/isis/blobs/jpa/IsisBlobJpa.java | 16 +++- .../blobs/persistence/IsisBlobEntity.java | 7 +- .../dom/types/isis/blobs/vm/IsisBlobVm.java | 6 +- .../dom/types/isis/clobs/IsisClobs.java | 4 +- .../dom/types/isis/clobs/jdo/IsisClobJdo.java | 8 +- .../dom/types/isis/clobs/jpa/IsisClobJpa.java | 6 +- .../clobs/persistence/IsisClobEntity.java | 7 +- .../dom/types/isis/clobs/vm/IsisClobVm.java | 8 +- .../IsisLocalResourcePaths.java | 4 +- .../jdo/IsisLocalResourcePathJdo.java | 8 +- .../jpa/IsisLocalResourcePathJpa.java | 6 +- .../IsisLocalResourcePathEntity.java | 7 +- .../vm/IsisLocalResourcePathVm.java | 8 +- .../dom/types/isis/markups/IsisMarkups.java | 4 +- .../types/isis/markups/jdo/IsisMarkupJdo.java | 8 +- .../types/isis/markups/jpa/IsisMarkupJpa.java | 6 +- .../markups/persistence/IsisMarkupEntity.java | 7 +- .../types/isis/markups/vm/IsisMarkupVm.java | 6 +- .../types/isis/passwords/IsisPasswords.java | 4 +- .../isis/passwords/jdo/IsisPasswordJdo.java | 8 +- .../isis/passwords/jpa/IsisPasswordJpa.java | 6 +- .../persistence/IsisPasswordEntity.java | 8 +- .../isis/passwords/vm/IsisPasswordVm.java | 6 +- .../isisext/asciidocs/IsisAsciiDocs.java | 4 +- .../asciidocs/jdo/IsisAsciiDocJdo.java | 6 +- .../asciidocs/jpa/IsisAsciiDocJpa.java | 6 +- .../persistence/IsisAsciiDocEntity.java | 7 +- .../isisext/asciidocs/vm/IsisAsciiDocVm.java | 6 +- .../types/isisext/cal/IsisCalendarEvents.java | 4 +- .../isisext/cal/jdo/IsisCalendarEventJdo.java | 6 +- .../isisext/cal/jpa/IsisCalendarEventJpa.java | 6 +- .../persistence/IsisCalendarEventEntity.java | 7 +- .../isisext/cal/vm/IsisCalendarEventVm.java | 6 +- .../isisext/markdowns/IsisMarkdowns.java | 4 +- .../markdowns/jdo/IsisMarkdownJdo.java | 6 +- .../markdowns/jpa/IsisMarkdownJpa.java | 6 +- .../persistence/IsisMarkdownEntity.java | 7 +- .../isisext/markdowns/vm/IsisMarkdownVm.java | 6 +- .../types/isisext/sse/AsyncActionDemo.java | 4 +- .../dom/types/isisext/sse/DemoTask.java | 5 +- .../javaawt/images/JavaAwtBufferedImages.java | 4 +- .../images/jdo/JavaAwtBufferedImageJdo.java | 6 +- .../images/jpa/JavaAwtBufferedImageJpa.java | 6 +- .../JavaAwtBufferedImageEntity.java | 11 +-- .../images/vm/JavaAwtBufferedImageVm.java | 6 +- .../javalang/booleans/WrapperBooleans.java | 4 +- .../booleans/jdo/WrapperBooleanJdo.java | 8 +- .../booleans/jpa/WrapperBooleanJpa.java | 6 +- .../persistence/WrapperBooleanEntity.java | 7 +- .../booleans/vm/WrapperBooleanVm.java | 8 +- .../types/javalang/bytes/WrapperBytes.java | 5 +- .../javalang/bytes/jdo/WrapperByteJdo.java | 8 +- .../javalang/bytes/jpa/WrapperByteJpa.java | 6 +- .../bytes/persistence/WrapperByteEntity.java | 7 +- .../javalang/bytes/vm/WrapperByteVm.java | 8 +- .../characters/WrapperCharacters.java | 4 +- .../characters/jdo/WrapperCharacterJdo.java | 8 +- .../characters/jpa/WrapperCharacterJpa.java | 6 +- .../persistence/WrapperCharacterEntity.java | 7 +- .../characters/vm/WrapperCharacterVm.java | 8 +- .../javalang/doubles/WrapperDoubles.java | 4 +- .../doubles/jdo/WrapperDoubleJdo.java | 8 +- .../doubles/jpa/WrapperDoubleJpa.java | 6 +- .../persistence/WrapperDoubleEntity.java | 7 +- .../javalang/doubles/vm/WrapperDoubleVm.java | 8 +- .../types/javalang/floats/WrapperFloats.java | 4 +- .../javalang/floats/jdo/WrapperFloatJdo.java | 8 +- .../javalang/floats/jpa/WrapperFloatJpa.java | 6 +- .../persistence/WrapperFloatEntity.java | 7 +- .../javalang/floats/vm/WrapperFloatVm.java | 8 +- .../javalang/integers/WrapperIntegers.java | 4 +- .../integers/jdo/WrapperIntegerJdo.java | 8 +- .../integers/jpa/WrapperIntegerJpa.java | 6 +- .../persistence/WrapperIntegerEntity.java | 7 +- .../integers/vm/WrapperIntegerVm.java | 8 +- .../types/javalang/longs/WrapperLongs.java | 4 +- .../javalang/longs/jdo/WrapperLongJdo.java | 8 +- .../javalang/longs/jpa/WrapperLongJpa.java | 6 +- .../longs/persistence/WrapperLongEntity.java | 7 +- .../javalang/longs/vm/WrapperLongVm.java | 8 +- .../types/javalang/shorts/WrapperShorts.java | 4 +- .../javalang/shorts/jdo/WrapperShortJdo.java | 8 +- .../javalang/shorts/jpa/WrapperShortJpa.java | 6 +- .../persistence/WrapperShortEntity.java | 7 +- .../javalang/shorts/vm/WrapperShortVm.java | 8 +- .../javalang/strings/JavaLangStrings.java | 4 +- .../strings/jdo/JavaLangStringJdo.java | 8 +- .../strings/jpa/JavaLangStringJpa.java | 6 +- .../persistence/JavaLangStringEntity.java | 7 +- .../javalang/strings/vm/JavaLangStringVm.java | 6 +- .../types/javalang/voids/JavaLangVoids.java | 4 +- .../bigdecimals/JavaMathBigDecimals.java | 4 +- .../jdo/JavaMathBigDecimalJdo.java | 6 +- .../jpa/JavaMathBigDecimalJpa.java | 6 +- .../persistence/JavaMathBigDecimalEntity.java | 7 +- .../bigdecimals/vm/JavaMathBigDecimalVm.java | 11 +-- .../bigintegers/JavaMathBigIntegers.java | 4 +- .../jdo/JavaMathBigIntegerJdo.java | 8 +- .../jpa/JavaMathBigIntegerJpa.java | 6 +- .../persistence/JavaMathBigIntegerEntity.java | 7 +- .../bigintegers/vm/JavaMathBigIntegerVm.java | 8 +- .../dom/types/javanet/urls/JavaNetUrls.java | 4 +- .../types/javanet/urls/jdo/JavaNetUrlJdo.java | 8 +- .../types/javanet/urls/jpa/JavaNetUrlJpa.java | 6 +- .../urls/persistence/JavaNetUrlEntity.java | 7 +- .../types/javanet/urls/vm/JavaNetUrlVm.java | 8 +- .../javasql/javasqldate/JavaSqlDates.java | 4 +- .../javasqldate/jdo/JavaSqlDateJdo.java | 8 +- .../javasqldate/jpa/JavaSqlDateJpa.java | 6 +- .../persistence/JavaSqlDateEntity.java | 7 +- .../javasql/javasqldate/vm/JavaSqlDateVm.java | 8 +- .../javasqltimestamp/JavaSqlTimestamps.java | 4 +- .../jdo/JavaSqlTimestampJdo.java | 8 +- .../jpa/JavaSqlTimestampJpa.java | 6 +- .../persistence/JavaSqlTimestampEntity.java | 7 +- .../vm/JavaSqlTimestampVm.java | 8 +- .../javatimelocaldate/JavaTimeLocalDates.java | 4 +- .../jdo/JavaTimeLocalDateJdo.java | 8 +- .../jpa/JavaTimeLocalDateJpa.java | 6 +- .../persistence/JavaTimeLocalDateEntity.java | 7 +- .../vm/JavaTimeLocalDateVm.java | 8 +- .../JavaTimeLocalDateTimes.java | 4 +- .../jdo/JavaTimeLocalDateTimeJdo.java | 8 +- .../jpa/JavaTimeLocalDateTimeJpa.java | 6 +- .../JavaTimeLocalDateTimeEntity.java | 7 +- .../vm/JavaTimeLocalDateTimeVm.java | 8 +- .../javatimelocaltime/JavaTimeLocalTimes.java | 4 +- .../jdo/JavaTimeLocalTimeJdo.java | 9 +- .../jpa/JavaTimeLocalTimeJpa.java | 9 +- .../persistence/JavaTimeLocalTimeEntity.java | 7 +- .../vm/JavaTimeLocalTimeVm.java | 11 +-- .../JavaTimeOffsetDateTimes.java | 4 +- .../jdo/JavaTimeOffsetDateTimeJdo.java | 8 +- .../jpa/JavaTimeOffsetDateTimeJpa.java | 6 +- .../JavaTimeOffsetDateTimeEntity.java | 7 +- .../vm/JavaTimeOffsetDateTimeVm.java | 8 +- .../JavaTimeOffsetTimes.java | 4 +- .../jdo/JavaTimeOffsetTimeJdo.java | 8 +- .../jpa/JavaTimeOffsetTimeJpa.java | 6 +- .../persistence/JavaTimeOffsetTimeEntity.java | 7 +- .../vm/JavaTimeOffsetTimeVm.java | 8 +- .../JavaTimeZonedDateTimes.java | 4 +- .../jdo/JavaTimeZonedDateTimeJdo.java | 8 +- .../jpa/JavaTimeZonedDateTimeJpa.java | 6 +- .../JavaTimeZonedDateTimeEntity.java | 7 +- .../vm/JavaTimeZonedDateTimeVm.java | 8 +- .../javautil/javautildate/JavaUtilDates.java | 4 +- .../javautildate/jdo/JavaUtilDateJdo.java | 8 +- .../javautildate/jpa/JavaUtilDateJpa.java | 6 +- .../persistence/JavaUtilDateEntity.java | 7 +- .../javautildate/vm/JavaUtilDateVm.java | 8 +- .../types/javautil/uuids/JavaUtilUuids.java | 4 +- .../javautil/uuids/jdo/JavaUtilUuidJdo.java | 8 +- .../javautil/uuids/jpa/JavaUtilUuidJpa.java | 6 +- .../uuids/persistence/JavaUtilUuidEntity.java | 7 +- .../javautil/uuids/vm/JavaUtilUuidVm.java | 8 +- .../jodatime/jodadatetime/JodaDateTimes.java | 4 +- .../jodadatetime/jdo/JodaDateTimeJdo.java | 8 +- .../persistence/JodaDateTimeEntity.java | 7 +- .../jodadatetime/vm/JodaDateTimeVm.java | 11 +-- .../jodalocaldate/JodaLocalDates.java | 4 +- .../jodalocaldate/jdo/JodaLocalDateJdo.java | 8 +- .../persistence/JodaLocalDateEntity.java | 7 +- .../jodalocaldate/vm/JodaLocalDateVm.java | 11 +-- .../jodalocaldatetime/JodaLocalDateTimes.java | 4 +- .../jdo/JodaLocalDateTimeJdo.java | 8 +- .../persistence/JodaLocalDateTimeEntity.java | 7 +- .../vm/JodaLocalDateTimeVm.java | 11 +-- .../jodalocaltime/JodaLocalTimes.java | 4 +- .../jodalocaltime/jdo/JodaLocalTimeJdo.java | 8 +- .../persistence/JodaLocalTimeEntity.java | 7 +- .../jodalocaltime/vm/JodaLocalTimeVm.java | 11 +-- .../primitive/booleans/PrimitiveBooleans.java | 6 +- .../booleans/jdo/PrimitiveBooleanJdo.java | 6 +- .../booleans/jpa/PrimitiveBooleanJpa.java | 6 +- .../persistence/PrimitiveBooleanEntity.java | 7 +- .../booleans/vm/PrimitiveBooleanVm.java | 8 +- .../types/primitive/bytes/PrimitiveBytes.java | 6 +- .../primitive/bytes/jdo/PrimitiveByteJdo.java | 8 +- .../primitive/bytes/jpa/PrimitiveByteJpa.java | 6 +- .../persistence/PrimitiveByteEntity.java | 7 +- .../primitive/bytes/vm/PrimitiveByteVm.java | 8 +- .../types/primitive/chars/PrimitiveChars.java | 6 +- .../primitive/chars/jdo/PrimitiveCharJdo.java | 8 +- .../primitive/chars/jpa/PrimitiveCharJpa.java | 6 +- .../persistence/PrimitiveCharEntity.java | 7 +- .../primitive/chars/vm/PrimitiveCharVm.java | 8 +- .../primitive/doubles/PrimitiveDoubles.java | 6 +- .../doubles/jdo/PrimitiveDoubleJdo.java | 8 +- .../doubles/jpa/PrimitiveDoubleJpa.java | 6 +- .../persistence/PrimitiveDoubleEntity.java | 7 +- .../doubles/vm/PrimitiveDoubleVm.java | 8 +- .../primitive/floats/PrimitiveFloats.java | 6 +- .../floats/jdo/PrimitiveFloatJdo.java | 8 +- .../floats/jpa/PrimitiveFloatJpa.java | 6 +- .../persistence/PrimitiveFloatEntity.java | 7 +- .../primitive/floats/vm/PrimitiveFloatVm.java | 8 +- .../types/primitive/ints/PrimitiveInts.java | 6 +- .../primitive/ints/jdo/PrimitiveIntJdo.java | 8 +- .../primitive/ints/jpa/PrimitiveIntJpa.java | 6 +- .../ints/persistence/PrimitiveIntEntity.java | 7 +- .../primitive/ints/vm/PrimitiveIntVm.java | 8 +- .../types/primitive/longs/PrimitiveLongs.java | 6 +- .../primitive/longs/jdo/PrimitiveLongJdo.java | 8 +- .../primitive/longs/jpa/PrimitiveLongJpa.java | 6 +- .../persistence/PrimitiveLongEntity.java | 7 +- .../primitive/longs/vm/PrimitiveLongVm.java | 8 +- .../primitive/shorts/PrimitiveShorts.java | 6 +- .../shorts/jdo/PrimitiveShortJdo.java | 8 +- .../shorts/jpa/PrimitiveShortJpa.java | 6 +- .../persistence/PrimitiveShortEntity.java | 7 +- .../primitive/shorts/vm/PrimitiveShortVm.java | 8 +- .../BulkUpdateLineItemForDemoToDoItem.java | 8 +- .../BulkUpdateManagerForDemoToDoItem.java | 6 +- .../ExcelPivotByCategoryAndSubcategory.java | 7 +- .../ExcelUploadRowHandler4ToDoItem.java | 10 +-- .../DemoFixture_extending_ExcelFixture2.java | 9 +- .../excel/testing/ExcelFixture.java | 8 +- .../excel/testing/ExcelFixture2.java | 8 +- .../commandlog/applib/command/CommandLog.java | 6 +- .../commandlog/jdo/entities/CommandJdo.java | 6 +- .../commandlog/jpa/entities/CommandJpa.java | 3 +- .../api/ApplicationFeatureChoices.java | 6 +- .../ApplicationOrphanedPermissionManager.java | 6 +- .../permission/dom/ApplicationPermission.java | 6 +- .../applib/role/dom/ApplicationRole.java | 6 +- .../role/man/ApplicationRoleManager.java | 6 +- .../tenancy/dom/ApplicationTenancy.java | 7 +- .../man/ApplicationTenancyManager.java | 6 +- .../applib/user/dom/ApplicationUser.java | 6 +- .../mixins/perms/UserPermissionViewModel.java | 6 +- .../user/man/ApplicationUserManager.java | 6 +- .../permission/dom/ApplicationPermission.java | 16 ++-- .../secman/jdo/role/dom/ApplicationRole.java | 7 +- .../jdo/tenancy/dom/ApplicationTenancy.java | 17 ++-- .../secman/jdo/user/dom/ApplicationUser.java | 6 +- .../permission/dom/ApplicationPermission.java | 6 +- .../secman/jpa/role/dom/ApplicationRole.java | 3 +- .../jpa/tenancy/dom/ApplicationTenancy.java | 17 ++-- .../secman/jpa/user/dom/ApplicationUser.java | 6 +- .../applib/value/CalendarEvent.java | 5 +- .../viewer/source/gqltestdomain/E1.java | 19 ++-- .../viewer/source/gqltestdomain/E2.java | 31 +++++-- .../gqltestdomain/GQLTestDomainMenu.java | 21 +++-- .../beans/JdoBeanTypeClassifier.java | 7 ++ .../DomainModelTest_usingBadDomain.java | 27 +++--- .../interact/CommandArgumentTest.java | 7 +- .../viewers/jdo/wkt/TestAppJdoWkt.java | 6 +- .../viewers/jpa/wkt/TestAppJpaWkt.java | 6 +- .../testdomain/jdo/JdoInventoryJaxbVm.java | 6 +- .../isis/testdomain/jdo/entities/JdoBook.java | 5 +- .../testdomain/jdo/entities/JdoInventory.java | 3 +- .../testdomain/jdo/entities/JdoProduct.java | 7 +- .../jdo/entities/JdoProductComment.java | 5 +- .../testdomain/jpa/JpaInventoryJaxbVm.java | 6 +- .../isis/testdomain/jpa/entities/JpaBook.java | 5 +- .../entities/JpaEntityGeneratedLongId.java | 5 +- .../JpaEntityNonGeneratedStringId.java | 3 +- .../testdomain/jpa/entities/JpaInventory.java | 3 +- .../testdomain/jpa/entities/JpaProduct.java | 5 +- .../jpa/entities/JpaProductComment.java | 5 +- .../testdomain/jpa/springdata/Employee.java | 6 +- .../jpa/springdata/EmployeeManager.java | 4 +- .../model/actnsemantics/BlobDemo.java | 4 +- .../bad/InvalidLogicalTypeNameClash.java | 22 ++--- .../model/good/ElementTypeConcrete.java | 5 +- .../model/interaction/InteractionDemo.java | 4 +- .../model/interaction/InteractionNpmDemo.java | 4 +- .../testdomain/model/layout/LayoutDemo.java | 4 +- .../model/valuetypes/ValueTypeExample.java | 89 ++++++++++--------- .../composite/CalendarEventJaxbVm.java | 6 +- .../classrules/ArchitectureDomainRules.java | 38 +++----- .../classrules/ArchitectureJdoRules.java | 14 ++- .../applib/classrules/_LogicalNaming.java | 63 +++++++++++++ .../applib/domain/DomainArchTests.java | 8 +- .../domain/dom/SerializableViewModel.java | 4 +- .../applib/domain/dom/SomeDomainObject.java | 5 +- .../applib/fixturescripts/FixtureResult.java | 8 +- .../asciidoc/applib/value/AsciiDoc.java | 5 +- .../markdown/applib/value/Markdown.java | 5 +- 438 files changed, 1800 insertions(+), 1329 deletions(-) create mode 100644 testing/archtestsupport/applib/src/main/java/org/apache/isis/testing/archtestsupport/applib/classrules/_LogicalNaming.java 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/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/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..fe40ab91139 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 @@ -24,11 +24,16 @@ import java.util.Objects; import java.util.function.Supplier; +import javax.inject.Named; + 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 +108,56 @@ public static LogicalType fqcn( return eager(correspondingClass, correspondingClass.getName()); } + /** + * Infer from annotations. + */ + 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 fqcn + return eager(correspondingClass, correspondingClass.getName()); + } + // -- HIDDEN CONSTRUTORS private LogicalType( 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/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/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/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..d1973308a17 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 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..13afb846e10 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 @@ -23,6 +23,7 @@ import java.util.Collection; import java.util.Locale; +import javax.inject.Named; import javax.persistence.Entity; import javax.persistence.Table; @@ -129,12 +130,18 @@ public BeanClassification classify( String logicalTypeName = null; + // deprecated @DomainObject(logicalTypeName=...) val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null); if(aDomainObject!=null) { logicalTypeName = aDomainObject.logicalTypeName(); } - // don't trample over the @DomainObject(logicalTypeName=..) if present + val named = _Annotations.synthesize(type, Named.class).orElse(null); + if(named!=null) { + logicalTypeName = named.value(); + } + + // don't trample over the @Named/@DomainObject(logicalTypeName=..) if present if(_Strings.isEmpty(logicalTypeName)) { val aTable = _Annotations.synthesize(type, Table.class).orElse(null); if(aTable!=null) { @@ -160,9 +167,18 @@ public BeanClassification classify( if(aDomainObject!=null) { switch (aDomainObject.nature()) { case BEAN: + + // deprecated @DomainObject(logicalTypeName=...) + String logicalTypeName = aDomainObject.logicalTypeName(); + + val named = _Annotations.synthesize(type, Named.class).orElse(null); + if(named!=null) { + logicalTypeName = named.value(); + } + return BeanClassification.delegated( BeanSort.MANAGED_BEAN_CONTRIBUTING, - aDomainObject.logicalTypeName()); + _Strings.emptyToNull(logicalTypeName)); case MIXIN: return BeanClassification.selfManaged(BeanSort.MIXIN); case ENTITY: 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..64267f8ce66 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 @@ -311,7 +311,7 @@ void processEditing( .create(domainObjectIfAny, getConfiguration(), facetHolder)); } - // check from @DomainObject(logicalTypeName=...) + // check from @DomainObject(logicalTypeName=..., introspection=...) void processLogicalTypeName( final Optional domainObjectIfAny, final ProcessObjectTypeContext processClassContext) { 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/logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java index fba65794148..0ffe337c1b2 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/logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java @@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; +@Deprecated //@DomainObject(logicalTypeName=...) is deprecated public class LogicalTypeFacetForDomainObjectAnnotation extends LogicalTypeFacetAbstract { 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/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java index 602abab0597..e75746e6319 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/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java @@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; +@Deprecated //@LogicalTypeName(...) is deprecated public class LogicalTypeFacetForLogicalTypeNameAnnotation extends LogicalTypeFacetAbstract { diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java index b72c99a315c..29ac9968fee 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java @@ -47,6 +47,6 @@ public static Optional create( private LogicalTypeFacetForNamedAnnotation( final LogicalType logicalType, final FacetHolder holder) { - super(logicalType, holder, Precedence.DEFAULT); + super(logicalType, holder, Precedence.HIGH); } } 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 index a67f36564cc..4c75e61ba40 100644 --- 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 @@ -26,6 +26,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder; import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; +@Deprecated // @Value(logicalTypeName=...) is deprecated public class LogicalTypeFacetForValueAnnotation extends LogicalTypeFacetAbstract { 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 index fc0a85704f7..538e59b328f 100644 --- 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 @@ -27,6 +27,7 @@ import lombok.val; +@Deprecated // @Value(logicalTypeName=...) is deprecated public class ValueAnnotationFacetFactory extends FacetFactoryAbstract implements @@ -42,6 +43,7 @@ public void process(final ProcessObjectTypeContext processClassContext) { val cls = processClassContext.getCls(); val facetHolder = processClassContext.getFacetHolder(); + // deprecated // @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/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/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java index 47f729141d8..1bab00407ba 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,6 @@ 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.mixin.MixinFacet; import org.apache.isis.core.metamodel.facets.object.navparent.NavigableParentFacet; import org.apache.isis.core.metamodel.facets.object.parented.ParentedCollectionFacet; @@ -177,8 +176,7 @@ 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; @@ -191,8 +189,9 @@ public Can snapshot() { // -- Constructor - public ObjectSpecificationAbstract( + protected ObjectSpecificationAbstract( final Class introspectedClass, + final LogicalType logicalType, final String shortName, final BeanSort beanSort, final FacetProcessor facetProcessor, @@ -201,16 +200,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 +220,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 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..2ffac650c31 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,6 +30,7 @@ import org.apache.isis.applib.Identifier; import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy; +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.collections.ImmutableEnumSet; @@ -76,11 +77,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 /** @@ -109,7 +105,10 @@ public ObjectSpecificationDefault( final PostProcessor postProcessor, final ClassSubstitutorRegistry classSubstitutorRegistry) { - super(correspondingClass, determineShortName(correspondingClass), beanSort, facetProcessor, postProcessor); + super(correspondingClass, + LogicalType.infer(correspondingClass), + determineShortName(correspondingClass), + beanSort, facetProcessor, postProcessor); this.nameIfIsManagedBean = nameIfIsManagedBean; this.classSubstitutorRegistry = classSubstitutorRegistry; @@ -132,6 +131,11 @@ public ObjectSpecificationDefault( } + private static String determineShortName(final Class introspectedClass) { + final String name = introspectedClass.getName(); + return name.substring(name.lastIndexOf('.') + 1); + } + @Override protected void introspectTypeHierarchy() { 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..5441f32a4f7 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; @@ -40,7 +42,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 +51,13 @@ 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.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory; +import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation; 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.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; @@ -65,10 +67,12 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase { DomainObjectAnnotationFacetFactory facetFactory; + LogicalTypeFacetForAnnotationFacetFactory facetFactory2; @Before public void setUp() throws Exception { facetFactory = new DomainObjectAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); + facetFactory2 = new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); } @Override @@ -556,7 +560,8 @@ public void irrespective_of_configured_value() { public static class LogicalTypeName extends DomainObjectAnnotationFacetFactoryTest { - @DomainObject(logicalTypeName = "CUS") + @Named("CUS") + @DomainObject class CustomerWithDomainObjectAndObjectTypeSet { } @@ -574,14 +579,15 @@ public void setUp() throws Exception { @Test public void whenDomainObjectAndObjectTypeSetToTrue() { - facetFactory.process(new ProcessObjectTypeContext(CustomerWithDomainObjectAndObjectTypeSet.class, facetHolder)); + facetFactory2.process(ProcessClassContext + .forTesting(CustomerWithDomainObjectAndObjectTypeSet.class, mockMethodRemover, facetHolder)); final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class); Assert.assertNotNull(facet); - Assert.assertTrue(facet instanceof LogicalTypeFacetForDomainObjectAnnotation); - final LogicalTypeFacetForDomainObjectAnnotation facetForDomainObjectAnnotation = - (LogicalTypeFacetForDomainObjectAnnotation) facet; + Assert.assertTrue(facet instanceof LogicalTypeFacetForNamedAnnotation); + final LogicalTypeFacetForNamedAnnotation facetForDomainObjectAnnotation = + (LogicalTypeFacetForNamedAnnotation) facet; assertThat(facetForDomainObjectAnnotation.value(), is("CUS")); 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 index 68d85ff7246..08b43506e6f 100644 --- 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 @@ -18,6 +18,8 @@ */ package org.apache.isis.core.metamodel.facets.object.domainobject; +import javax.inject.Named; + import org.junit.Before; import org.junit.Test; @@ -28,38 +30,38 @@ 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.FacetFactory.ProcessClassContext; +import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory; +import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation; 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; + private LogicalTypeFacetForAnnotationFacetFactory facetFactory; @Before public void setUp() throws Exception { - facetFactory = new DomainObjectAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); + facetFactory = new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); } @Test public void logicalTypeNameAnnotationPickedUpOnClass() { - @DomainObject(logicalTypeName = "CUS") + @Named("CUS") + @DomainObject class Customer { } expectNoMethodsRemoved(); - val context = new ProcessObjectTypeContext(Customer.class, facetHolder); - facetFactory.processLogicalTypeName(context.synthesizeOnType(DomainObject.class), context); + facetFactory.process(ProcessClassContext + .forTesting(Customer.class, mockMethodRemover, facetHolder)); final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class); assertThat(facet, is(not(nullValue()))); - assertThat(facet instanceof LogicalTypeFacetForDomainObjectAnnotation, is(true)); + assertThat(facet instanceof LogicalTypeFacetForNamedAnnotation, is(true)); assertThat(facet.value(), is("CUS")); } 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 index 5af24c1b562..b33cd622c5b 100644 --- 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 @@ -18,6 +18,8 @@ */ package org.apache.isis.core.metamodel.facets.object.logicaltype; +import javax.inject.Named; + import org.datanucleus.testing.dom.CustomerAsProxiedByDataNucleus; import org.junit.Test; @@ -28,11 +30,15 @@ import org.apache.isis.applib.annotation.Value; 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; +import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory; +import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation; 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; +import org.apache.isis.core.metamodel.methods.MethodByClassMap; + +import lombok.val; public class LogicalTypeFacetFromClassNameFactoryTest extends AbstractFacetFactoryJUnit4TestCase { @@ -78,23 +84,26 @@ public void installsFacet_onValues() { assertThat(facet.value(), is(ValueExample1.class.getCanonicalName())); } - @Value(logicalTypeName = "xxx.ValueExample") + @Named("xxx.ValueExample") + @Value public static class ValueExample2 { } @Test public void installsFacet_onValuesUsingLogicalTypeName() { - facetFactory = new ValueAnnotationFacetFactory(metaModelContext); + val facetFactory = + new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); expectNoMethodsRemoved(); - facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(ValueExample2.class, facetHolder)); + facetFactory.process(ProcessClassContext + .forTesting(ValueExample2.class, mockMethodRemover, facetHolder)); final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class); assertThat(facet, is(not(nullValue()))); - assertThat(facet instanceof LogicalTypeFacetForValueAnnotation, is(true)); + assertThat(facet instanceof LogicalTypeFacetForNamedAnnotation, is(true)); assertThat(facet.value(), is("xxx.ValueExample")); } 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/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/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.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.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 e7024c6c352..ef0a38e2c10 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(name = "root") @XmlType @XmlAccessorType(XmlAccessType.FIELD) + @Named("demo.StatefulViewModelUsingJaxb.Child") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "demo.StatefulViewModelUsingJaxb.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/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.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.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 index 30255bddf14..2ed11557065 100644 --- 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 @@ -28,6 +28,7 @@ import java.util.UUID; import java.util.function.Consumer; +import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Transient; @@ -74,10 +75,9 @@ * Note that this class doesn't subclass from {@link Command} ({@link Command} * is not an interface). */ +@Named(CommandLog.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = CommandLog.LOGICAL_TYPE_NAME, - editing = Editing.DISABLED -) + editing = Editing.DISABLED) @DomainObjectLayout( named = "Command", titleUiEvent = ICommandLog.TitleUiEvent.class, 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 index 9afbe85be02..7e5a80586e1 100644 --- 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 @@ -20,6 +20,7 @@ import java.sql.Timestamp; +import javax.inject.Named; import javax.jdo.annotations.IdentityType; import org.apache.isis.applib.annotation.DomainObject; @@ -214,10 +215,9 @@ // + " WHERE replayState = 'PENDING' " // + "ORDER BY this.timestamp DESC " // + "RANGE 0,20"), +@Named(CommandJdo.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = CommandJdo.LOGICAL_TYPE_NAME, - editing = Editing.DISABLED -) + editing = Editing.DISABLED) //@Log4j2 @NoArgsConstructor public class CommandJdo 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 index fdad490d967..e728108a687 100644 --- 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 @@ -20,6 +20,7 @@ import java.sql.Timestamp; +import javax.inject.Named; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; @@ -182,8 +183,8 @@ // + "ORDER BY this.timestamp DESC " // + "RANGE 0,20"), +@Named(CommandJpa.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = CommandJpa.LOGICAL_TYPE_NAME, editing = Editing.DISABLED) @EntityListeners(IsisEntityListener.class) @NoArgsConstructor 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..8de46ae7648 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,6 +28,7 @@ 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.Editing; @@ -80,9 +81,8 @@ * * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ApplicationPermission.LOGICAL_TYPE_NAME -) +@Named(ApplicationPermission.LOGICAL_TYPE_NAME) +@DomainObject public abstract class ApplicationPermission implements Comparable { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationPermission"; 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..863b9d63471 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,6 +27,7 @@ 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; @@ -50,9 +51,8 @@ /** * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ApplicationRole.LOGICAL_TYPE_NAME -) +@Named(ApplicationRole.LOGICAL_TYPE_NAME) +@DomainObject public abstract class ApplicationRole implements Comparable { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationRole"; 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..1edb4b9ea07 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,6 +25,8 @@ 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.Editing; @@ -44,9 +46,8 @@ /** * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ApplicationTenancy.LOGICAL_TYPE_NAME -) +@Named(ApplicationTenancy.LOGICAL_TYPE_NAME) +@DomainObject public abstract class ApplicationTenancy implements Comparable { public static final String LOGICAL_TYPE_NAME = IsisModuleExtSecmanApplib.NAMESPACE + ".ApplicationTenancy"; 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..719a9d9a250 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 @@ -28,6 +28,7 @@ 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; @@ -67,9 +68,8 @@ /** * @since 2.0 {@index} */ -@DomainObject( - logicalTypeName = ApplicationUser.LOGICAL_TYPE_NAME -) +@Named(ApplicationUser.LOGICAL_TYPE_NAME) +@DomainObject public abstract class ApplicationUser implements HasUsername, HasAtPath, Comparable { 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/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..14cf324900c 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; @@ -97,9 +98,8 @@ name = "ApplicationPermission_role_feature_rule_UNQ", members = { "role", "featureSort", "featureFqn", "rule" }) }) -@DomainObject( - logicalTypeName = ApplicationPermission.LOGICAL_TYPE_NAME -) +@Named(ApplicationPermission.LOGICAL_TYPE_NAME) +@DomainObject @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_CHILD ) @@ -120,7 +120,7 @@ public ApplicationRole getRole() { return role; } @Override - public void setRole(ApplicationRole role) { + public void setRole(final ApplicationRole role) { this.role = _Casts.uncheckedCast(role); } @@ -136,7 +136,7 @@ public ApplicationPermissionRule getRule() { return rule; } @Override - public void setRule(ApplicationPermissionRule rule) { + public void setRule(final ApplicationPermissionRule rule) { this.rule = rule; } @@ -152,7 +152,7 @@ public ApplicationPermissionMode getMode() { return mode; } @Override - public void setMode(ApplicationPermissionMode mode) { + public void setMode(final ApplicationPermissionMode mode) { this.mode = mode; } @@ -168,7 +168,7 @@ public ApplicationFeatureSort getFeatureSort() { return featureSort; } @Override - public void setFeatureSort(ApplicationFeatureSort featureSort) { + public void setFeatureSort(final ApplicationFeatureSort featureSort) { this.featureSort = featureSort; } @@ -184,7 +184,7 @@ public String getFeatureFqn() { return featureFqn; } @Override - public void setFeatureFqn(String featureFqn) { + public void setFeatureFqn(final String featureFqn) { this.featureFqn = 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..927a4bf2442 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; @@ -66,9 +67,9 @@ + "FROM " + ApplicationRole.FQCN + " WHERE name.matches(:regex) ") }) +@Named(ApplicationRole.LOGICAL_TYPE_NAME) @DomainObject( bounding = Bounding.BOUNDED, - logicalTypeName = ApplicationRole.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationRoleRepository.class, autoCompleteMethod = "findMatching" ) @@ -93,7 +94,7 @@ public String getName() { return name; } @Override - public void setName(String name) { + public void setName(final String name) { this.name = name; } @@ -109,7 +110,7 @@ public String getDescription() { return description; } @Override - public void setDescription(String description) { + public void setDescription(final String description) { this.description = description; } 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..1ea033736ea 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; @@ -74,14 +75,12 @@ value = "SELECT " + "FROM " + ApplicationTenancy.FQCN + " WHERE name.matches(:regex) || path.matches(:regex) ")}) +@Named(ApplicationTenancy.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = ApplicationTenancy.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationTenancyRepository.class, - autoCompleteMethod = "findMatching" -) + autoCompleteMethod = "findMatching") @DomainObjectLayout( - bookmarking = BookmarkPolicy.AS_ROOT - ) + bookmarking = BookmarkPolicy.AS_ROOT) public class ApplicationTenancy extends org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy { @@ -99,7 +98,7 @@ public String getName() { return name; } @Override - public void setName(String name) { + public void setName(final String name) { this.name = name; } @@ -116,7 +115,7 @@ public String getPath() { return path; } @Override - public void setPath(String path) { + public void setPath(final String path) { this.path = path; } @@ -133,7 +132,7 @@ public org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy g return parent; } @Override - public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { + public void setParent(final org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { this.parent = _Casts.uncheckedCast(parent); } @@ -148,7 +147,7 @@ public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.Appli 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..a8ead18fcee 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 @@ -22,6 +22,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.Element; @@ -91,11 +92,10 @@ + " || knownAs.matches(:regex)" + " || emailAddress.matches(:regex)") }) +@Named(ApplicationUser.LOGICAL_TYPE_NAME) @DomainObject( - logicalTypeName = ApplicationUser.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationUserRepository.class, - autoCompleteMethod = "findMatching" -) + autoCompleteMethod = "findMatching") @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_ROOT ) 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..0ff785478c3 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; @@ -95,9 +96,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 ) 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..3404303b0a8 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; @@ -64,9 +65,9 @@ + "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" ) 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..2181952e3cb 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; @@ -67,14 +68,12 @@ + " 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" - ) + autoCompleteMethod = "findMatching") @DomainObjectLayout( - bookmarking = BookmarkPolicy.AS_ROOT - ) + bookmarking = BookmarkPolicy.AS_ROOT) public class ApplicationTenancy extends org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy { @@ -94,7 +93,7 @@ public String getName() { return name; } @Override - public void setName(String name) { + public void setName(final String name) { this.name = name; } @@ -111,7 +110,7 @@ public String getPath() { return path; } @Override - public void setPath(String path) { + public void setPath(final String path) { this.path = path; } @@ -128,7 +127,7 @@ public org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy g return parent; } @Override - public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { + public void setParent(final org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { this.parent = _Casts.uncheckedCast(parent); } @@ -143,7 +142,7 @@ public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.Appli public Set 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-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..0ac8e09265e 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 @@ -22,6 +22,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; @@ -86,11 +87,10 @@ + " 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 ) 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/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..dc3fdc46aaf 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 @@ -20,6 +20,7 @@ import java.util.Locale; +import javax.inject.Named; import javax.jdo.annotations.EmbeddedOnly; import org.apache.isis.applib.annotation.DomainObject; @@ -54,11 +55,17 @@ public BeanClassification classify( String logicalTypeName = null; + // deprecated @DomainObject(logicalTypeName=...) val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null); if(aDomainObject!=null) { logicalTypeName = aDomainObject.logicalTypeName(); } + val named = _Annotations.synthesize(type, Named.class).orElse(null); + if(named!=null) { + logicalTypeName = named.value(); + } + // don't trample over the @DomainObject(logicalTypeName=..) if present if(_Strings.isEmpty(logicalTypeName)) { val schema = persistenceCapableAnnot.get().schema(); 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..ed085cbf28a 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,7 +61,6 @@ 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.InvalidOrphanedActionSupport; import org.apache.isis.testdomain.model.bad.InvalidOrphanedCollectionSupport; @@ -68,9 +70,6 @@ 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( @@ -200,16 +199,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-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-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..7d739873e27 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; @@ -68,10 +69,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 { 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..23db6d71e1b 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,9 @@ "books", "booksForTab1", "booksForTab2"} ) @XmlAccessorType(XmlAccessType.FIELD) +@Named("testdomain.jdo.JdoInventoryJaxbVm") @DomainObject( - nature=Nature.VIEW_MODEL - , logicalTypeName = "testdomain.jdo.JdoInventoryJaxbVm" -) + nature=Nature.VIEW_MODEL) public class JdoInventoryJaxbVm { @XmlTransient @Inject 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/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/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/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/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/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 { From c675a0676d00d6031a099780ade26eca8e3e22b9 Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Tue, 24 May 2022 14:24:20 +0200 Subject: [PATCH 04/43] ISIS-3063: purge logical naming facets --- .../isis/applib/annotation/Aliased.java | 54 -------- .../isis/applib/annotation/DomainObject.java | 7 +- .../isis/applib/annotation/DomainService.java | 7 ++ .../apache/isis/applib/id/LogicalType.java | 27 +++- .../beans/IsisBeanTypeClassifierDefault.java | 63 ++-------- .../progmodel/ProgrammingModelConstants.java | 4 +- ...liasedFacetForDomainObjectAnnotation.java} | 31 ++--- .../DomainObjectAnnotationFacetFactory.java | 25 ++-- ...calTypeFacetForAnnotationFacetFactory.java | 67 ---------- ...TypeFacetForLogicalTypeNameAnnotation.java | 53 -------- .../LogicalTypeFacetForNamedAnnotation.java | 52 -------- ...ogicalTypeFacet.java => AliasedFacet.java} | 9 +- ...bstract.java => AliasedFacetAbstract.java} | 28 ++--- .../LogicalTypeMalformedValidator.java | 8 +- .../LogicalTypeFacetFromClassName.java | 37 ------ .../LogicalTypeFacetFromClassNameFactory.java | 49 +------- ...LogicalTypeFacetFromIoCNamingStrategy.java | 36 ------ .../LogicalTypeFacetOnStandaloneList.java | 30 ----- ...AnyMatchingValueSemanticsFacetFactory.java | 10 +- .../LogicalTypeFacetForValueAnnotation.java | 52 -------- .../ValueAnnotationFacetFactory.java | 54 -------- .../dflt/ProgrammingModelFacetsJava11.java | 3 - .../LogicalTypeResolverDefault.java | 9 +- .../specimpl/IntrospectionState.java | 2 +- ...omainObjectAnnotationFacetFactoryTest.java | 26 +--- .../NamedAnnotationFacetFactoryTest.java | 32 +++-- .../ObjectTypeAnnotationFacetFactoryTest.java | 69 ---------- ...icalTypeFacetFromClassNameFactoryTest.java | 113 ----------------- .../logicaltype/LogicalTypeInferenceTest.java | 66 ++++++++++ .../param/name/ParameterNameFacetTest.java | 4 +- .../testspec/ObjectSpecificationStub.java | 13 +- .../dom/CustomerAsProxiedByDataNucleus.java | 4 +- .../beans/JdoBeanTypeClassifier.java | 41 ++---- ...doDiscriminatorAnnotationFacetFactory.java | 111 ---------------- .../JdoDiscriminatorFacetDefault.java | 31 ----- .../object/discriminator/package-info.java | 17 --- ...peFacetFromJdoPersistenceCapableFacet.java | 58 --------- .../JdoPersistenceCapableFacetFactory.java | 9 -- ...scriminatorAnnotationFacetFactoryTest.java | 118 ------------------ .../discriminator/JdoDiscriminatorFacet.java | 25 ---- .../LogicalTypeFacetForTableAnnotation.java | 57 --------- .../table/JpaTableAnnotationFacetFactory.java | 8 -- 42 files changed, 230 insertions(+), 1289 deletions(-) delete mode 100644 api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java rename core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/{logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java => AliasedFacetForDomainObjectAnnotation.java} (67%) delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForAnnotationFacetFactory.java delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java rename core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/{LogicalTypeFacet.java => AliasedFacet.java} (91%) rename core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/{LogicalTypeFacetAbstract.java => AliasedFacetAbstract.java} (69%) delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassName.java delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/LogicalTypeFacetForValueAnnotation.java delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java rename persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java => core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java (56%) delete mode 100644 core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java delete mode 100644 core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetFromClassNameFactoryTest.java create mode 100644 core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java delete mode 100644 persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java delete mode 100644 persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorFacetDefault.java delete mode 100644 persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/package-info.java delete mode 100644 persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetFromJdoPersistenceCapableFacet.java delete mode 100644 persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java delete mode 100644 persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java delete mode 100644 persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java deleted file mode 100644 index 8768f262945..00000000000 --- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java +++ /dev/null @@ -1,54 +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.applib.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import javax.inject.Named; - -import org.apache.isis.applib.services.bookmark.Bookmark; - -/** - * Introduced to allow for historic bookmarks to be resolved to - * their corresponding new types. - * @see Bookmark - * @see Named - * - * @since 2.0 {@index} - */ -@Inherited -@Target({ - ElementType.TYPE, - ElementType.ANNOTATION_TYPE -}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Aliased { - - /** - * Alternative logical type name(s) for the annotated type. - * @see Bookmark - * @see Named - */ - String[] value() default {}; - -} 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 7d10da9d6f3..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. 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 1106ad67b1e..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 * 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 fe40ab91139..e5a52fe773a 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,10 +21,13 @@ 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; @@ -111,6 +114,7 @@ public static LogicalType fqcn( /** * Infer from annotations. */ + @SuppressWarnings("removal") public static LogicalType infer( final @NonNull Class correspondingClass) { @@ -154,8 +158,29 @@ public static LogicalType infer( 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, correspondingClass.getName()); + return eager(correspondingClass, + Optional + .ofNullable(correspondingClass.getCanonicalName()) + .orElseGet(correspondingClass::getName)); } // -- HIDDEN CONSTRUTORS 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 13afb846e10..00b2c4254b3 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,20 +21,17 @@ import java.io.Serializable; import java.lang.reflect.Modifier; import java.util.Collection; -import java.util.Locale; -import javax.inject.Named; 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; @@ -105,12 +102,11 @@ public BeanClassification classify( val aDomainService = _Annotations.synthesize(type, DomainService.class); if(aDomainService.isPresent()) { - return _Strings.isNotEmpty(aDomainService.get().logicalTypeName()) - ? BeanClassification + val logicalType = LogicalType.infer(type); + // overrides Spring naming strategy + return BeanClassification .delegated(BeanSort.MANAGED_BEAN_CONTRIBUTING, - aDomainService.get().logicalTypeName()) - : BeanClassification - .delegated(BeanSort.MANAGED_BEAN_CONTRIBUTING); + logicalType.getLogicalTypeName()); } // allow ServiceLoader plugins to have a say, eg. when classifying entity types @@ -127,58 +123,19 @@ public BeanClassification classify( val entityAnnotation = _Annotations.synthesize(type, Entity.class).orElse(null); if(entityAnnotation!=null) { - - String logicalTypeName = null; - - // deprecated @DomainObject(logicalTypeName=...) - val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null); - if(aDomainObject!=null) { - logicalTypeName = aDomainObject.logicalTypeName(); - } - - val named = _Annotations.synthesize(type, Named.class).orElse(null); - if(named!=null) { - logicalTypeName = named.value(); - } - - // don't trample over the @Named/@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); + val logicalType = LogicalType.infer(type); + return BeanClassification.selfManaged( + BeanSort.ENTITY, logicalType.getLogicalTypeName()); } val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null); if(aDomainObject!=null) { switch (aDomainObject.nature()) { case BEAN: - - // deprecated @DomainObject(logicalTypeName=...) - String logicalTypeName = aDomainObject.logicalTypeName(); - - val named = _Annotations.synthesize(type, Named.class).orElse(null); - if(named!=null) { - logicalTypeName = named.value(); - } - + val logicalTypeName = LogicalType.infer(type).getLogicalTypeName(); return BeanClassification.delegated( BeanSort.MANAGED_BEAN_CONTRIBUTING, - _Strings.emptyToNull(logicalTypeName)); + logicalTypeName); case MIXIN: return BeanClassification.selfManaged(BeanSort.MIXIN); case ENTITY: 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..b79084ddea0 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, " 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 67% 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 0ffe337c1b2..8cfd760020e 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,37 +16,38 @@ * 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.logicaltype.AliasedFacet; +import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacetAbstract; -@Deprecated //@DomainObject(logicalTypeName=...) is deprecated -public class LogicalTypeFacetForDomainObjectAnnotation -extends LogicalTypeFacetAbstract { +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 64267f8ce66..959c9aeac43 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 @@ -25,6 +25,7 @@ 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; @@ -71,7 +72,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 +112,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 +167,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 +313,8 @@ void processEditing( .create(domainObjectIfAny, getConfiguration(), facetHolder)); } - // check from @DomainObject(logicalTypeName=..., introspection=...) - void processLogicalTypeName( + // check from @DomainObject(aliased=...) + void processAliased( final Optional domainObjectIfAny, final ProcessObjectTypeContext processClassContext) { @@ -320,16 +322,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) { diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForAnnotationFacetFactory.java deleted file mode 100644 index 150f630006f..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForAnnotationFacetFactory.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.logicaltype; - -import javax.inject.Inject; -import javax.inject.Named; - -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 LogicalTypeFacetForAnnotationFacetFactory -extends FacetFactoryAbstract { - - @Inject - public LogicalTypeFacetForAnnotationFacetFactory( - final MetaModelContext mmc, - final MethodByClassMap postConstructMethodsCache) { - super(mmc, FeatureType.OBJECTS_ONLY); - } - - @Override - public void process(final ProcessClassContext processClassContext) { - - val cls = processClassContext.getCls(); - val facetHolder = processClassContext.getFacetHolder(); - - // deprecated annotation @LogicalTypeName - if(cls.isInterface() - || ClassExtensions.isAbstract(cls)) { - val logicalTypeNameIfAny = processClassContext.synthesizeOnType(LogicalTypeName.class); - FacetUtil.addFacetIfPresent( - LogicalTypeFacetForLogicalTypeNameAnnotation - .create(logicalTypeNameIfAny, cls, facetHolder)); - } - - val namedIfAny = processClassContext.synthesizeOnType(Named.class); - - FacetUtil.addFacetIfPresent( - LogicalTypeFacetForNamedAnnotation - .create(namedIfAny, 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/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java deleted file mode 100644 index e75746e6319..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java +++ /dev/null @@ -1,53 +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 java.util.Optional; - -import org.apache.isis.applib.annotation.LogicalTypeName; -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; - -@Deprecated //@LogicalTypeName(...) is deprecated -public class LogicalTypeFacetForLogicalTypeNameAnnotation -extends LogicalTypeFacetAbstract { - - public static Optional create( - final Optional logicalTypeIfAny, - final Class correspondingClass, - final FacetHolder holder) { - - return logicalTypeIfAny - .map(annot->annot.value()) - .filter(_Strings::isNotEmpty) - .map(logicalTypeName -> new LogicalTypeFacetForLogicalTypeNameAnnotation( - LogicalType.eager(correspondingClass, logicalTypeName), - holder)); - } - - private LogicalTypeFacetForLogicalTypeNameAnnotation( - final LogicalType logicalType, - final FacetHolder holder) { - // Precedence.LOW ensures, to get overruled by @DomainObject(logicalTypeName=...) - super(logicalType, holder, Precedence.LOW); - } -} diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java deleted file mode 100644 index 29ac9968fee..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.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.object.domainobject.logicaltype; - -import java.util.Optional; - -import javax.inject.Named; - -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; - -public class LogicalTypeFacetForNamedAnnotation -extends LogicalTypeFacetAbstract { - - public static Optional create( - final Optional namedIfAny, - final Class correspondingClass, - final FacetHolder holder) { - - return namedIfAny - .map(annot->annot.value()) - .filter(_Strings::isNotEmpty) - .map(logicalTypeName -> new LogicalTypeFacetForNamedAnnotation( - LogicalType.eager(correspondingClass, logicalTypeName), - holder)); - } - - private LogicalTypeFacetForNamedAnnotation( - final LogicalType logicalType, - final FacetHolder holder) { - super(logicalType, holder, Precedence.HIGH); - } -} 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 91% 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 e5b7f0827b2..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 @@ -21,6 +21,7 @@ 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; /** @@ -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 { +public interface AliasedFacet extends Facet { - LogicalType getLogicalType(); - - 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..cea0dc5abe2 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 @@ -49,12 +49,8 @@ public void refineProgrammingModel(final ProgrammingModel programmingModel) { 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()); 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..09514d3f5dd 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). " diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java deleted file mode 100644 index 8e43e636def..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java +++ /dev/null @@ -1,36 +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.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; - -/** - * @since 2.0 - */ -public class LogicalTypeFacetFromIoCNamingStrategy -extends LogicalTypeFacetAbstract { - - LogicalTypeFacetFromIoCNamingStrategy( - 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/LogicalTypeFacetOnStandaloneList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java deleted file mode 100644 index bbf822df1c5..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java +++ /dev/null @@ -1,30 +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.facetapi.FacetHolder; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract; - -public class LogicalTypeFacetOnStandaloneList extends LogicalTypeFacetAbstract { - - public LogicalTypeFacetOnStandaloneList(final LogicalType logicalType, final FacetHolder holder) { - super(logicalType, holder); - } -} 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/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 4c75e61ba40..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/LogicalTypeFacetForValueAnnotation.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 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; - -@Deprecated // @Value(logicalTypeName=...) is deprecated -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 538e59b328f..00000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java +++ /dev/null @@ -1,54 +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; - -@Deprecated // @Value(logicalTypeName=...) is deprecated -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(); - - // deprecated - // @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/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java index e0fb1088afb..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.LogicalTypeFacetForAnnotationFacetFactory; 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 LogicalTypeFacetForAnnotationFacetFactory(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/specloader/LogicalTypeResolverDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java index ce7a271a8b6..8f92d4d553c 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; @@ -50,7 +49,7 @@ public void register(final @NonNull ObjectSpecification spec) { // collect concrete classes (do not collect abstract or anonymous types or interfaces) if(!spec.isAbstract() - && hasUsableObjectTypeFacet(spec)) { + && hasTypeIdentity(spec)) { val key = spec.getLogicalTypeName(); @@ -74,10 +73,10 @@ && hasUsableObjectTypeFacet(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; } } 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/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 5441f32a4f7..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 @@ -35,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; @@ -51,10 +52,8 @@ 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.LogicalTypeFacetForAnnotationFacetFactory; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation; 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.ViewModelFacet; import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacetForDomainObjectAnnotation; @@ -67,12 +66,10 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase { DomainObjectAnnotationFacetFactory facetFactory; - LogicalTypeFacetForAnnotationFacetFactory facetFactory2; @Before public void setUp() throws Exception { facetFactory = new DomainObjectAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); - facetFactory2 = new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); } @Override @@ -578,19 +575,8 @@ public void setUp() throws Exception { @Test public void whenDomainObjectAndObjectTypeSetToTrue() { - - facetFactory2.process(ProcessClassContext - .forTesting(CustomerWithDomainObjectAndObjectTypeSet.class, mockMethodRemover, facetHolder)); - - final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class); - Assert.assertNotNull(facet); - - Assert.assertTrue(facet instanceof LogicalTypeFacetForNamedAnnotation); - final LogicalTypeFacetForNamedAnnotation facetForDomainObjectAnnotation = - (LogicalTypeFacetForNamedAnnotation) facet; - - assertThat(facetForDomainObjectAnnotation.value(), is("CUS")); - + assertThat(LogicalType.infer(CustomerWithDomainObjectAndObjectTypeSet.class).getLogicalTypeName(), + is("CUS")); expectNoMethodsRemoved(); } @@ -600,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(); @@ -612,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/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java similarity index 56% rename from persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java rename to core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java index bc5942e3b30..a5f2592ee0f 100644 --- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java +++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java @@ -16,20 +16,32 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator; +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 LogicalTypeFacetFromJdoDiscriminatorValueAnnotation -extends LogicalTypeFacetAbstract { + @Test + public void logicalTypeNameAnnotationPickedUpOnClass() { + + @Named("CUS") + @DomainObject + class Customer { + } + + assertThat(LogicalType.infer(Customer.class).getLogicalTypeName(), is("CUS")); - public LogicalTypeFacetFromJdoDiscriminatorValueAnnotation( - 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 08b43506e6f..00000000000 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java +++ /dev/null @@ -1,69 +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 javax.inject.Named; - -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.FacetFactory.ProcessClassContext; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation; -import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet; -import org.apache.isis.core.metamodel.methods.MethodByClassMap; - -public class ObjectTypeAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase { - - private LogicalTypeFacetForAnnotationFacetFactory facetFactory; - - @Before - public void setUp() throws Exception { - facetFactory = new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); - } - - @Test - public void logicalTypeNameAnnotationPickedUpOnClass() { - - @Named("CUS") - @DomainObject - class Customer { - } - - expectNoMethodsRemoved(); - - facetFactory.process(ProcessClassContext - .forTesting(Customer.class, mockMethodRemover, facetHolder)); - - final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class); - - assertThat(facet, is(not(nullValue()))); - assertThat(facet instanceof LogicalTypeFacetForNamedAnnotation, is(true)); - assertThat(facet.value(), is("CUS")); - - } - -} 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 b33cd622c5b..00000000000 --- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetFromClassNameFactoryTest.java +++ /dev/null @@ -1,113 +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 javax.inject.Named; - -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.FacetFactory.ProcessClassContext; -import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory; -import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation; -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.methods.MethodByClassMap; - -import lombok.val; - -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())); - } - - @Named("xxx.ValueExample") - @Value - public static class ValueExample2 { - } - - @Test - public void installsFacet_onValuesUsingLogicalTypeName() { - - val facetFactory = - new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap()); - - expectNoMethodsRemoved(); - - facetFactory.process(ProcessClassContext - .forTesting(ValueExample2.class, mockMethodRemover, facetHolder)); - - final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class); - - assertThat(facet, is(not(nullValue()))); - assertThat(facet instanceof LogicalTypeFacetForNamedAnnotation, 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/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java index 0de46cd2827..49b3ea5b9ac 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; @@ -98,8 +96,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,12 +136,8 @@ public String getFullIdentifier() { return name; } - @Synchronized @Override public LogicalType getLogicalType() { - if(logicalType == null) { - logicalType = getFacet(LogicalTypeFacet.class).getLogicalType(); - } return logicalType; } 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/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 dc3fdc46aaf..8da281bcf93 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 @@ -18,12 +18,9 @@ */ package org.apache.isis.persistence.jdo.metamodel.beans; -import java.util.Locale; - -import javax.inject.Named; 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; @@ -41,7 +38,8 @@ public class JdoBeanTypeClassifier implements IsisBeanTypeClassifier { public BeanClassification 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(); @@ -53,39 +51,24 @@ public BeanClassification classify( return null; // don't categorize as entity ... fall through in the caller's logic } - String logicalTypeName = null; - - // deprecated @DomainObject(logicalTypeName=...) - val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null); - if(aDomainObject!=null) { - logicalTypeName = aDomainObject.logicalTypeName(); - } + String logicalTypeName = LogicalType.infer(type).getLogicalTypeName(); - val named = _Annotations.synthesize(type, Named.class).orElse(null); - if(named!=null) { - logicalTypeName = named.value(); - } - - // don't trample over the @DomainObject(logicalTypeName=..) if present - if(_Strings.isEmpty(logicalTypeName)) { + // don't trample over the @Named(=...) if present + if(logicalTypeName.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), - _Strings.isNotEmpty(table) - ? table - : type.getSimpleName()); + //FIXME - this custom name is never honored +// 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 BeanClassification.selfManaged(BeanSort.ENTITY, logicalTypeName); } return null; // we don't feel responsible 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/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/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java b/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java deleted file mode 100644 index 92899efb6a5..00000000000 --- a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java +++ /dev/null @@ -1,25 +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.provider.metamodel.facets.object.discriminator; - -import org.apache.isis.core.metamodel.facets.SingleValueFacet; - -public interface JdoDiscriminatorFacet extends SingleValueFacet { - -} 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; } From d0878b403f9acdcb1be5cd0bf94f1aaaf8e3e268 Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Tue, 24 May 2022 17:41:39 +0200 Subject: [PATCH 05/43] ISIS-3063: make it the responsibility of the bean-type-classifiers to determine logical-type names --- ...IsisBeanFactoryPostProcessorForSpring.java | 2 +- .../core/config/beans/IsisBeanMetaData.java | 53 ++++++++++++++++++- .../config/beans/IsisBeanTypeClassifier.java | 37 +------------ .../beans/IsisBeanTypeClassifierDefault.java | 43 +++++++-------- .../config/beans/IsisBeanTypeRegistry.java | 9 ++-- .../beans/IsisBeanTypeRegistryDefault.java | 42 +++++++++------ .../IsisComponentScanInterceptorImpl.java | 31 +++++------ .../HomePageFacetAnnotationFactory.java | 2 +- .../LogicalTypeMalformedValidator.java | 4 +- .../LogicalTypeFacetFromClassNameFactory.java | 2 +- ...MethodPrefixBasedFacetFactoryAbstract.java | 2 +- .../ObjectBookmarker_builtinHandlers.java | 2 +- .../load/ObjectLoader_builtinHandlers.java | 2 +- .../SynthesizeObjectNamingPostProcessor.java | 2 +- .../metamodel/progmodel/ProgrammingModel.java | 2 +- .../core/metamodel/services/ServiceUtil.java | 6 +-- .../metamodel/DomainMemberDefault.java | 2 +- .../services/metamodel/MetaModelExporter.java | 4 +- .../metamodel/spec/ObjectSpecification.java | 13 +---- .../metamodel/spec/feature/ObjectAction.java | 2 +- .../SpecificationLoaderDefault.java | 37 ++++++------- .../specimpl/ObjectSpecificationAbstract.java | 8 +-- .../dflt/ObjectSpecificationDefault.java | 44 ++++++--------- .../MetaModelServiceDefaultTest.java | 2 +- .../testspec/ObjectSpecificationStub.java | 12 ++--- .../factory/FactoryServiceDefault.java | 4 +- .../HomePageResolverServiceDefault.java | 2 +- .../IsisModulePersistenceJdoDatanucleus.java | 4 +- .../beans/JdoBeanTypeClassifier.java | 27 ++++++---- ...delVisitingValidatorForClauseAbstract.java | 2 +- .../DomainObjectReprRenderer.java | 4 +- .../domaintypes/DomainTypeReprRenderer.java | 2 +- .../TypeActionResultReprRenderer.java | 2 +- 33 files changed, 199 insertions(+), 213 deletions(-) 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..f0eef811500 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,9 @@ */ package org.apache.isis.core.config.beans; +import org.springframework.lang.Nullable; + +import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.services.metamodel.BeanSort; import lombok.NonNull; @@ -26,8 +29,54 @@ @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; } + } + private final @NonNull BeanSort beanSort; - private final @NonNull String beanName; + private final @Nullable LogicalType logicalType; // only nullable in phase 1 + 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 00b2c4254b3..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 @@ -49,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() @@ -74,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) @@ -87,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 ... @@ -95,7 +95,7 @@ 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 ... @@ -104,9 +104,8 @@ public BeanClassification classify( if(aDomainService.isPresent()) { val logicalType = LogicalType.infer(type); // overrides Spring naming strategy - return BeanClassification - .delegated(BeanSort.MANAGED_BEAN_CONTRIBUTING, - logicalType.getLogicalTypeName()); + return IsisBeanMetaData + .injectable(BeanSort.MANAGED_BEAN_CONTRIBUTING, logicalType); } // allow ServiceLoader plugins to have a say, eg. when classifying entity types @@ -118,44 +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) { - val logicalType = LogicalType.infer(type); - return BeanClassification.selfManaged( - BeanSort.ENTITY, logicalType.getLogicalTypeName()); + 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: - val logicalTypeName = LogicalType.infer(type).getLogicalTypeName(); - return BeanClassification.delegated( + val logicalType = LogicalType.infer(type); + return IsisBeanMetaData.injectable( BeanSort.MANAGED_BEAN_CONTRIBUTING, - 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..af236beaf77 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,27 +69,30 @@ public Can getAndDrainIntrospectableTypes() { // -- FILTER @Override - public void intercept(final ScannedTypeMetaData typeMeta) { + public void intercept(final ScannedTypeMetaData scanMeta) { - val classOrFailure = typeMeta.getUnderlyingClassOrFailure(); + val classOrFailure = scanMeta.getUnderlyingClassOrFailure(); if(classOrFailure.isFailure()) { log.warn(classOrFailure.getFailure()); return; } val type = classOrFailure.getUnderlyingClass(); - val classification = isisBeanTypeClassifier.classify(type); + val typeMeta = isisBeanTypeClassifier.classify(type); - val delegated = classification.isDelegateLifecycleManagement(); - typeMeta.setInjectable(delegated); - if(delegated) { - typeMeta.setBeanNameOverride(classification.getExplicitLogicalTypeName()); - } + val beanSort = typeMeta.getBeanSort(); - val beanSort = classification.getBeanSort(); + scanMeta.setInjectable(!typeMeta.getManagedBy().isIsis()); + if(typeMeta.getManagedBy().isIsis()) { + // otherwise we don't care + scanMeta.setBeanNameOverride(typeMeta.getLogicalType().getLogicalTypeName()); + } if(beanSort.isToBeIntrospected()) { - addIntrospectableType(beanSort, typeMeta); + val correspondingClass = scanMeta.getUnderlyingClassOrFailure().getUnderlyingClass(); + scanMeta.getEffectiveBeanName(); + + introspectableTypes.put(correspondingClass, typeMeta); if(log.isDebugEnabled()) { log.debug("to-be-introspected: {} [{}]", @@ -101,12 +103,5 @@ public void intercept(final ScannedTypeMetaData typeMeta) { } - // -- 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/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/logicaltype/LogicalTypeMalformedValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java index cea0dc5abe2..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,7 +45,7 @@ public void refineProgrammingModel(final ProgrammingModel programmingModel) { programmingModel.addVisitingValidator(spec->{ if(!spec.isEntityOrViewModel() - && !spec.isManagedBean() ) { + && !spec.isInjectable() ) { return; } @@ -59,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/LogicalTypeFacetFromClassNameFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java index 09514d3f5dd..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 @@ -131,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/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/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/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/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java index 109cccd6dd2..0487c629855 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 @@ -385,16 +385,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 +472,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/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java index 0b4dc8a6a86..6de0a67735b 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()) { @@ -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,8 +558,8 @@ private ObjectSpecification _loadSpecification( val substitutedType = substitute.apply(type); - final ObjectSpecification spec = cache.computeIfAbsent(substitutedType, __->{ - val newSpec = createSpecification(substitutedType, beanClassifier.apply(substitutedType)); + val spec = cache.computeIfAbsent(substitutedType, __->{ + val newSpec = createSpecification(beanClassifier.apply(substitutedType)); logicalTypeResolver.register(newSpec); return newSpec; }); @@ -591,18 +588,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/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java index 1bab00407ba..f63bb6abc6e 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 @@ -396,7 +396,7 @@ public String getTitle(final TitleRenderRequest titleRenderRequest) { return titleString; } } - val prefix = this.isManagedBean() + val prefix = this.isInjectable() ? "" : "Untitled "; return prefix + getSingularName(); @@ -683,14 +683,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); } } @@ -733,7 +733,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/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java index 2ffac650c31..5b1e5a0a261 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,14 +30,13 @@ import org.apache.isis.applib.Identifier; import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy; -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.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; @@ -91,30 +90,29 @@ public class ObjectSpecificationDefault @Getter(onMethod_ = {@Override}) private final IntrospectionPolicy introspectionPolicy; - /** - * available only for managed-beans - */ - private final String nameIfIsManagedBean; +// /** +// * 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, - LogicalType.infer(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 = @@ -128,13 +126,10 @@ public ObjectSpecificationDefault( this.facetedMethodsBuilder = new FacetedMethodsBuilder(this, facetProcessor, classSubstitutorRegistry); - } - private static String determineShortName(final Class introspectedClass) { - final String name = introspectedClass.getName(); - return name.substring(name.lastIndexOf('.') + 1); - } + @Getter(onMethod_ = {@Override}) + private final boolean injectable; @Override protected void introspectTypeHierarchy() { @@ -256,13 +251,6 @@ private ObjectAction createAction(final FacetedMethod facetedMethod) { } } - // -- PREDICATES - - @Override - public String getManagedBeanName() { - return nameIfIsManagedBean; - } - // -- getObjectAction @Override @@ -401,6 +389,4 @@ public Optional valueFacet() { : lookupFacet(ValueFacet.class); } - // -- - } 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 49b3ea5b9ac..584c44cc135 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 @@ -88,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; @@ -322,12 +328,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/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/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 8da281bcf93..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 @@ -18,12 +18,15 @@ */ package org.apache.isis.persistence.jdo.metamodel.beans; +import java.util.Locale; + import javax.jdo.annotations.EmbeddedOnly; 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; @@ -35,8 +38,7 @@ 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); @@ -51,27 +53,30 @@ public BeanClassification classify( return null; // don't categorize as entity ... fall through in the caller's logic } - String logicalTypeName = LogicalType.infer(type).getLogicalTypeName(); + var logicalType = LogicalType.infer(type); // don't trample over the @Named(=...) if present - if(logicalTypeName.equals(type.getName())) { + if(logicalType.getLogicalTypeName().equals(type.getName())) { val schema = persistenceCapableAnnot.get().schema(); if(_Strings.isNotEmpty(schema)) { val table = persistenceCapableAnnot.get().table(); - //FIXME - this custom name is never honored -// logicalTypeName = String.format("%s.%s", schema.toLowerCase(Locale.ROOT), -// _Strings.isNotEmpty(table) -// ? table -// : type.getSimpleName()); + val logicalTypeName = String.format("%s.%s", + schema.toLowerCase(Locale.ROOT), + _Strings.isNotEmpty(table) + ? table + : type.getSimpleName()); + + logicalType = LogicalType.eager(type, logicalTypeName); + } } - return BeanClassification.selfManaged(BeanSort.ENTITY, logicalTypeName); + 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/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/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 From 425eb37810d17f81a4787349d5dc2807ea5f9000 Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Tue, 24 May 2022 17:48:35 +0200 Subject: [PATCH 06/43] ISIS-3063: just cleaning up prev. commit --- .../core/config/beans/IsisComponentScanInterceptorImpl.java | 1 - .../specloader/specimpl/dflt/ObjectSpecificationDefault.java | 5 ----- 2 files changed, 6 deletions(-) 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 af236beaf77..59540ff80d0 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 @@ -90,7 +90,6 @@ public void intercept(final ScannedTypeMetaData scanMeta) { if(beanSort.isToBeIntrospected()) { val correspondingClass = scanMeta.getUnderlyingClassOrFailure().getUnderlyingClass(); - scanMeta.getEffectiveBeanName(); introspectableTypes.put(correspondingClass, typeMeta); 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 5b1e5a0a261..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 @@ -90,11 +90,6 @@ public class ObjectSpecificationDefault @Getter(onMethod_ = {@Override}) private final IntrospectionPolicy introspectionPolicy; -// /** -// * available only for managed-beans -// */ -// private final String nameIfIsManagedBean; - public ObjectSpecificationDefault( final IsisBeanMetaData typeMeta, final MetaModelContext mmc, From ee05c59b1f4aaa2a1aab137cf1c3a2e0b61f32fc Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Tue, 24 May 2022 19:31:40 +0200 Subject: [PATCH 07/43] ISIS-3063: more cleanup --- .../src/main/java/org/apache/isis/applib/id/LogicalType.java | 2 ++ .../org/apache/isis/core/config/beans/IsisBeanMetaData.java | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) 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 e5a52fe773a..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 @@ -113,6 +113,8 @@ public static LogicalType fqcn( /** * Infer from annotations. + * @apiNote Does only simple inference, not involving classifier plugins. + * Use with caution! */ @SuppressWarnings("removal") public static LogicalType infer( 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 f0eef811500..d249647ce98 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,8 +18,6 @@ */ package org.apache.isis.core.config.beans; -import org.springframework.lang.Nullable; - import org.apache.isis.applib.id.LogicalType; import org.apache.isis.applib.services.metamodel.BeanSort; @@ -39,7 +37,7 @@ public enum ManagedBy { } private final @NonNull BeanSort beanSort; - private final @Nullable LogicalType logicalType; // only nullable in phase 1 + private final @NonNull LogicalType logicalType; private @NonNull ManagedBy managedBy; public Class getCorrespondingClass() { From ee969d7b7a4f5a21048a7c05e380371f1df0f231 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 May 2022 03:05:14 +0000 Subject: [PATCH 08/43] Bump error_prone_annotations from 2.13.1 to 2.14.0 Bumps [error_prone_annotations](https://github.com/google/error-prone) from 2.13.1 to 2.14.0. - [Release notes](https://github.com/google/error-prone/releases) - [Commits](https://github.com/google/error-prone/compare/v2.13.1...v2.14.0) --- updated-dependencies: - dependency-name: com.google.errorprone:error_prone_annotations dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bom/pom.xml b/bom/pom.xml index 53847ad9bb4..769c833ebd1 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -375,7 +375,7 @@ under the License. 11.3.2 4.3 - 2.13.1 + 2.14.0 4.9.10 31.1-jre From 19163f5f6a71ded3987f6213fada964b4ac6a0e8 Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Wed, 25 May 2022 06:01:15 +0200 Subject: [PATCH 09/43] ISIS-3063: don't use anonymous facet classes in OneToManyAssociationMixedIn - use concrete facet classes instead - also turns on the MetaModelRegressionTest --- .../actcoll/typeof/TypeOfFacetAbstract.java | 2 +- .../typeof/TypeOfFacetFromActionReturn.java | 30 ++++++++++++++++++ .../SnapshotExcludeFacetAbstract.java | 4 ++- .../update/PropertySetterFacetFactory.java | 4 +-- ...pshotExcludeFacetFromImmutableMember.java} | 5 +-- .../specimpl/OneToManyAssociationMixedIn.java | 8 ++--- .../domainmodel/MetaModelRegressionTest.java | 8 +++-- .../src/test/resources/metamodel.xml.zip | Bin 90534 -> 88056 bytes 8 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java rename core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/{SnapshotExcludeFacetInferred.java => SnapshotExcludeFacetFromImmutableMember.java} (86%) 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/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java new file mode 100644 index 00000000000..7b414cbb51f --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java @@ -0,0 +1,30 @@ +/* + * 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.actcoll.typeof; + +import org.apache.isis.core.metamodel.facetapi.FacetHolder; + +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/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/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/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 89b24cb824e9d579d187e3b9641abb1073817fb5..085038772c6f3740b44e49acd5ef0ff893a1a7e7 100644 GIT binary patch literal 88056 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

h+sfL0ak=bW1_hPwKq-agu;8?@ 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 UBS3xu8u%vwTnmB!5(?^n0c%N8T>t<8 literal 90534 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�tYe1yBQ3a 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 Date: Wed, 25 May 2022 06:42:48 +0200 Subject: [PATCH 10/43] ISIS-3063: more cleaning up around scan interception --- .../core/config/beans/IsisBeanMetaData.java | 7 +++++ .../IsisComponentScanInterceptorImpl.java | 18 +++++------- .../config/beans/ScannedTypeMetaData.java | 29 +++++-------------- 3 files changed, 22 insertions(+), 32 deletions(-) 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 d249647ce98..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 @@ -34,6 +34,13 @@ public enum ManagedBy { 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; 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 59540ff80d0..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 @@ -71,31 +71,27 @@ public Can getAndDrainIntrospectableTypes() { @Override public void intercept(final ScannedTypeMetaData scanMeta) { - val classOrFailure = scanMeta.getUnderlyingClassOrFailure(); + val classOrFailure = scanMeta.getUnderlyingClass(); if(classOrFailure.isFailure()) { log.warn(classOrFailure.getFailure()); return; } - val type = classOrFailure.getUnderlyingClass(); - val typeMeta = isisBeanTypeClassifier.classify(type); + val correspondingClass = classOrFailure.getValue().get(); + val typeMeta = isisBeanTypeClassifier.classify(correspondingClass); - val beanSort = typeMeta.getBeanSort(); - - scanMeta.setInjectable(!typeMeta.getManagedBy().isIsis()); + scanMeta.setInjectable(typeMeta.getManagedBy().isInjectable()); if(typeMeta.getManagedBy().isIsis()) { - // otherwise we don't care + // otherwise we don't interfere with naming strategies scanMeta.setBeanNameOverride(typeMeta.getLogicalType().getLogicalTypeName()); } + val beanSort = typeMeta.getBeanSort(); if(beanSort.isToBeIntrospected()) { - val correspondingClass = scanMeta.getUnderlyingClassOrFailure().getUnderlyingClass(); - introspectableTypes.put(correspondingClass, typeMeta); - if(log.isDebugEnabled()) { log.debug("to-be-introspected: {} [{}]", - type, + correspondingClass, beanSort.name()); } } 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); + }); } From d3f3ca421d65e68c485a54c205cfd3dc68bedfec Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Mon, 23 May 2022 18:50:40 +0100 Subject: [PATCH 11/43] ISIS-3062: adds in JDO impl of SessionLogEntry etc --- ...ingService.java => SessionLogService.java} | 2 +- .../session/SessionLoggingServiceLogging.java | 2 +- extensions/pom.xml | 7 + .../adoc/antora.yml | 0 .../adoc/modules/audit-trail/nav.adoc | 0 .../adoc/modules/audit-trail/pages/about.adoc | 0 .../audit-trail/partials/module-nav.adoc | 0 .../src/main/java/META-INF/persistence.xml | 23 + .../isisaddons/module/audit/AuditModule.java | 30 ++ .../module/audit/dom/AuditEntry.java | 395 +++++++++++++++ .../audit/dom/AuditEntry.layout.fallback.xml | 60 +++ .../module/audit/dom/AuditEntry.png | Bin 0 -> 477 bytes .../audit/dom/AuditerServiceUsingJdo.java | 56 +++ .../module/audit/dom/AuditingServiceMenu.java | 84 ++++ .../audit/dom/AuditingServiceRepository.java | 163 ++++++ ...ansactionId_auditEntriesInTransaction.java | 51 ++ .../audit/dom/Object_recentAuditEntries.java | 96 ++++ ...EnumContractForIncodeModuleTest_title.java | 16 + ...ContractForIncodeModuleTest_compareTo.java | 18 + ...oduleTest_hasJdoUniqueIndexAnnotation.java | 13 + ...ContractForIncodeModuleTest_compareTo.java | 18 + ...oduleTest_hasJdoUniqueIndexAnnotation.java | 13 + ...ContractForIncodeModuleTest_compareTo.java | 19 + ...oduleTest_hasJdoUniqueIndexAnnotation.java | 13 + ...ContractForIncodeModuleTest_compareTo.java | 18 + ...oduleTest_hasJdoUniqueIndexAnnotation.java | 13 + ...ContractForIncodeModuleTest_compareTo.java | 18 + ...oduleTest_hasJdoUniqueIndexAnnotation.java | 13 + extensions/security/audittrail/pom.xml | 173 +++++++ .../applib/IsisModuleExtSecmanApplib.java | 1 + .../permission/dom/ApplicationPermission.java | 2 + .../applib/role/dom/ApplicationRole.java | 2 + .../tenancy/dom/ApplicationTenancy.java | 2 + .../applib/user/dom/ApplicationUser.java | 3 + .../permission/dom/ApplicationPermission.java | 4 +- .../secman/jdo/role/dom/ApplicationRole.java | 5 +- .../jdo/tenancy/dom/ApplicationTenancy.java | 4 +- .../secman/jdo/user/dom/ApplicationUser.java | 5 +- .../adoc/antora.yml | 0 .../adoc/modules/session-log/nav.adoc | 0 .../adoc/modules/session-log/pages/about.adoc | 0 .../session-log/partials/module-nav.adoc | 0 extensions/security/sessionlog/applib/pom.xml | 57 +++ .../applib/IsisModuleExtSessionLogApplib.java | 25 + .../sessionlog/persistence-jdo/pom.xml | 62 +++ .../src/main/java/META-INF/persistence.xml | 23 + ...IsisModuleExtSessionLogPersistenceJdo.java | 29 ++ .../sessionlog/jdo/app/SessionLogMenu.java | 82 +++ .../HasUsername_recentSessionsForUser.java | 50 ++ .../jdo/dom/SessionLogEntry-expired.png | Bin 0 -> 630 bytes .../jdo/dom/SessionLogEntry-login.png | Bin 0 -> 468 bytes .../jdo/dom/SessionLogEntry-logout.png | Bin 0 -> 457 bytes .../sessionlog/jdo/dom/SessionLogEntry.java | 467 ++++++++++++++++++ .../dom/SessionLogEntry.layout.fallback.xml | 58 +++ .../jdo/dom/SessionLogEntryRepository.java | 163 ++++++ .../spiimpl/SessionLoggingServiceDefault.java | 55 +++ extensions/security/sessionlog/pom.xml | 87 ++++ .../AuthenticatedWebSessionForIsis.java | 18 +- ...ticatedWebSessionForIsis_Authenticate.java | 4 +- ...AuthenticatedWebSessionForIsis_SignIn.java | 4 +- ...ticatedWebSessionForIsis_TestAbstract.java | 4 +- 61 files changed, 2504 insertions(+), 26 deletions(-) rename api/applib/src/main/java/org/apache/isis/applib/services/session/{SessionLoggingService.java => SessionLogService.java} (97%) rename extensions/security/{audit-trail => audittrail}/adoc/antora.yml (100%) rename extensions/security/{audit-trail => audittrail}/adoc/modules/audit-trail/nav.adoc (100%) rename extensions/security/{audit-trail => audittrail}/adoc/modules/audit-trail/pages/about.adoc (100%) rename extensions/security/{audit-trail => audittrail}/adoc/modules/audit-trail/partials/module-nav.adoc (100%) create mode 100644 extensions/security/audittrail/impl/src/main/java/META-INF/persistence.xml create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/AuditModule.java create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.java create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.layout.fallback.xml create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditEntry.png create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditerServiceUsingJdo.java create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditingServiceMenu.java create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/AuditingServiceRepository.java create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/HasTransactionId_auditEntriesInTransaction.java create mode 100644 extensions/security/audittrail/impl/src/main/java/org/isisaddons/module/audit/dom/Object_recentAuditEntries.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/titled/TitledEnumContractForIncodeModuleTest_title.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithCodeComparableContractForIncodeModuleTest_compareTo.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithCodeUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithDescriptionComparableContractForIncodeModuleTest_compareTo.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithDescriptionUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithNameComparableContractForIncodeModuleTest_compareTo.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithNameUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithReferenceComparableContractForIncodeModuleTest_compareTo.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithReferenceUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithTitleComparableContractForIncodeModuleTest_compareTo.java create mode 100644 extensions/security/audittrail/impl/src/test/java/org/isisaddons/module/audit/dom/contracttests/with/WithTitleUniqueContractForIncodeModuleTest_hasJdoUniqueIndexAnnotation.java create mode 100644 extensions/security/audittrail/pom.xml rename extensions/security/{session-log => sessionlog}/adoc/antora.yml (100%) rename extensions/security/{session-log => sessionlog}/adoc/modules/session-log/nav.adoc (100%) rename extensions/security/{session-log => sessionlog}/adoc/modules/session-log/pages/about.adoc (100%) rename extensions/security/{session-log => sessionlog}/adoc/modules/session-log/partials/module-nav.adoc (100%) create mode 100644 extensions/security/sessionlog/applib/pom.xml create mode 100644 extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/IsisModuleExtSessionLogApplib.java create mode 100644 extensions/security/sessionlog/persistence-jdo/pom.xml create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/META-INF/persistence.xml create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/IsisModuleExtSessionLogPersistenceJdo.java create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/app/SessionLogMenu.java create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/contributions/HasUsername_recentSessionsForUser.java create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-expired.png create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-login.png create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-logout.png create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.java create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.layout.fallback.xml create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntryRepository.java create mode 100644 extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/spiimpl/SessionLoggingServiceDefault.java create mode 100644 extensions/security/sessionlog/pom.xml 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 97% 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..a450716b527 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 @@ -30,7 +30,7 @@ * * @since 1.x {@index} */ -public interface SessionLoggingService { +public interface SessionLogService { enum Type { LOGIN, 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/SessionLoggingServiceLogging.java index eef5a1a98c9..cbfa504eb88 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/SessionLoggingServiceLogging.java @@ -38,7 +38,7 @@ @Priority(PriorityPrecedence.LATE) @Qualifier("logging") @Log4j2 -public class SessionLoggingServiceLogging implements SessionLoggingService { +public class SessionLoggingServiceLogging implements SessionLogService { @Override public void log( diff --git a/extensions/pom.xml b/extensions/pom.xml index a20fd6a0dc1..1ff523d8152 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -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 @@ -265,6 +271,7 @@ security/secman security/shiro-realm-ldap security/spring-oauth2 + security/sessionlog vro/cors 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 100% 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 diff --git a/extensions/security/audit-trail/adoc/modules/audit-trail/partials/module-nav.adoc b/extensions/security/audittrail/adoc/modules/audit-trail/partials/module-nav.adoc similarity index 100% rename from extensions/security/audit-trail/adoc/modules/audit-trail/partials/module-nav.adoc rename to extensions/security/audittrail/adoc/modules/audit-trail/partials/module-nav.adoc 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 0000000000000000000000000000000000000000..4e4352c47420579d197a0125f055248bdc95da95 GIT binary patch literal 477 zcmV<30V4j1P)M0Ek4P|DaCa|=$UL*wlmU1g8sZiH1yEfx`j#@MQ)nSx&A4 z{xcwDl?GtxB|t8Q6~9;Az4C_1L%PJAP2||RCNq$3XHah=+P*BL>G%492_`IO-)^(T{ZM( z`4pg>EY&Rq8mtbqU?nLX6QG`BK)Masv*Mx1a!}6(XwWwbx@MJ>_JoA+`1&p|E!Y9+ zc06k4P$LR*fCjw<;s>DaIS}_lo7-G4HNd#n2Kg44_ZLCC=dXeEZeWqD3X%r^L&gM4 Twexya00000NkvXXu0mjf{t~_` literal 0 HcmV?d00001 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/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..09a71f96919 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,7 @@ public class IsisModuleExtSecmanApplib { public static final String NAMESPACE = "isis.ext.secman"; + public static final String SCHEMA = "isisExtensionsSecman"; 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/permission/dom/ApplicationPermission.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermission.java index 8de46ae7648..98c3dd27363 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 @@ -86,6 +86,8 @@ 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"; 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 863b9d63471..3068acd19cc 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 @@ -56,6 +56,8 @@ 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"; 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 1edb4b9ea07..b81f3fa9ccb 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 @@ -51,6 +51,8 @@ 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"; public static final String NAMED_QUERY_FIND_BY_NAME = "ApplicationTenancy.findByName"; public static final String NAMED_QUERY_FIND_BY_PATH = "ApplicationTenancy.findByPath"; 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 719a9d9a250..a1d51276d4e 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 @@ -74,6 +74,9 @@ 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"; + @Inject private transient ApplicationUserRepository applicationUserRepository; @Inject private transient ApplicationPermissionRepository applicationPermissionRepository; 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 14cf324900c..c7d7660518d 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 @@ -45,8 +45,8 @@ @PersistenceCapable( identityType = IdentityType.DATASTORE, - schema = "isisExtensionsSecman", - table = "ApplicationPermission") + schema = ApplicationPermission.SCHEMA, + table = ApplicationPermission.TABLE) @Inheritance( strategy = InheritanceStrategy.NEW_TABLE) @DatastoreIdentity( 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 927a4bf2442..00d14166869 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 @@ -45,8 +45,8 @@ @PersistenceCapable( identityType = IdentityType.DATASTORE, - schema = "isisExtensionsSecman", - table = "ApplicationRole") + schema = ApplicationRole.SCHEMA, + table = ApplicationRole.TABLE) @Inheritance( strategy = InheritanceStrategy.NEW_TABLE) @DatastoreIdentity( @@ -82,7 +82,6 @@ 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) 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 1ea033736ea..c1ee8cfe88e 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 @@ -46,8 +46,8 @@ @PersistenceCapable( identityType = IdentityType.APPLICATION, - schema = "isisExtensionsSecman", - table = "ApplicationTenancy") + schema = ApplicationTenancy.SCHEMA, + table = ApplicationTenancy.TABLE) @Inheritance( strategy = InheritanceStrategy.NEW_TABLE) @DatastoreIdentity( 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 a8ead18fcee..2c6d7a77658 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 @@ -52,8 +52,8 @@ @PersistenceCapable( identityType = IdentityType.DATASTORE, - schema = "isisExtensionsSecman", - table = "ApplicationUser") + schema = ApplicationUser.SCHEMA, + table = ApplicationUser.TABLE) @Inheritance( strategy = InheritanceStrategy.NEW_TABLE) @DatastoreIdentity( @@ -105,6 +105,7 @@ 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) 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/session-log/adoc/modules/session-log/partials/module-nav.adoc b/extensions/security/sessionlog/adoc/modules/session-log/partials/module-nav.adoc similarity index 100% rename from extensions/security/session-log/adoc/modules/session-log/partials/module-nav.adoc rename to extensions/security/sessionlog/adoc/modules/session-log/partials/module-nav.adoc diff --git a/extensions/security/sessionlog/applib/pom.xml b/extensions/security/sessionlog/applib/pom.xml new file mode 100644 index 00000000000..22fc7ee9984 --- /dev/null +++ b/extensions/security/sessionlog/applib/pom.xml @@ -0,0 +1,57 @@ + + + + 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.persistence + isis-persistence-jdo-datanucleus + + + + org.apache.isis.core + isis-core-runtime + provided + + + + org.apache.isis.testing + isis-testing-fixtures-applib + + + + 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..241074c03f3 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/IsisModuleExtSessionLogApplib.java @@ -0,0 +1,25 @@ +package org.apache.isis.sessionlog.applib; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + + +@Configuration +@Import({ + +}) +public class IsisModuleExtSessionLogApplib { + + public static final String NAMESPACE = "isis.ext.sessionlog"; + public static final String SCHEMA = "isisExtSessionLog"; + + 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/persistence-jdo/pom.xml b/extensions/security/sessionlog/persistence-jdo/pom.xml new file mode 100644 index 00000000000..28ebe5d1148 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/pom.xml @@ -0,0 +1,62 @@ + + + + 4.0.0 + + + org.apache.isis.extensions + isis-extensions-sessionlog + 2.0.0-SNAPSHOT + ../pom.xml + + + sis-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.core + isis-core-runtime + provided + + + + org.apache.isis.testing + isis-testing-fixtures-applib + + + + 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..cf973698145 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/IsisModuleExtSessionLogPersistenceJdo.java @@ -0,0 +1,29 @@ +package org.apache.isis.sessionlog.jdo; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import org.apache.isis.sessionlog.applib.IsisModuleExtSessionLogApplib; +import org.apache.isis.sessionlog.jdo.dom.SessionLogEntry; +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({ + IsisModuleExtSessionLogApplib.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/app/SessionLogMenu.java b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/app/SessionLogMenu.java new file mode 100644 index 00000000000..9e5aeb37092 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/app/SessionLogMenu.java @@ -0,0 +1,82 @@ +package org.apache.isis.sessionlog.jdo.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.jdo.dom.SessionLogEntry; +import org.apache.isis.sessionlog.jdo.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 = findSessions.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.findByUserAndFromAndTo(user, from, to); + } + } + } + + + @Inject SessionLogEntryRepository sessionLogEntryRepository; + +} diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/contributions/HasUsername_recentSessionsForUser.java b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/contributions/HasUsername_recentSessionsForUser.java new file mode 100644 index 00000000000..f232b37033a --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/contributions/HasUsername_recentSessionsForUser.java @@ -0,0 +1,50 @@ +package org.apache.isis.sessionlog.jdo.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.jdo.IsisModuleExtSessionLogPersistenceJdo; +import org.apache.isis.sessionlog.jdo.dom.SessionLogEntry; +import org.apache.isis.sessionlog.jdo.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.findRecentByUser(hasUsername.getUsername()); + } + @MemberSupport public boolean hideAct() { + return hasUsername == null || hasUsername.getUsername() == null; + } + + @Inject SessionLogEntryRepository sessionLogEntryRepository; + +} diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-expired.png b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-expired.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2baed241b121c81caab98925e0db68d5de2348 GIT binary patch literal 630 zcmV-+0*U>JP)2ib6o1?Xhw zXV{JNk*xQMwIg{xm$ei04&=A@5?BDz7*l^P|8?ZRyadCi!D;kE)HEydBx}4b0G&-F z)SSq)lmO79FW7?~KrYc4&<;|ytO2+jTBRHS-8?O1fYP8t#-fk`eeD8j0U*6^%Brq4 zu=EZMOMkdQT1tR#%78PX?Sdnw?w$|zL(t`rG(s5p|@Vxj{r0Qgb0@@ll>LDT`7Y#Xw+$hSNgIX~-_z)PqUCvhBcH zf$_eKNGZnnMJBT1 zsFr;})c|bj?CUo^uK~t?e9ngXQPiAE!yK8p6mkYT`Cj0W{ z>p!!zU!#pObrPS5$3N(K#d9fMi|>QMs9=fGq1SVz-f;kt1F$QFCv*C!5#)W)nVf8j z-^ANE%mG00(juaWK_7G^CwJy(qH&o6&`Ee$tKB+&w@r7{UmO8xs(-%HYA5s|i!SV*tnj0FWATSHJ@xfH>EOcb_N%Aj7>vI%CP; z@ARx6tZ5I3EP#0Httn~HUFw7V9WW)z0*D1I0I;C~RH6i8PyhjVX@&f60PiXR88%G; z-Tl%!`LcTzbJR9BA+bBlAcq5xI|<>!?0&TjJ;?(w+!2EQtvI9Rwd&}1{qdhp{o1)#FpNp<%WtO2aN0z*AaSY0>P9mR)9 zd_S1W0PcfGY)j0!!I*uTAzSI=G-OLJP`1<=&{7c|x>uImr~L=N!Po%)m53&HLc*|C(K!A@ma~P2>t{b2Ec*z= :from " + + "&& logoutTimestamp <= :to " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_AFTER, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE user == :user " + + "&& loginTimestamp >= :from " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BEFORE, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE user == :user " + + "&& loginTimestamp <= :from " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND_BY_USER, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE user == :user " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BETWEEN, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE loginTimestamp >= :from " + + "&& logoutTimestamp <= :to " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND_BY_TIMESTAMP_AFTER, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE loginTimestamp >= :from " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BEFORE, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE loginTimestamp <= :to " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_BEFORE, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE user == :user " + + "&& loginTimestamp < :from " + + "ORDER BY loginTimestamp DESC"), + @Query( + name= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE user == :user " + + "&& loginTimestamp > :from " + + "ORDER BY loginTimestamp ASC"), + @Query( + name= SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE logoutTimestamp == null " + + "ORDER BY loginTimestamp ASC"), + @Query( + name= SessionLogEntry.Nq.FIND_RECENT_BY_USER, + value="SELECT " + + "FROM " + SessionLogEntry.FQCN + " " + + "WHERE user == :user " + + "ORDER BY loginTimestamp DESC " + + "RANGE 0,10") +}) +@DomainObject( + logicalTypeName = SessionLogEntry.LOGICAL_TYPE_NAME, + editing = Editing.DISABLED +) +public class SessionLogEntry implements HasUsername, Comparable { + + public static final String LOGICAL_TYPE_NAME = IsisModuleExtSessionLogApplib.NAMESPACE + ".SessionLogEntry"; + public static final String FQCN = "org.apache.isis.sessionlog.jdo.dom.SessionLogEntry"; + public static final String SCHEMA = IsisModuleExtSessionLogApplib.SCHEMA; + public static final String TABLE = "SessionLogEntry"; + + @UtilityClass + static class Nq { + static final String FIND_BY_SESSION_ID = "findBySessionId"; + static final String FIND_BY_USER_AND_TIMESTAMP_BETWEEN = "findByUserAndTimestampBetween"; + static final String FIND_BY_USER_AND_TIMESTAMP_AFTER = "findByUserAndTimestampAfter"; + static final String FIND_BY_USER_AND_TIMESTAMP_BEFORE = "findByUserAndTimestampBefore"; + static final String FIND_BY_USER = "findByUser"; + static final String FIND_BY_TIMESTAMP_BETWEEN = "findByTimestampBetween"; + static final String FIND_BY_TIMESTAMP_AFTER = "findByTimestampAfter"; + static final String FIND_BY_TIMESTAMP_BEFORE = "findByTimestampBefore"; + static final String FIND = "find"; + static final String FIND_BY_USER_AND_TIMESTAMP_STRICTLY_BEFORE = "findByUserAndTimestampStrictlyBefore"; + static final String FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER = "findByUserAndTimestampStrictlyAfter"; + static final String FIND_ACTIVE_SESSIONS = "findActiveSessions"; + static final String FIND_RECENT_BY_USER = "findRecentByUser"; + } + + public static abstract class PropertyDomainEvent extends IsisModuleExtSessionLogApplib.PropertyDomainEvent { } + + public static abstract class CollectionDomainEvent extends IsisModuleExtSessionLogApplib.CollectionDomainEvent { } + + public static abstract class ActionDomainEvent extends IsisModuleExtSessionLogApplib.ActionDomainEvent { } + + public SessionLogEntry( + final String sessionId, + final String username, + final SessionLogService.CausedBy causedBy, + final Timestamp loginTimestamp) { + this.sessionId = sessionId; + this.username = username; + this.causedBy = causedBy; + this.loginTimestamp = 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( + domainEvent = SessionId.DomainEvent.class, + editing = Editing.DISABLED, + maxLength = SessionId.MAX_LENGTH + ) + @PropertyLayout( + fieldSetId="identity", + hidden = Where.PARENTED_TABLES, + sequence = "1" + ) + @Parameter( + maxLength = SessionId.MAX_LENGTH + ) + @ParameterLayout( + named = "Session Id" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface SessionId { + int MAX_LENGTH = 15; + + class DomainEvent extends PropertyDomainEvent {} + } + + @PrimaryKey + @Column(allowsNull="false", length=15) + private String sessionId; + + @SessionId + public String getSessionId() { + return sessionId; + } + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + + + + + @Property( + domainEvent = Username.DomainEvent.class, + editing = Editing.DISABLED, + maxLength = Username.MAX_LENGTH + ) + @PropertyLayout( + fieldSetId="Identity", + hidden = Where.PARENTED_TABLES, + sequence = "2" + ) + @Parameter( + maxLength = Username.MAX_LENGTH + ) + @ParameterLayout( + named = "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 {} + } + + @Column(allowsNull = "false", length = Username.MAX_LENGTH) + private String username; + + @Username + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + + + + @Property( + domainEvent = LoginTimestamp.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + fieldSetId="Identity", + hidden = Where.PARENTED_TABLES, + sequence = "3" + ) + @ParameterLayout( + named = "Login timestamp" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface LoginTimestamp { + class DomainEvent extends PropertyDomainEvent {} + } + + @Column(allowsNull="false") + private Timestamp loginTimestamp; + + @LoginTimestamp + public Timestamp getLoginTimestamp() { + return loginTimestamp; + } + + public void setLoginTimestamp(Timestamp loginTimestamp) { + this.loginTimestamp = loginTimestamp; + } + + + + @Property( + domainEvent = LogoutTimestamp.DomainEvent.class, + editing = Editing.DISABLED, + optionality = Optionality.OPTIONAL + ) + @PropertyLayout( + fieldSetId="Identity", + hidden = Where.PARENTED_TABLES, + sequence = "3" + ) + @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 {} + } + + + @Column(allowsNull="true") + private Timestamp logoutTimestamp; + + @LogoutTimestamp + public Timestamp getLogoutTimestamp() { + return logoutTimestamp; + } + + public void setLogoutTimestamp(Timestamp logoutTimestamp) { + this.logoutTimestamp = logoutTimestamp; + } + + + + + + @Property( + domainEvent = CausedBy.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + fieldSetId="Details", + sequence = "1" + ) + @ParameterLayout( + named = "Caused by" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface CausedBy { + class DomainEvent extends PropertyDomainEvent {} + + } + + @Column(allowsNull = "false") + private SessionLogService.CausedBy causedBy; + + @CausedBy + public SessionLogService.CausedBy getCausedBy() { + return causedBy; + } + + public void setCausedBy(SessionLogService.CausedBy causedBy) { + this.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.findByUserAndStrictlyAfter(getUsername(), getLoginTimestamp()); + return !after.isEmpty() ? after.get(0) : SessionLogEntry.this; + } + + @MemberSupport public String disableNext() { + val next = factoryService.mixin(next.class, SessionLogEntry.this); + return next.act() == SessionLogEntry.this ? "None after": null; + } + + @Inject FactoryService factoryService; + } + + + + @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.findByUserAndStrictlyBefore(getUsername(), getLoginTimestamp()); + return !before.isEmpty() ? before.get(0) : SessionLogEntry.this; + } + + @MemberSupport public String disablePrevious() { + val previous = factoryService.mixin(previous.class, SessionLogEntry.this); + return previous.act() == SessionLogEntry.this ? "None before": null; + } + + @Inject FactoryService factoryService; + } + + + + private static final ObjectContracts.ObjectContract contract = + ObjectContracts.contract(SessionLogEntry.class) + .thenUse("loginTimestamp", SessionLogEntry::getLoginTimestamp) + .thenUse("username", SessionLogEntry::getUsername) + .thenUse("sessionId", SessionLogEntry::getSessionId) + .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); + } + + + @Inject SessionLogEntryRepository sessionLogEntryRepository; + +} diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.layout.fallback.xml b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.layout.fallback.xml new file mode 100644 index 00000000000..92cbd65e726 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.layout.fallback.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..6b5078507c5 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntryRepository.java @@ -0,0 +1,163 @@ +package org.apache.isis.sessionlog.jdo.dom; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Optional; + +import javax.inject.Inject; + +import org.joda.time.LocalDate; +import org.springframework.stereotype.Service; + +import org.apache.isis.applib.query.Query; +import org.apache.isis.applib.services.repository.RepositoryService; +import org.apache.isis.applib.services.session.SessionLogService; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +/** + * Provides supporting functionality for querying {@link SessionLogEntry session log entry} entities. + */ +@Service +@RequiredArgsConstructor(onConstructor_ = {@Inject}) +public class SessionLogEntryRepository { + + final RepositoryService repositoryService; + + public void logoutAllSessions(final Timestamp logoutTimestamp) { + + val allSessions = repositoryService.allMatches( + Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS)); + for (val activeEntry : allSessions) { + activeEntry.setCausedBy(SessionLogService.CausedBy.RESTART); + activeEntry.setLogoutTimestamp(logoutTimestamp); + } + } + + public SessionLogEntry create( + final String username, + final String sessionId, + final SessionLogService.CausedBy causedBy, + final Timestamp timestamp) { + return repositoryService.persistAndFlush(new SessionLogEntry(sessionId, username, causedBy, timestamp)); + } + + public Optional findBySessionId(final String sessionId) { + return repositoryService.firstMatch( + Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_SESSION_ID) + .withParameter("sessionId", sessionId)); + } + + + public List findByUser(final String username) { + return repositoryService.allMatches( + Query.named(SessionLogEntry.class, "findByUsername") + .withParameter("username", username)); + } + + + public List findByUserAndFromAndTo( + final String user, + 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(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BETWEEN) + .withParameter("user", user) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_AFTER) + .withParameter("user", user) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BEFORE) + .withParameter("user", user) + .withParameter("to", toTs); + } else { + query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER) + .withParameter("user", user); + } + } + 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(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BETWEEN) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_AFTER) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BEFORE) + .withParameter("to", toTs); + } else { + query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND); + } + } + return repositoryService.allMatches(query); + } + + + public List findByUserAndStrictlyBefore( + final String user, + final Timestamp from) { + + return repositoryService.allMatches( + Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_BEFORE) + .withParameter("user", user) + .withParameter("from", from)); + } + + + public List findByUserAndStrictlyAfter( + final String user, + final Timestamp from) { + return repositoryService.allMatches( + Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER) + .withParameter("user", user) + .withParameter("from", from)); + } + + + + public List findActiveSessions() { + return repositoryService.allMatches( + Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS)); + } + + + + public List findRecentByUser(final String user) { + return repositoryService.allMatches( + Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_RECENT_BY_USER) + .withParameter("user", user)); + + } + + 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/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/spiimpl/SessionLoggingServiceDefault.java b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/spiimpl/SessionLoggingServiceDefault.java new file mode 100644 index 00000000000..59fa08dfce5 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/spiimpl/SessionLoggingServiceDefault.java @@ -0,0 +1,55 @@ +package org.apache.isis.sessionlog.jdo.spiimpl; + +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.clock.ClockService; +import org.apache.isis.applib.services.session.SessionLogService; +import org.apache.isis.sessionlog.jdo.dom.SessionLogEntry; +import org.apache.isis.sessionlog.jdo.dom.SessionLogEntryRepository; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import java.sql.Timestamp; +import java.util.Date; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +/** + * 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}) +public class SessionLoggingServiceDefault implements SessionLogService { + + final SessionLogEntryRepository sessionLogEntryRepository; + final ClockService clockService; + + @PostConstruct + public void init() { + val timestamp = clockService.getClock().nowAsJavaSqlTimestamp(); + sessionLogEntryRepository.logoutAllSessions(timestamp); + } + + @Programmatic + @Override + public void log(final Type type, final String username, final Date date, final CausedBy causedBy, final String sessionId) { + val timestamp = clockService.getClock().nowAsJavaSqlTimestamp(); + if (type == Type.LOGIN) { + sessionLogEntryRepository.create(username, sessionId, causedBy, timestamp); + } else { + sessionLogEntryRepository.findBySessionId(sessionId) + .ifPresent(entry -> { + entry.setLogoutTimestamp(timestamp); + entry.setCausedBy(causedBy); + } + ); + } + } + +} diff --git a/extensions/security/sessionlog/pom.xml b/extensions/security/sessionlog/pom.xml new file mode 100644 index 00000000000..8ba18f30f76 --- /dev/null +++ b/extensions/security/sessionlog/pom.xml @@ -0,0 +1,87 @@ + + + + 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 + sis-extensions-sessionlog-persistence-jpa + 2.0.0-SNAPSHOT + + + + org.apache.isis.extensions + sis-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 + + + 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..49cfc338b5d 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 @@ -28,7 +28,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; @@ -88,7 +88,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 +124,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); } /** @@ -223,9 +223,9 @@ protected AuthenticationManager 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(); @@ -249,8 +249,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); From 99e5876b6ba5c7307128ebd88929cf1f3c03cc16 Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Mon, 23 May 2022 19:02:56 +0100 Subject: [PATCH 12/43] ISIS-3062: introduces Nq utility class, also for secman --- .../permission/dom/ApplicationPermission.java | 15 ++++++---- ...plicationPermissionRepositoryAbstract.java | 12 ++++---- .../applib/role/dom/ApplicationRole.java | 9 ++++-- .../ApplicationRoleRepositoryAbstract.java | 4 +-- .../tenancy/dom/ApplicationTenancy.java | 11 ++++++-- .../ApplicationTenancyRepositoryAbstract.java | 6 ++-- .../applib/user/dom/ApplicationUser.java | 14 ++++++---- .../ApplicationUserRepositoryAbstract.java | 8 +++--- .../permission/dom/ApplicationPermission.java | 13 +++++---- .../secman/jdo/role/dom/ApplicationRole.java | 4 +-- .../jdo/tenancy/dom/ApplicationTenancy.java | 6 ++-- .../secman/jdo/user/dom/ApplicationUser.java | 8 +++--- .../permission/dom/ApplicationPermission.java | 12 ++++---- .../secman/jpa/role/dom/ApplicationRole.java | 4 +-- .../jpa/tenancy/dom/ApplicationTenancy.java | 6 ++-- .../secman/jpa/user/dom/ApplicationUser.java | 8 +++--- .../sessionlog/jdo/dom/SessionLogEntry.java | 28 +++++++++---------- 17 files changed, 92 insertions(+), 76 deletions(-) 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 98c3dd27363..85417c31554 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 @@ -89,12 +89,15 @@ public abstract class ApplicationPermission implements Comparable 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 3068acd19cc..2f7d761792d 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 @@ -48,6 +48,8 @@ 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} */ @@ -59,8 +61,11 @@ public abstract class ApplicationRole implements Comparable { 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; 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/tenancy/dom/ApplicationTenancy.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancy.java index b81f3fa9ccb..c0a0934cab7 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 @@ -43,6 +43,8 @@ import org.apache.isis.applib.util.ToString; import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib; +import lombok.experimental.UtilityClass; + /** * @since 2.0 {@index} */ @@ -54,9 +56,12 @@ public abstract class ApplicationTenancy implements Comparable 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/user/dom/ApplicationUser.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java index a1d51276d4e..e8987b9cd04 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 @@ -64,6 +64,7 @@ import org.apache.isis.extensions.secman.applib.tenancy.dom.HasAtPath; import lombok.val; +import lombok.experimental.UtilityClass; /** * @since 2.0 {@index} @@ -77,6 +78,13 @@ public abstract class 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"; + } @Inject private transient ApplicationUserRepository applicationUserRepository; @Inject private transient ApplicationPermissionRepository applicationPermissionRepository; @@ -109,12 +117,6 @@ 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 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..e8e0664c43b 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 @@ -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/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 c7d7660518d..154abd48279 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 @@ -39,6 +39,7 @@ 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; @@ -56,29 +57,29 @@ column = "version") @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 " @@ -86,7 +87,7 @@ + " && 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 " 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 00d14166869..d6aa5fa144b 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 @@ -57,12 +57,12 @@ }) @Queries({ @Query( - name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.NAMED_QUERY_FIND_BY_NAME, + name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.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 = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.Nq.FIND_BY_NAME_CONTAINING, value = "SELECT " + "FROM " + ApplicationRole.FQCN + " WHERE name.matches(:regex) ") 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 c1ee8cfe88e..1296f6b5f80 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 @@ -61,17 +61,17 @@ }) @Queries( { @Query( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.NAMED_QUERY_FIND_BY_PATH, + name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.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 = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.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 = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.Nq.FIND_BY_NAME_OR_PATH_MATCHING, value = "SELECT " + "FROM " + ApplicationTenancy.FQCN + " WHERE name.matches(:regex) || path.matches(:regex) ")}) 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 2c6d7a77658..ce3fbcb2906 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 @@ -68,22 +68,22 @@ }) @Queries( { @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_USERNAME, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND_BY_USERNAME, value = "SELECT " + "FROM " + ApplicationUser.FQCN + " WHERE username == :username"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_EMAIL_ADDRESS, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND_BY_EMAIL_ADDRESS, value = "SELECT " + "FROM " + ApplicationUser.FQCN + " WHERE emailAddress == :emailAddress"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_ATPATH, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND_BY_ATPATH, value = "SELECT " + "FROM " + ApplicationUser.FQCN + " WHERE atPath == :atPath"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND, value = "SELECT " + "FROM " + ApplicationUser.FQCN + " WHERE username.matches(:regex)" 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 0ff785478c3..00fb24eaff3 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 @@ -56,31 +56,31 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.NAMED_QUERY_FIND_BY_ROLE, + name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.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 = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.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 = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.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 = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.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 = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.Nq.FIND_BY_ROLE_RULE_FEATURE_FQN, query = "SELECT p " + " FROM ApplicationPermission p " + " WHERE p.role = :role " @@ -88,7 +88,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 = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.Nq.FIND_BY_ROLE_RULE_FEATURE, query = "SELECT p " + " FROM ApplicationPermission p " + " WHERE p.role = :role " 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 3404303b0a8..e1c4c08dadb 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 @@ -54,12 +54,12 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.NAMED_QUERY_FIND_BY_NAME, + name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.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 = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.Nq.FIND_BY_NAME_CONTAINING, query = "SELECT r " + "FROM ApplicationRole r " + "WHERE r.name LIKE :regex"), 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 2181952e3cb..927e1c44488 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 @@ -52,17 +52,17 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.NAMED_QUERY_FIND_BY_PATH, + name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.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 = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.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 = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.Nq.FIND_BY_NAME_OR_PATH_MATCHING, query = "SELECT t " + " FROM ApplicationTenancy t " + " WHERE t.name LIKE :regex " 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 0ac8e09265e..19ee9080453 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 @@ -62,22 +62,22 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.NAMED_QUERY_FIND_BY_USERNAME, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.NAMED_QUERY_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 = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.NAMED_QUERY_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 = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.NAMED_QUERY_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 = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.NAMED_QUERY_FIND, query = "SELECT u " + " FROM ApplicationUser u " + " WHERE u.username LIKE :regex" 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 index 0030d784721..b94397c6f69 100644 --- 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 @@ -142,20 +142,20 @@ public class SessionLogEntry implements HasUsername, Comparable public static final String TABLE = "SessionLogEntry"; @UtilityClass - static class Nq { - static final String FIND_BY_SESSION_ID = "findBySessionId"; - static final String FIND_BY_USER_AND_TIMESTAMP_BETWEEN = "findByUserAndTimestampBetween"; - static final String FIND_BY_USER_AND_TIMESTAMP_AFTER = "findByUserAndTimestampAfter"; - static final String FIND_BY_USER_AND_TIMESTAMP_BEFORE = "findByUserAndTimestampBefore"; - static final String FIND_BY_USER = "findByUser"; - static final String FIND_BY_TIMESTAMP_BETWEEN = "findByTimestampBetween"; - static final String FIND_BY_TIMESTAMP_AFTER = "findByTimestampAfter"; - static final String FIND_BY_TIMESTAMP_BEFORE = "findByTimestampBefore"; - static final String FIND = "find"; - static final String FIND_BY_USER_AND_TIMESTAMP_STRICTLY_BEFORE = "findByUserAndTimestampStrictlyBefore"; - static final String FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER = "findByUserAndTimestampStrictlyAfter"; - static final String FIND_ACTIVE_SESSIONS = "findActiveSessions"; - static final String FIND_RECENT_BY_USER = "findRecentByUser"; + public static class Nq { + public static final String FIND_BY_SESSION_ID = SessionLogEntry.LOGICAL_TYPE_NAME + ".findBySessionId"; + public static final String FIND_BY_USER_AND_TIMESTAMP_BETWEEN = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampBetween"; + public static final String FIND_BY_USER_AND_TIMESTAMP_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampAfter"; + public static final String FIND_BY_USER_AND_TIMESTAMP_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampBefore"; + public static final String FIND_BY_USER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUser"; + 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_USER_AND_TIMESTAMP_STRICTLY_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampStrictlyBefore"; + public static final String FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampStrictlyAfter"; + public static final String FIND_ACTIVE_SESSIONS = SessionLogEntry.LOGICAL_TYPE_NAME + ".findActiveSessions"; + public static final String FIND_RECENT_BY_USER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findRecentByUser"; } public static abstract class PropertyDomainEvent extends IsisModuleExtSessionLogApplib.PropertyDomainEvent { } From 8685439fca032de0ab5577cebfe2068036c41d01 Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Mon, 23 May 2022 19:18:30 +0100 Subject: [PATCH 13/43] ISIS-3062: renames session-log to sessionlog, command-log to commandlog etc also for audit-trail, command-replay --- .../hooks/Action_026-command-processing.adoc | 4 +- .../annotation/hooks/Action_030-see-also.adoc | 4 +- .../Property_028-command-processing.adoc | 4 +- .../hooks/HasInteractionId_see-also.adoc | 4 +- ...xecutorService_020-examples-and-usage.adoc | 4 +- ...ocessorService_020-examples-and-usage.adoc | 4 +- ...tentMappingService_010-implementation.adoc | 2 +- .../IsisModuleExtCommandReplayPrimary.adoc | 2 +- .../IsisModuleExtCommandReplaySecondary.adoc | 2 +- .../pages/mixees-and-mixins.adoc | 2 +- .../contributee.adoc | 6 +- .../modules/applib-svc/pages/about.adoc | 2 +- .../applib-svc/partials/_integration-spi.adoc | 4 +- .../applib-svc/partials/_security-spi.adoc | 2 +- .../ROOT/pages/2020/2.0.0-M4/relnotes.adoc | 2 +- .../ROOT/pages/2021/2.0.0-M6/relnotes.adoc | 2 +- .../modules/ROOT/partials/extensions.adoc | 4 +- .../pages/concepts-patterns/architecture.adoc | 2 +- antora/playbooks/site-extensions.yml | 4 +- antora/playbooks/site-security.yml | 4 +- antora/playbooks/site.yml | 8 +- .../main/adoc/modules/schema/pages/about.adoc | 2 +- core/adoc/modules/_overview/pages/about.adoc | 44 ++++----- .../pages/sections/isis.extensions.adoc | 84 +++++++++--------- examples/demo/domain/pom.xml | 4 +- ...ctionCommandPublishingJdo-description.adoc | 14 +-- ...ctionCommandPublishingJpa-description.adoc | 14 +-- ...pertyCommandPublishingJdo-description.adoc | 14 +-- ...pertyCommandPublishingJpa-description.adoc | 14 +-- .../config/application-primary.properties | 2 +- .../config/application-secondary.properties | 10 +-- examples/demo/web/pom.xml | 4 +- .../web/replay/DemoReplayController.java | 2 +- .../command-log/partials/module-nav.adoc | 6 -- .../command-replay/partials/module-nav.adoc | 5 -- .../adoc/antora.yml | 0 .../adoc/modules/command-log/nav.adoc | 0 .../adoc/modules/command-log/pages/about.adoc | 4 +- .../command-log/partials/module-nav.adoc | 6 ++ .../applib/pom.xml | 10 +-- .../applib/IsisModuleExtCommandLogApplib.java | 8 +- .../commandlog/applib/command/CommandLog.java | 0 .../command/CommandLog.layout.fallback.xml | 0 .../commandlog/applib/command/CommandLog.png | Bin .../applib/command/ICommandLog.java | 0 .../applib/command/ICommandLogRepository.java | 0 .../applib/command/ReplayState.java | 0 .../mixins/CommandLog_childCommands.java | 0 .../mixins/CommandLog_openResultObject.java | 0 .../mixins/CommandLog_openTargetObject.java | 0 .../command/mixins/CommandLog_retry.java | 0 .../mixins/CommandLog_siblingCommands.java | 0 .../CommandSubscriberForCommandLog.java | 0 .../command/ui/CommandLogServiceMenu.java | 0 .../applib/util/BigDecimalUtils.java | 0 .../commandlog/applib/util/StringUtils.java | 0 .../model/util/StringUtils_trimmed_Test.java | 0 .../jdo/logging-dn-enhance.properties | 0 .../{command-log => commandlog}/jdo/pom.xml | 10 +-- .../src/main/java/META-INF/persistence.xml | 0 .../jdo/IsisModuleExtCommandLogJdo.java | 0 .../commandlog/jdo/entities/CommandJdo.java | 0 .../jdo/entities/CommandJdoRepository.java | 0 .../jdo/mixins/HasInteractionId_command.java | 0 .../HasUsername_recentCommandsByUser.java | 0 .../jdo/mixins/Object_recentCommands.java | 0 .../commandlog/jdo/mixins/T_recent.java | 0 .../{command-log => commandlog}/jpa/pom.xml | 16 ++-- .../jpa/IsisModuleExtCommandLogJpa.java | 0 .../commandlog/jpa/entities/CommandJpa.java | 0 .../jpa/entities/CommandJpaRepository.java | 0 .../META-INF/orm-commandlog.template | 0 .../core/{command-log => commandlog}/pom.xml | 20 ++--- .../adoc/antora.yml | 0 .../adoc/modules/command-replay/nav.adoc | 0 .../modules/command-replay/pages/about.adoc | 2 +- .../command-replay/partials/module-nav.adoc | 5 ++ .../{command-replay => commandreplay}/pom.xml | 20 ++--- .../primary/pom.xml | 6 +- .../IsisModuleExtCommandReplayPrimary.java | 4 +- .../primary/config/PrimaryConfig.java | 0 .../mixins/Object_openOnSecondary.java | 0 .../CommandRetrievalOnPrimaryService.java | 2 +- .../spiimpl/CaptureResultOfCommand.java | 0 .../ui/CommandReplayOnPrimaryService.java | 2 +- .../secondary/log4j2-test.xml | 0 .../secondary/pom.xml | 28 +++--- .../IsisModuleExtCommandReplaySecondary.java | 4 +- .../analyser/CommandReplayAnalyser.java | 0 .../CommandReplayAnalyserException.java | 0 .../analyser/CommandReplayAnalyserResult.java | 0 .../CommandReplayAnalysisService.java | 0 .../secondary/config/SecondaryConfig.java | 0 .../secondary/fetch/CommandFetcher.java | 0 .../secondary/job/ReplicateAndReplayJob.java | 0 .../secondary/job/SecondaryStatusData.java | 0 .../jobcallables/ReplicateAndRunCommands.java | 0 .../secondary/mixins/CommandLog_exclude.java | 0 .../mixins/CommandLog_replayQueue.java | 0 .../mixins/Object_openOnPrimary.java | 0 .../spi/ReplayCommandExecutionController.java | 0 .../secondary/status/SecondaryStatus.java | 0 .../secondary/status/StatusException.java | 0 .../ui/CommandReplayOnSecondaryService.java | 0 .../secondary/fetch/CommandFetcher_Test.java | 0 extensions/pom.xml | 14 +-- .../adoc/modules/audit-trail/pages/about.adoc | 4 +- .../audit-trail/partials/module-nav.adoc | 2 +- .../session-log/partials/module-nav.adoc | 2 +- isis-tooling.yml | 8 +- .../hints-and-tips/jdoql-and-timestamps.adoc | 2 +- .../overriding-jdo-annotations.adoc | 2 +- security/adoc/modules/ROOT/pages/about.adoc | 4 +- .../modules/ROOT/partials/extensions.adoc | 4 +- .../tooling-cli/examples/isis-tooling.yml | 8 +- .../isis/tooling/cli/test/isis-tooling.yml | 8 +- 116 files changed, 248 insertions(+), 248 deletions(-) delete mode 100644 extensions/core/command-log/adoc/modules/command-log/partials/module-nav.adoc delete mode 100644 extensions/core/command-replay/adoc/modules/command-replay/partials/module-nav.adoc rename extensions/core/{command-log => commandlog}/adoc/antora.yml (100%) rename extensions/core/{command-log => commandlog}/adoc/modules/command-log/nav.adoc (100%) rename extensions/core/{command-log => commandlog}/adoc/modules/command-log/pages/about.adoc (87%) create mode 100644 extensions/core/commandlog/adoc/modules/command-log/partials/module-nav.adoc rename extensions/core/{command-log => commandlog}/applib/pom.xml (95%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/IsisModuleExtCommandLogApplib.java (88%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.layout.fallback.xml (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.png (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ReplayState.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_childCommands.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_openResultObject.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_openTargetObject.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_retry.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/mixins/CommandLog_siblingCommands.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/subscriber/CommandSubscriberForCommandLog.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java (100%) rename extensions/core/{command-log => commandlog}/applib/src/test/java/org/apache/isis/extensions/commandlog/model/util/StringUtils_trimmed_Test.java (100%) rename extensions/core/{command-log => commandlog}/jdo/logging-dn-enhance.properties (100%) rename extensions/core/{command-log => commandlog}/jdo/pom.xml (93%) rename extensions/core/{command-log => commandlog}/jdo/src/main/java/META-INF/persistence.xml (100%) rename extensions/core/{command-log => commandlog}/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/IsisModuleExtCommandLogJdo.java (100%) rename extensions/core/{command-log => commandlog}/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java (100%) rename extensions/core/{command-log => commandlog}/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java (100%) rename extensions/core/{command-log => commandlog}/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasInteractionId_command.java (100%) rename extensions/core/{command-log => commandlog}/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasUsername_recentCommandsByUser.java (100%) rename extensions/core/{command-log => commandlog}/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/Object_recentCommands.java (100%) rename extensions/core/{command-log => commandlog}/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/T_recent.java (100%) rename extensions/core/{command-log => commandlog}/jpa/pom.xml (93%) rename extensions/core/{command-log => commandlog}/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/IsisModuleExtCommandLogJpa.java (100%) rename extensions/core/{command-log => commandlog}/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java (100%) rename extensions/core/{command-log => commandlog}/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java (100%) rename extensions/core/{command-log => commandlog}/jpa/src/main/resources/META-INF/orm-commandlog.template (100%) rename extensions/core/{command-log => commandlog}/pom.xml (88%) rename extensions/core/{command-replay => commandreplay}/adoc/antora.yml (100%) rename extensions/core/{command-replay => commandreplay}/adoc/modules/command-replay/nav.adoc (100%) rename extensions/core/{command-replay => commandreplay}/adoc/modules/command-replay/pages/about.adoc (97%) create mode 100644 extensions/core/commandreplay/adoc/modules/command-replay/partials/module-nav.adoc rename extensions/core/{command-replay => commandreplay}/pom.xml (91%) rename extensions/core/{command-replay => commandreplay}/primary/pom.xml (92%) rename extensions/core/{command-replay => commandreplay}/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/IsisModuleExtCommandReplayPrimary.java (96%) rename extensions/core/{command-replay => commandreplay}/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/config/PrimaryConfig.java (100%) rename extensions/core/{command-replay => commandreplay}/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/mixins/Object_openOnSecondary.java (100%) rename extensions/core/{command-replay => commandreplay}/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/restapi/CommandRetrievalOnPrimaryService.java (99%) rename extensions/core/{command-replay => commandreplay}/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/spiimpl/CaptureResultOfCommand.java (100%) rename extensions/core/{command-replay => commandreplay}/primary/src/main/java/org/apache/isis/extensions/commandreplay/primary/ui/CommandReplayOnPrimaryService.java (99%) rename extensions/core/{command-replay => commandreplay}/secondary/log4j2-test.xml (100%) rename extensions/core/{command-replay => commandreplay}/secondary/pom.xml (90%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/IsisModuleExtCommandReplaySecondary.java (98%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyser.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserException.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analyser/CommandReplayAnalyserResult.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/analysis/CommandReplayAnalysisService.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/config/SecondaryConfig.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/ReplicateAndReplayJob.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/job/SecondaryStatusData.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/jobcallables/ReplicateAndRunCommands.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLog_exclude.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/CommandLog_replayQueue.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/Object_openOnPrimary.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/spi/ReplayCommandExecutionController.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/SecondaryStatus.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/status/StatusException.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/ui/CommandReplayOnSecondaryService.java (100%) rename extensions/core/{command-replay => commandreplay}/secondary/src/test/java/org/apache/isis/extensions/commandreplay/secondary/fetch/CommandFetcher_Test.java (100%) 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/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/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/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/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/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/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/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/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/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-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 95% rename from extensions/core/command-log/applib/pom.xml rename to extensions/core/commandlog/applib/pom.xml index d2a7401edf5..781127edbbb 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,20 @@ 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 88% 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..4fee06ff2f6 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 @@ -55,11 +55,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/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java similarity index 100% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java 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/command/CommandLog.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/command/CommandLog.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/command/CommandLog.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/command/CommandLog.png diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java similarity index 100% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java similarity index 100% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java 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/command/ReplayState.java similarity index 100% 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/command/ReplayState.java 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/command/mixins/CommandLog_childCommands.java similarity index 100% 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/command/mixins/CommandLog_childCommands.java 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/command/mixins/CommandLog_openResultObject.java similarity index 100% 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/command/mixins/CommandLog_openResultObject.java 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/command/mixins/CommandLog_openTargetObject.java similarity index 100% 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/command/mixins/CommandLog_openTargetObject.java 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/command/mixins/CommandLog_retry.java similarity index 100% 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/command/mixins/CommandLog_retry.java 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/command/mixins/CommandLog_siblingCommands.java similarity index 100% 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/command/mixins/CommandLog_siblingCommands.java 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/command/subscriber/CommandSubscriberForCommandLog.java similarity index 100% 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/command/subscriber/CommandSubscriberForCommandLog.java diff --git a/extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java similarity index 100% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java diff --git a/extensions/core/command-log/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 similarity index 100% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/BigDecimalUtils.java diff --git a/extensions/core/command-log/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 similarity index 100% rename from extensions/core/command-log/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java rename to extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/util/StringUtils.java 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/model/util/StringUtils_trimmed_Test.java similarity index 100% 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/model/util/StringUtils_trimmed_Test.java 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 100% 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 diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java similarity index 100% rename from extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java rename to extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java diff --git a/extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java similarity index 100% rename from extensions/core/command-log/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java rename to extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java 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/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasInteractionId_command.java similarity index 100% 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/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasInteractionId_command.java 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/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasUsername_recentCommandsByUser.java similarity index 100% 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/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/HasUsername_recentCommandsByUser.java 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/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/Object_recentCommands.java similarity index 100% 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/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/Object_recentCommands.java 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/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/T_recent.java similarity index 100% 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/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/T_recent.java 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 100% 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 diff --git a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java similarity index 100% rename from extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java rename to extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java diff --git a/extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java similarity index 100% rename from extensions/core/command-log/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java rename to extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java 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 99% 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..209a354957c 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 @@ -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 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 100% 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 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 99% 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..7071d1f8987 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 @@ -63,7 +63,7 @@ ) @Named(IsisModuleExtCommandReplayPrimary.NAMESPACE + ".CommandReplayOnPrimaryService") @javax.annotation.Priority(PriorityPrecedence.EARLY) -@Profile("command-replay-primary") +@Profile("commandreplay-primary") @RequiredArgsConstructor //@Log4j2 public class CommandReplayOnPrimaryService { 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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/CommandLog_exclude.java similarity index 100% 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/CommandLog_exclude.java 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/CommandLog_replayQueue.java similarity index 100% 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/CommandLog_replayQueue.java 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 100% 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 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 1ff523d8152..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 @@ -263,8 +263,8 @@ applib/excel - core/command-log - core/command-replay + core/commandlog + core/commandreplay core/flyway core/quartz diff --git a/extensions/security/audittrail/adoc/modules/audit-trail/pages/about.adoc b/extensions/security/audittrail/adoc/modules/audit-trail/pages/about.adoc index 0cdc6526488..4eadf43ebfe 100644 --- a/extensions/security/audittrail/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 index e47f9f11dd0..72ce36900dc 100644 --- a/extensions/security/audittrail/adoc/modules/audit-trail/partials/module-nav.adoc +++ b/extensions/security/audittrail/adoc/modules/audit-trail/partials/module-nav.adoc @@ -1,6 +1,6 @@ -** xref:security:audit-trail:about.adoc[Audit Trail] +** xref:security:audittrail:about.adoc[Audit Trail] 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 index 62b04f529e0..d57e4880991 100644 --- a/extensions/security/sessionlog/adoc/modules/session-log/partials/module-nav.adoc +++ b/extensions/security/sessionlog/adoc/modules/session-log/partials/module-nav.adoc @@ -1,6 +1,6 @@ -** xref:security:session-log:about.adoc[Session Log] +** xref:security:sessionlog:about.adoc[Session Log] 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/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/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.*" From 2b6743aa43ee65cdeed5235800fa8d97c25c6196 Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Tue, 24 May 2022 08:57:04 +0100 Subject: [PATCH 14/43] ISIS-3062: fixes some compile issues for secman jpa --- .../jpa/permission/dom/ApplicationPermission.java | 4 ++-- .../secman/jpa/role/dom/ApplicationRole.java | 4 ++-- .../secman/jpa/tenancy/dom/ApplicationTenancy.java | 4 ++-- .../secman/jpa/user/dom/ApplicationUser.java | 12 ++++++------ 4 files changed, 12 insertions(+), 12 deletions(-) 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 00fb24eaff3..a5a824ad057 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 @@ -47,8 +47,8 @@ @Entity @Table( - schema = "isisExtensionsSecman", - name = "ApplicationPermission", + schema = ApplicationPermission.SCHEMA, + name = ApplicationPermission.TABLE, uniqueConstraints= @UniqueConstraint( name = "ApplicationPermission_role_feature_rule_UNQ", 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 e1c4c08dadb..6c6e8859d92 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 @@ -45,8 +45,8 @@ @Entity @Table( - schema = "isisExtensionsSecman", - name = "ApplicationRole", + schema = ApplicationRole.SCHEMA, + name = ApplicationRole.TABLE, uniqueConstraints = @UniqueConstraint( name = "ApplicationRole_name_UNQ", 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 927e1c44488..52d2c13c5fc 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 @@ -43,8 +43,8 @@ @Entity @Table( - schema = "isisExtensionsSecman", - name = "ApplicationTenancy", + schema = ApplicationTenancy.SCHEMA, + name = ApplicationTenancy.TABLE, uniqueConstraints = @UniqueConstraint( name = "ApplicationTenancy_name_UNQ", 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 19ee9080453..c3796a427d7 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 @@ -53,8 +53,8 @@ @Entity @Table( - schema = "isisExtensionsSecman", - name = "ApplicationUser", + schema = ApplicationUser.SCHEMA, + name = ApplicationUser.TABLE, uniqueConstraints = @UniqueConstraint( name = "ApplicationUser_username_UNQ", @@ -62,22 +62,22 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.NAMED_QUERY_FIND_BY_USERNAME, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.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.Nq.NAMED_QUERY_FIND_BY_EMAIL_ADDRESS, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.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.Nq.NAMED_QUERY_FIND_BY_ATPATH, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.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.Nq.NAMED_QUERY_FIND, + name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND, query = "SELECT u " + " FROM ApplicationUser u " + " WHERE u.username LIKE :regex" From a52dc368946b983adcc94851198b66cb6ef2874a Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Tue, 24 May 2022 13:47:18 +0100 Subject: [PATCH 15/43] ISIS-3062: factors out sessionlog-applib --- .../ApplicationUserRepositoryAbstract.java | 2 +- .../permission/dom/ApplicationPermission.java | 30 +- .../secman/jdo/role/dom/ApplicationRole.java | 19 +- .../jdo/tenancy/dom/ApplicationTenancy.java | 37 +- .../secman/jdo/user/dom/ApplicationUser.java | 29 +- .../secman/jdo/util/RegexReplacer.java | 4 +- .../permission/dom/ApplicationPermission.java | 14 +- .../dom/ApplicationPermissionRepository.java | 10 - .../secman/jpa/role/dom/ApplicationRole.java | 5 +- .../jpa/tenancy/dom/ApplicationTenancy.java | 20 +- .../secman/jpa/user/dom/ApplicationUser.java | 9 +- .../applib/IsisModuleExtSessionLogApplib.java | 8 + .../applib}/app/SessionLogMenu.java | 8 +- .../HasUsername_recentSessionsForUser.java | 9 +- .../applib}/dom/SessionLogEntry-expired.png | Bin .../applib}/dom/SessionLogEntry-login.png | Bin .../applib}/dom/SessionLogEntry-logout.png | Bin .../applib/dom/SessionLogEntry.java | 326 ++++++++++++++++++ .../dom/SessionLogEntry.layout.fallback.xml | 6 +- .../applib/dom/SessionLogEntryRepository.java | 174 ++++++++++ .../spiimpl/SessionLoggingServiceDefault.java | 22 +- ...IsisModuleExtSessionLogPersistenceJdo.java | 5 +- .../sessionlog/jdo/dom/SessionLogEntry.java | 271 +-------------- .../jdo/dom/SessionLogEntryRepository.java | 154 +-------- 24 files changed, 642 insertions(+), 520 deletions(-) rename extensions/security/sessionlog/{persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo => applib/src/main/java/org/apache/isis/sessionlog/applib}/app/SessionLogMenu.java (91%) rename extensions/security/sessionlog/{persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo => applib/src/main/java/org/apache/isis/sessionlog/applib}/contributions/HasUsername_recentSessionsForUser.java (84%) rename extensions/security/sessionlog/{persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo => applib/src/main/java/org/apache/isis/sessionlog/applib}/dom/SessionLogEntry-expired.png (100%) rename extensions/security/sessionlog/{persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo => applib/src/main/java/org/apache/isis/sessionlog/applib}/dom/SessionLogEntry-login.png (100%) rename extensions/security/sessionlog/{persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo => applib/src/main/java/org/apache/isis/sessionlog/applib}/dom/SessionLogEntry-logout.png (100%) create mode 100644 extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.java rename extensions/security/sessionlog/{persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo => applib/src/main/java/org/apache/isis/sessionlog/applib}/dom/SessionLogEntry.layout.fallback.xml (82%) create mode 100644 extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntryRepository.java rename extensions/security/sessionlog/{persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo => applib/src/main/java/org/apache/isis/sessionlog/applib}/spiimpl/SessionLoggingServiceDefault.java (80%) 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 e8e0664c43b..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; 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 154abd48279..f81887816f2 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,7 +18,6 @@ */ 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; @@ -48,13 +47,11 @@ identityType = IdentityType.DATASTORE, schema = ApplicationPermission.SCHEMA, table = ApplicationPermission.TABLE) -@Inheritance( - strategy = InheritanceStrategy.NEW_TABLE) -@DatastoreIdentity( - strategy = IdGeneratorStrategy.NATIVE, column = "id") -@Version( - strategy = VersionStrategy.VERSION_NUMBER, - column = "version") +@Uniques({ + @Unique( + name = "ApplicationPermission_role_feature_rule_UNQ", + members = { "role", "featureSort", "featureFqn", "rule" }) +}) @Queries( { @Query( name = Nq.FIND_BY_ROLE, @@ -94,13 +91,16 @@ + " && rule == :rule " + " && featureSort == :featureSort "), }) -@Uniques({ - @Unique( - name = "ApplicationPermission_role_feature_rule_UNQ", - members = { "role", "featureSort", "featureFqn", "rule" }) -}) -@Named(ApplicationPermission.LOGICAL_TYPE_NAME) -@DomainObject +@Inheritance( + strategy = InheritanceStrategy.NEW_TABLE) +@DatastoreIdentity( + strategy = IdGeneratorStrategy.NATIVE, column = "id") +@Version( + strategy = VersionStrategy.VERSION_NUMBER, + column = "version") +@DomainObject( + logicalTypeName = ApplicationPermission.LOGICAL_TYPE_NAME +) @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_CHILD ) 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 d6aa5fa144b..994f1748e62 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,7 +21,6 @@ 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; @@ -40,6 +39,7 @@ 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.Nq; import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; @@ -47,29 +47,30 @@ identityType = IdentityType.DATASTORE, schema = ApplicationRole.SCHEMA, table = ApplicationRole.TABLE) -@Inheritance( - strategy = InheritanceStrategy.NEW_TABLE) -@DatastoreIdentity( - strategy = IdGeneratorStrategy.NATIVE, column = "id") @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.Nq.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.Nq.FIND_BY_NAME_CONTAINING, + name = Nq.FIND_BY_NAME_CONTAINING, value = "SELECT " + "FROM " + ApplicationRole.FQCN + " WHERE name.matches(:regex) ") }) -@Named(ApplicationRole.LOGICAL_TYPE_NAME) +@Inheritance( + strategy = InheritanceStrategy.NEW_TABLE) +@DatastoreIdentity( + strategy = IdGeneratorStrategy.NATIVE, column = "id") @DomainObject( bounding = Bounding.BOUNDED, + logicalTypeName = ApplicationRole.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationRoleRepository.class, autoCompleteMethod = "findMatching" ) 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 1296f6b5f80..100abe70c3e 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,7 +21,6 @@ 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; @@ -42,45 +41,49 @@ 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; @PersistenceCapable( identityType = IdentityType.APPLICATION, schema = ApplicationTenancy.SCHEMA, table = ApplicationTenancy.TABLE) -@Inheritance( - strategy = InheritanceStrategy.NEW_TABLE) -@DatastoreIdentity( - strategy = IdGeneratorStrategy.NATIVE, column = "id") -@Version( - strategy = VersionStrategy.VERSION_NUMBER, - column = "version") @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.Nq.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.Nq.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.Nq.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) ")}) -@Named(ApplicationTenancy.LOGICAL_TYPE_NAME) +@Inheritance( + strategy = InheritanceStrategy.NEW_TABLE) +@DatastoreIdentity( + strategy = IdGeneratorStrategy.NATIVE, column = "id") +@Version( + strategy = VersionStrategy.VERSION_NUMBER, + column = "version") @DomainObject( + logicalTypeName = ApplicationTenancy.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationTenancyRepository.class, - autoCompleteMethod = "findMatching") + autoCompleteMethod = "findMatching" +) @DomainObjectLayout( - bookmarking = BookmarkPolicy.AS_ROOT) + bookmarking = BookmarkPolicy.AS_ROOT + ) public class ApplicationTenancy extends org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy { @@ -89,7 +92,7 @@ public class ApplicationTenancy // -- NAME - @Column(allowsNull ="false", length = Name.MAX_LENGTH) + @Column(allowsNull = "false", length = Name.MAX_LENGTH) private String name; @Name @@ -132,7 +135,7 @@ public org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy g return parent; } @Override - public void setParent(final org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { + public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { this.parent = _Casts.uncheckedCast(parent); } 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 ce3fbcb2906..762bca0de3c 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 @@ -22,7 +22,6 @@ 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; @@ -45,6 +44,7 @@ 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 lombok.Getter; @@ -54,13 +54,6 @@ identityType = IdentityType.DATASTORE, schema = ApplicationUser.SCHEMA, table = ApplicationUser.TABLE) -@Inheritance( - strategy = InheritanceStrategy.NEW_TABLE) -@DatastoreIdentity( - strategy = IdGeneratorStrategy.NATIVE, column = "id") -@Version( - strategy = VersionStrategy.VERSION_NUMBER, - column = "version") @Uniques({ @Unique( name = "ApplicationUser_username_UNQ", @@ -68,22 +61,22 @@ }) @Queries( { @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND_BY_USERNAME, + name = Nq.FIND_BY_USERNAME, value = "SELECT " + "FROM " + ApplicationUser.FQCN + " WHERE username == :username"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND_BY_EMAIL_ADDRESS, + name = Nq.FIND_BY_EMAIL_ADDRESS, value = "SELECT " + "FROM " + ApplicationUser.FQCN + " WHERE emailAddress == :emailAddress"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND_BY_ATPATH, + name = Nq.FIND_BY_ATPATH, value = "SELECT " + "FROM " + ApplicationUser.FQCN + " WHERE atPath == :atPath"), @Query( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.FIND, + name = Nq.FIND, value = "SELECT " + "FROM " + ApplicationUser.FQCN + " WHERE username.matches(:regex)" @@ -92,10 +85,18 @@ + " || knownAs.matches(:regex)" + " || emailAddress.matches(:regex)") }) -@Named(ApplicationUser.LOGICAL_TYPE_NAME) +@Inheritance( + strategy = InheritanceStrategy.NEW_TABLE) +@DatastoreIdentity( + strategy = IdGeneratorStrategy.NATIVE, column = "id") +@Version( + strategy = VersionStrategy.VERSION_NUMBER, + column = "version") @DomainObject( + logicalTypeName = ApplicationUser.LOGICAL_TYPE_NAME, autoCompleteRepository = ApplicationUserRepository.class, - autoCompleteMethod = "findMatching") + autoCompleteMethod = "findMatching" +) @DomainObjectLayout( bookmarking = BookmarkPolicy.AS_ROOT ) 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/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 a5a824ad057..ec8b028b31b 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 @@ -45,6 +45,8 @@ 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.*; + @Entity @Table( schema = ApplicationPermission.SCHEMA, @@ -56,31 +58,31 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.Nq.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.Nq.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.Nq.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.Nq.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.Nq.FIND_BY_ROLE_RULE_FEATURE_FQN, + name = Nq.FIND_BY_ROLE_RULE_FEATURE_FQN, query = "SELECT p " + " FROM ApplicationPermission p " + " WHERE p.role = :role " @@ -88,7 +90,7 @@ + " AND p.featureSort = :featureSort " + " AND p.featureFqn = :featureFqn "), @NamedQuery( - name = org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.Nq.FIND_BY_ROLE_RULE_FEATURE, + name = Nq.FIND_BY_ROLE_RULE_FEATURE, query = "SELECT p " + " FROM ApplicationPermission p " + " WHERE p.role = :role " 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 6c6e8859d92..b5df0cc196b 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 @@ -40,6 +40,7 @@ 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.Nq; import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; @@ -54,12 +55,12 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.Nq.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.Nq.FIND_BY_NAME_CONTAINING, + name = Nq.FIND_BY_NAME_CONTAINING, query = "SELECT r " + "FROM ApplicationRole r " + "WHERE r.name LIKE :regex"), 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 52d2c13c5fc..fda4f6daa70 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,7 +22,6 @@ import java.util.SortedSet; import java.util.TreeSet; -import javax.inject.Named; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; @@ -39,6 +38,7 @@ 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; @Entity @@ -52,28 +52,30 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy.Nq.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.Nq.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.Nq.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") + autoCompleteMethod = "findMatching" + ) @DomainObjectLayout( - bookmarking = BookmarkPolicy.AS_ROOT) + bookmarking = BookmarkPolicy.AS_ROOT + ) public class ApplicationTenancy extends org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy { @@ -127,7 +129,7 @@ public org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy g return parent; } @Override - public void setParent(final org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { + public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.ApplicationTenancy parent) { this.parent = _Casts.uncheckedCast(parent); } @@ -142,7 +144,7 @@ public void setParent(final org.apache.isis.extensions.secman.applib.tenancy.dom public Set getChildren() { return _Casts.uncheckedCast(children); } - public void setChildren(final 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 c3796a427d7..87653ab78e8 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 @@ -45,6 +45,7 @@ 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.persistence.jpa.applib.integration.IsisEntityListener; @@ -62,22 +63,22 @@ ) @NamedQueries({ @NamedQuery( - name = org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser.Nq.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.Nq.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.Nq.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.Nq.FIND, + name = Nq.FIND, query = "SELECT u " + " FROM ApplicationUser u " + " WHERE u.username LIKE :regex" 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 index 241074c03f3..08eb12c263b 100644 --- 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 @@ -3,10 +3,18 @@ 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.dom.SessionLogEntryRepository; +import org.apache.isis.sessionlog.applib.spiimpl.SessionLoggingServiceDefault; +import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib; + @Configuration @Import({ + IsisModuleTestingFixturesApplib.class, + SessionLogMenu.class, + SessionLoggingServiceDefault.class }) public class IsisModuleExtSessionLogApplib { diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/app/SessionLogMenu.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/app/SessionLogMenu.java similarity index 91% rename from extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/app/SessionLogMenu.java rename to extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/app/SessionLogMenu.java index 9e5aeb37092..002512a5c95 100644 --- a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/app/SessionLogMenu.java +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/app/SessionLogMenu.java @@ -1,4 +1,4 @@ -package org.apache.isis.sessionlog.jdo.app; +package org.apache.isis.sessionlog.applib.app; import java.util.List; @@ -17,8 +17,8 @@ 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.jdo.dom.SessionLogEntry; -import org.apache.isis.sessionlog.jdo.dom.SessionLogEntryRepository; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository; /** @@ -57,7 +57,7 @@ public class findSessions { public class ActionEvent extends ActionDomainEvent { } @Action( - domainEvent = findSessions.ActionEvent.class, + domainEvent = ActionEvent.class, semantics = SemanticsOf.SAFE ) @ActionLayout( diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/contributions/HasUsername_recentSessionsForUser.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/contributions/HasUsername_recentSessionsForUser.java similarity index 84% rename from extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/contributions/HasUsername_recentSessionsForUser.java rename to extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/contributions/HasUsername_recentSessionsForUser.java index f232b37033a..810ee105b8e 100644 --- a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/contributions/HasUsername_recentSessionsForUser.java +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/contributions/HasUsername_recentSessionsForUser.java @@ -1,4 +1,4 @@ -package org.apache.isis.sessionlog.jdo.contributions; +package org.apache.isis.sessionlog.applib.contributions; import java.util.Collections; import java.util.List; @@ -10,12 +10,9 @@ 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.jdo.IsisModuleExtSessionLogPersistenceJdo; -import org.apache.isis.sessionlog.jdo.dom.SessionLogEntry; -import org.apache.isis.sessionlog.jdo.dom.SessionLogEntryRepository; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository; import lombok.RequiredArgsConstructor; diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-expired.png b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-expired.png similarity index 100% rename from extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-expired.png rename to extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-expired.png diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-login.png b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-login.png similarity index 100% rename from extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-login.png rename to extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-login.png diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-logout.png b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-logout.png similarity index 100% rename from extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry-logout.png rename to extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry-logout.png 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..f158e3ab557 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.java @@ -0,0 +1,326 @@ +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 javax.inject.Inject; +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.Action; +import org.apache.isis.applib.annotation.ActionLayout; +import org.apache.isis.applib.annotation.DomainObject; +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; + +@DomainObject( + logicalTypeName = SessionLogEntry.LOGICAL_TYPE_NAME, + editing = Editing.DISABLED +) +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_ID = SessionLogEntry.LOGICAL_TYPE_NAME + ".findBySessionId"; + public static final String FIND_BY_USER_AND_TIMESTAMP_BETWEEN = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampBetween"; + public static final String FIND_BY_USER_AND_TIMESTAMP_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampAfter"; + public static final String FIND_BY_USER_AND_TIMESTAMP_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampBefore"; + public static final String FIND_BY_USER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUser"; + 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_USER_AND_TIMESTAMP_STRICTLY_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampStrictlyBefore"; + public static final String FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampStrictlyAfter"; + public static final String FIND_ACTIVE_SESSIONS = SessionLogEntry.LOGICAL_TYPE_NAME + ".findActiveSessions"; + public static final String FIND_RECENT_BY_USER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findRecentByUser"; + } + + 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 String sessionId, + final String username, + final SessionLogService.CausedBy causedBy, + final Timestamp loginTimestamp) { + setSessionId(sessionId); + 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( + domainEvent = SessionId.DomainEvent.class, + editing = Editing.DISABLED, + maxLength = SessionId.MAX_LENGTH + ) + @PropertyLayout( + fieldSetId="identity", + hidden = Where.PARENTED_TABLES, + sequence = "1" + ) + @Parameter( + maxLength = SessionId.MAX_LENGTH + ) + @ParameterLayout( + named = "Session Id" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface SessionId { + int MAX_LENGTH = 15; + + class DomainEvent extends PropertyDomainEvent {} + } + @SessionId + public abstract String getSessionId(); + public abstract void setSessionId(String sessionId); + + + + @Property( + domainEvent = Username.DomainEvent.class, + editing = Editing.DISABLED, + maxLength = Username.MAX_LENGTH + ) + @PropertyLayout( + fieldSetId="Identity", + hidden = Where.PARENTED_TABLES, + sequence = "2" + ) + @Parameter( + maxLength = Username.MAX_LENGTH + ) + @ParameterLayout( + named = "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 {} + } + @Username + public abstract String getUsername(); + public abstract void setUsername(String username); + + + + @Property( + domainEvent = LoginTimestamp.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + fieldSetId="Identity", + hidden = Where.PARENTED_TABLES, + sequence = "3" + ) + @ParameterLayout( + named = "Login timestamp" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface LoginTimestamp { + class DomainEvent extends PropertyDomainEvent {} + } + @LoginTimestamp + public abstract Timestamp getLoginTimestamp(); + public abstract void setLoginTimestamp(Timestamp loginTimestamp); + + + + + @Property( + domainEvent = LogoutTimestamp.DomainEvent.class, + editing = Editing.DISABLED, + optionality = Optionality.OPTIONAL + ) + @PropertyLayout( + fieldSetId="Identity", + hidden = Where.PARENTED_TABLES, + sequence = "3" + ) + @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 {} + } + @LogoutTimestamp + public abstract Timestamp getLogoutTimestamp(); + public abstract void setLogoutTimestamp(Timestamp logoutTimestamp); + + + + @Property( + domainEvent = CausedBy.DomainEvent.class, + editing = Editing.DISABLED + ) + @PropertyLayout( + fieldSetId="Details", + sequence = "1" + ) + @ParameterLayout( + named = "Caused by" + ) + @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface CausedBy { + class DomainEvent extends PropertyDomainEvent {} + + } + + @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.findByUserAndStrictlyAfter(getUsername(), getLoginTimestamp()); + return !after.isEmpty() ? after.get(0) : SessionLogEntry.this; + } + + @MemberSupport public String disableNext() { + val next = factoryService.mixin(next.class, SessionLogEntry.this); + return next.act() == SessionLogEntry.this ? "None after": null; + } + + @Inject FactoryService factoryService; + } + + + + @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.findByUserAndStrictlyBefore(getUsername(), getLoginTimestamp()); + return !before.isEmpty() ? before.get(0) : SessionLogEntry.this; + } + + @MemberSupport public String disablePrevious() { + val previous = factoryService.mixin(previous.class, SessionLogEntry.this); + return previous.act() == SessionLogEntry.this ? "None before": null; + } + + @Inject FactoryService factoryService; + } + + + + private static final ObjectContracts.ObjectContract contract = + ObjectContracts.contract(SessionLogEntry.class) + .thenUse("loginTimestamp", SessionLogEntry::getLoginTimestamp) + .thenUse("username", SessionLogEntry::getUsername) + .thenUse("sessionId", SessionLogEntry::getSessionId) + .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); + } + + + @Inject SessionLogEntryRepository sessionLogEntryRepository; + +} diff --git a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.layout.fallback.xml b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.layout.fallback.xml similarity index 82% rename from extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.layout.fallback.xml rename to extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.layout.fallback.xml index 92cbd65e726..c521f6f0368 100644 --- a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/dom/SessionLogEntry.layout.fallback.xml +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntry.layout.fallback.xml @@ -1,5 +1,9 @@ - + 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..d8b64a79033 --- /dev/null +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/dom/SessionLogEntryRepository.java @@ -0,0 +1,174 @@ +package org.apache.isis.sessionlog.applib.dom; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Optional; + +import javax.inject.Inject; + +import org.joda.time.LocalDate; +import org.springframework.stereotype.Service; + +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 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 String sessionId, + final SessionLogService.CausedBy causedBy, + final Timestamp timestamp) { + E entry = factoryService.detachedEntity(sessionLogEntryClass); + entry.setUsername(username); + entry.setSessionId(sessionId); + entry.setCausedBy(causedBy); + entry.setLoginTimestamp(timestamp); + return repositoryService.persistAndFlush(entry); + } + + public Optional findBySessionId(final String sessionId) { + return repositoryService.firstMatch( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_SESSION_ID) + .withParameter("sessionId", sessionId)); + } + + + public List findByUser(final String username) { + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, "findByUsername") + .withParameter("username", username)); + } + + + public List findByUserAndFromAndTo( + final String user, + 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_USER_AND_TIMESTAMP_BETWEEN) + .withParameter("user", user) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_AFTER) + .withParameter("user", user) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BEFORE) + .withParameter("user", user) + .withParameter("to", toTs); + } else { + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USER) + .withParameter("user", user); + } + } + 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 findByUserAndStrictlyBefore( + final String user, + final Timestamp from) { + + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_BEFORE) + .withParameter("user", user) + .withParameter("from", from)); + } + + + public List findByUserAndStrictlyAfter( + final String user, + final Timestamp from) { + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER) + .withParameter("user", user) + .withParameter("from", from)); + } + + + + public List findActiveSessions() { + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS)); + } + + + + public List findRecentByUser(final String user) { + return repositoryService.allMatches( + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_RECENT_BY_USER) + .withParameter("user", user)); + + } + + 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/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/spiimpl/SessionLoggingServiceDefault.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLoggingServiceDefault.java similarity index 80% rename from extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/spiimpl/SessionLoggingServiceDefault.java rename to extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLoggingServiceDefault.java index 59fa08dfce5..6f8710e7709 100644 --- a/extensions/security/sessionlog/persistence-jdo/src/main/java/org/apache/isis/sessionlog/jdo/spiimpl/SessionLoggingServiceDefault.java +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLoggingServiceDefault.java @@ -1,20 +1,19 @@ -package org.apache.isis.sessionlog.jdo.spiimpl; +package org.apache.isis.sessionlog.applib.spiimpl; -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.clock.ClockService; -import org.apache.isis.applib.services.session.SessionLogService; -import org.apache.isis.sessionlog.jdo.dom.SessionLogEntry; -import org.apache.isis.sessionlog.jdo.dom.SessionLogEntryRepository; +import java.util.Date; +import java.util.Optional; import javax.annotation.PostConstruct; import javax.inject.Inject; -import java.sql.Timestamp; -import java.util.Date; import org.springframework.stereotype.Service; +import org.apache.isis.applib.annotation.Programmatic; +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; @@ -43,7 +42,8 @@ public void log(final Type type, final String username, final Date date, final C if (type == Type.LOGIN) { sessionLogEntryRepository.create(username, sessionId, causedBy, timestamp); } else { - sessionLogEntryRepository.findBySessionId(sessionId) + Optional sessionLogEntryIfAny = sessionLogEntryRepository.findBySessionId(sessionId); + sessionLogEntryIfAny .ifPresent(entry -> { entry.setLogoutTimestamp(timestamp); entry.setCausedBy(causedBy); 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 index cf973698145..8245cd34756 100644 --- 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 @@ -5,6 +5,7 @@ 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.fixturescripts.FixtureScript; import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures; import org.apache.isis.testing.fixtures.applib.teardown.jdo.TeardownFixtureJdoAbstract; @@ -12,7 +13,9 @@ @Configuration @Import({ - IsisModuleExtSessionLogApplib.class + IsisModuleExtSessionLogApplib.class, + + SessionLogEntryRepository.class }) public class IsisModuleExtSessionLogPersistenceJdo implements ModuleWithFixtures { 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 index b94397c6f69..7464eff1900 100644 --- 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 @@ -134,334 +134,87 @@ logicalTypeName = SessionLogEntry.LOGICAL_TYPE_NAME, editing = Editing.DISABLED ) -public class SessionLogEntry implements HasUsername, Comparable { +public class SessionLogEntry extends org.apache.isis.sessionlog.applib.dom.SessionLogEntry { - public static final String LOGICAL_TYPE_NAME = IsisModuleExtSessionLogApplib.NAMESPACE + ".SessionLogEntry"; public static final String FQCN = "org.apache.isis.sessionlog.jdo.dom.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_ID = SessionLogEntry.LOGICAL_TYPE_NAME + ".findBySessionId"; - public static final String FIND_BY_USER_AND_TIMESTAMP_BETWEEN = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampBetween"; - public static final String FIND_BY_USER_AND_TIMESTAMP_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampAfter"; - public static final String FIND_BY_USER_AND_TIMESTAMP_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampBefore"; - public static final String FIND_BY_USER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUser"; - 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_USER_AND_TIMESTAMP_STRICTLY_BEFORE = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampStrictlyBefore"; - public static final String FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findByUserAndTimestampStrictlyAfter"; - public static final String FIND_ACTIVE_SESSIONS = SessionLogEntry.LOGICAL_TYPE_NAME + ".findActiveSessions"; - public static final String FIND_RECENT_BY_USER = SessionLogEntry.LOGICAL_TYPE_NAME + ".findRecentByUser"; - } - - public static abstract class PropertyDomainEvent extends IsisModuleExtSessionLogApplib.PropertyDomainEvent { } - - public static abstract class CollectionDomainEvent extends IsisModuleExtSessionLogApplib.CollectionDomainEvent { } - - public static abstract class ActionDomainEvent extends IsisModuleExtSessionLogApplib.ActionDomainEvent { } public SessionLogEntry( final String sessionId, final String username, final SessionLogService.CausedBy causedBy, final Timestamp loginTimestamp) { - this.sessionId = sessionId; - this.username = username; - this.causedBy = causedBy; - this.loginTimestamp = loginTimestamp; + super(sessionId, username, causedBy, 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( - domainEvent = SessionId.DomainEvent.class, - editing = Editing.DISABLED, - maxLength = SessionId.MAX_LENGTH - ) - @PropertyLayout( - fieldSetId="identity", - hidden = Where.PARENTED_TABLES, - sequence = "1" - ) - @Parameter( - maxLength = SessionId.MAX_LENGTH - ) - @ParameterLayout( - named = "Session Id" - ) - @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) - @Retention(RetentionPolicy.RUNTIME) - public @interface SessionId { - int MAX_LENGTH = 15; - - class DomainEvent extends PropertyDomainEvent {} - } - @PrimaryKey @Column(allowsNull="false", length=15) private String sessionId; - + @Override @SessionId public String getSessionId() { return sessionId; } + @Override public void setSessionId(String sessionId) { this.sessionId = sessionId; } - - - @Property( - domainEvent = Username.DomainEvent.class, - editing = Editing.DISABLED, - maxLength = Username.MAX_LENGTH - ) - @PropertyLayout( - fieldSetId="Identity", - hidden = Where.PARENTED_TABLES, - sequence = "2" - ) - @Parameter( - maxLength = Username.MAX_LENGTH - ) - @ParameterLayout( - named = "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 {} - } - @Column(allowsNull = "false", length = Username.MAX_LENGTH) private String username; - + @Override @Username public String getUsername() { return username; } + @Override public void setUsername(String username) { this.username = username; } - - @Property( - domainEvent = LoginTimestamp.DomainEvent.class, - editing = Editing.DISABLED - ) - @PropertyLayout( - fieldSetId="Identity", - hidden = Where.PARENTED_TABLES, - sequence = "3" - ) - @ParameterLayout( - named = "Login timestamp" - ) - @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) - @Retention(RetentionPolicy.RUNTIME) - public @interface LoginTimestamp { - class DomainEvent extends PropertyDomainEvent {} - } - @Column(allowsNull="false") private Timestamp loginTimestamp; - + @Override @LoginTimestamp public Timestamp getLoginTimestamp() { return loginTimestamp; } - + @Override public void setLoginTimestamp(Timestamp loginTimestamp) { this.loginTimestamp = loginTimestamp; } - @Property( - domainEvent = LogoutTimestamp.DomainEvent.class, - editing = Editing.DISABLED, - optionality = Optionality.OPTIONAL - ) - @PropertyLayout( - fieldSetId="Identity", - hidden = Where.PARENTED_TABLES, - sequence = "3" - ) - @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 {} - } - - @Column(allowsNull="true") private Timestamp logoutTimestamp; - + @Override @LogoutTimestamp public Timestamp getLogoutTimestamp() { return logoutTimestamp; } - + @Override public void setLogoutTimestamp(Timestamp logoutTimestamp) { this.logoutTimestamp = logoutTimestamp; } - - - @Property( - domainEvent = CausedBy.DomainEvent.class, - editing = Editing.DISABLED - ) - @PropertyLayout( - fieldSetId="Details", - sequence = "1" - ) - @ParameterLayout( - named = "Caused by" - ) - @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) - @Retention(RetentionPolicy.RUNTIME) - public @interface CausedBy { - class DomainEvent extends PropertyDomainEvent {} - - } - @Column(allowsNull = "false") private SessionLogService.CausedBy causedBy; - + @Override @CausedBy public SessionLogService.CausedBy getCausedBy() { return causedBy; } - + @Override public void setCausedBy(SessionLogService.CausedBy causedBy) { this.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.findByUserAndStrictlyAfter(getUsername(), getLoginTimestamp()); - return !after.isEmpty() ? after.get(0) : SessionLogEntry.this; - } - - @MemberSupport public String disableNext() { - val next = factoryService.mixin(next.class, SessionLogEntry.this); - return next.act() == SessionLogEntry.this ? "None after": null; - } - - @Inject FactoryService factoryService; - } - - - - @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.findByUserAndStrictlyBefore(getUsername(), getLoginTimestamp()); - return !before.isEmpty() ? before.get(0) : SessionLogEntry.this; - } - - @MemberSupport public String disablePrevious() { - val previous = factoryService.mixin(previous.class, SessionLogEntry.this); - return previous.act() == SessionLogEntry.this ? "None before": null; - } - - @Inject FactoryService factoryService; - } - - - - private static final ObjectContracts.ObjectContract contract = - ObjectContracts.contract(SessionLogEntry.class) - .thenUse("loginTimestamp", SessionLogEntry::getLoginTimestamp) - .thenUse("username", SessionLogEntry::getUsername) - .thenUse("sessionId", SessionLogEntry::getSessionId) - .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); - } - - - @Inject SessionLogEntryRepository sessionLogEntryRepository; - } 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 index 6b5078507c5..163fa416274 100644 --- 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 @@ -1,163 +1,17 @@ package org.apache.isis.sessionlog.jdo.dom; import java.sql.Timestamp; -import java.util.List; -import java.util.Optional; -import javax.inject.Inject; - -import org.joda.time.LocalDate; import org.springframework.stereotype.Service; -import org.apache.isis.applib.query.Query; -import org.apache.isis.applib.services.repository.RepositoryService; import org.apache.isis.applib.services.session.SessionLogService; -import lombok.RequiredArgsConstructor; -import lombok.val; +import lombok.NonNull; -/** - * Provides supporting functionality for querying {@link SessionLogEntry session log entry} entities. - */ @Service -@RequiredArgsConstructor(onConstructor_ = {@Inject}) -public class SessionLogEntryRepository { - - final RepositoryService repositoryService; - - public void logoutAllSessions(final Timestamp logoutTimestamp) { - - val allSessions = repositoryService.allMatches( - Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS)); - for (val activeEntry : allSessions) { - activeEntry.setCausedBy(SessionLogService.CausedBy.RESTART); - activeEntry.setLogoutTimestamp(logoutTimestamp); - } - } - - public SessionLogEntry create( - final String username, - final String sessionId, - final SessionLogService.CausedBy causedBy, - final Timestamp timestamp) { - return repositoryService.persistAndFlush(new SessionLogEntry(sessionId, username, causedBy, timestamp)); - } - - public Optional findBySessionId(final String sessionId) { - return repositoryService.firstMatch( - Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_SESSION_ID) - .withParameter("sessionId", sessionId)); - } - +public class SessionLogEntryRepository extends org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository { - public List findByUser(final String username) { - return repositoryService.allMatches( - Query.named(SessionLogEntry.class, "findByUsername") - .withParameter("username", username)); + public SessionLogEntryRepository() { + super(SessionLogEntry.class); } - - - public List findByUserAndFromAndTo( - final String user, - 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(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BETWEEN) - .withParameter("user", user) - .withParameter("from", fromTs) - .withParameter("to", toTs); - } else { - query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_AFTER) - .withParameter("user", user) - .withParameter("from", fromTs); - } - } else { - if(to != null) { - query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BEFORE) - .withParameter("user", user) - .withParameter("to", toTs); - } else { - query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER) - .withParameter("user", user); - } - } - 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(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BETWEEN) - .withParameter("from", fromTs) - .withParameter("to", toTs); - } else { - query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_AFTER) - .withParameter("from", fromTs); - } - } else { - if(to != null) { - query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BEFORE) - .withParameter("to", toTs); - } else { - query = Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND); - } - } - return repositoryService.allMatches(query); - } - - - public List findByUserAndStrictlyBefore( - final String user, - final Timestamp from) { - - return repositoryService.allMatches( - Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_BEFORE) - .withParameter("user", user) - .withParameter("from", from)); - } - - - public List findByUserAndStrictlyAfter( - final String user, - final Timestamp from) { - return repositoryService.allMatches( - Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER) - .withParameter("user", user) - .withParameter("from", from)); - } - - - - public List findActiveSessions() { - return repositoryService.allMatches( - Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS)); - } - - - - public List findRecentByUser(final String user) { - return repositoryService.allMatches( - Query.named(SessionLogEntry.class, SessionLogEntry.Nq.FIND_RECENT_BY_USER) - .withParameter("user", user)); - - } - - private static Timestamp toTimestampStartOfDayWithOffset(final LocalDate dt, final int daysOffset) { - return dt!=null - ?new Timestamp(dt.toDateTimeAtStartOfDay().plusDays(daysOffset).getMillis()) - :null; - } - } From f33eb013a3046b32a58e31efa3e64b0584d60dca Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Tue, 24 May 2022 15:42:16 +0100 Subject: [PATCH 16/43] ISIS-3062: adds JPA impl of sessionlog --- .../secman/jdo/user/dom/ApplicationUser.java | 24 +- extensions/security/sessionlog/applib/pom.xml | 11 +- .../sessionlog/applib/app/SessionLogMenu.java | 2 +- .../HasUsername_recentSessionsForUser.java | 2 +- .../applib/dom/SessionLogEntry.java | 24 +- .../applib/dom/SessionLogEntryRepository.java | 49 ++--- .../sessionlog/persistence-jdo/pom.xml | 2 +- .../sessionlog/jdo/dom/SessionLogEntry.java | 176 +++++++-------- .../persistence-jpa/log4j2-test.xml | 78 +++++++ .../sessionlog/persistence-jpa/pom.xml | 69 ++++++ ...IsisModuleExtSessionLogPersistenceJpa.java | 32 +++ .../sessionlog/jpa/dom/SessionLogEntry.java | 207 ++++++++++++++++++ .../jpa/dom/SessionLogEntryRepository.java | 17 ++ extensions/security/sessionlog/pom.xml | 6 +- 14 files changed, 534 insertions(+), 165 deletions(-) create mode 100644 extensions/security/sessionlog/persistence-jpa/log4j2-test.xml create mode 100644 extensions/security/sessionlog/persistence-jpa/pom.xml create mode 100644 extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/IsisModuleExtSessionLogPersistenceJpa.java create mode 100644 extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntry.java create mode 100644 extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntryRepository.java 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 762bca0de3c..13bf0d69be3 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 @@ -63,27 +63,27 @@ @Query( name = Nq.FIND_BY_USERNAME, value = "SELECT " - + "FROM " + ApplicationUser.FQCN - + " WHERE username == :username"), + + " FROM " + ApplicationUser.FQCN + + " WHERE username == :username"), @Query( name = Nq.FIND_BY_EMAIL_ADDRESS, value = "SELECT " - + "FROM " + ApplicationUser.FQCN - + " WHERE emailAddress == :emailAddress"), + + " FROM " + ApplicationUser.FQCN + + " WHERE emailAddress == :emailAddress"), @Query( name = Nq.FIND_BY_ATPATH, value = "SELECT " - + "FROM " + ApplicationUser.FQCN - + " WHERE atPath == :atPath"), + + " FROM " + ApplicationUser.FQCN + + " WHERE atPath == :atPath"), @Query( 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) diff --git a/extensions/security/sessionlog/applib/pom.xml b/extensions/security/sessionlog/applib/pom.xml index 22fc7ee9984..5a49ea61124 100644 --- a/extensions/security/sessionlog/applib/pom.xml +++ b/extensions/security/sessionlog/applib/pom.xml @@ -37,11 +37,6 @@ - - org.apache.isis.persistence - isis-persistence-jdo-datanucleus - - org.apache.isis.core isis-core-runtime @@ -51,6 +46,12 @@ org.apache.isis.testing isis-testing-fixtures-applib + + + org.apache.isis.persistence + isis-persistence-jdo-applib + + 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 index 002512a5c95..b9a18a071c6 100644 --- 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 @@ -71,7 +71,7 @@ public List act( if(user == null) { return sessionLogEntryRepository.findByFromAndTo(from, to); } else { - return sessionLogEntryRepository.findByUserAndFromAndTo(user, from, to); + return sessionLogEntryRepository.findByUsernameAndFromAndTo(user, from, to); } } } 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 index 810ee105b8e..460945d1b30 100644 --- 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 @@ -36,7 +36,7 @@ public static class ActionDomainEvent if(hasUsername == null || hasUsername.getUsername() == null) { return Collections.emptyList(); } - return sessionLogEntryRepository.findRecentByUser(hasUsername.getUsername()); + return sessionLogEntryRepository.findRecentByUsername(hasUsername.getUsername()); } @MemberSupport public boolean hideAct() { return hasUsername == null || hasUsername.getUsername() == null; 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 index f158e3ab557..2717510cd62 100644 --- 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 @@ -9,12 +9,6 @@ import java.util.List; import javax.inject.Inject; -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.Action; import org.apache.isis.applib.annotation.ActionLayout; @@ -51,18 +45,18 @@ public abstract class SessionLogEntry implements HasUsername, Comparable extends IsisModuleExtSessionLogApplib.PropertyDomainEvent { } @@ -258,7 +252,7 @@ public class DomainEvent extends ActionDomainEvent { } @MemberSupport public SessionLogEntry act() { - final List after = sessionLogEntryRepository.findByUserAndStrictlyAfter(getUsername(), getLoginTimestamp()); + final List after = sessionLogEntryRepository.findByUsernameAndStrictlyAfter(getUsername(), getLoginTimestamp()); return !after.isEmpty() ? after.get(0) : SessionLogEntry.this; } @@ -286,7 +280,7 @@ public class DomainEvent extends ActionDomainEvent { } @MemberSupport public SessionLogEntry act() { - final List before = sessionLogEntryRepository.findByUserAndStrictlyBefore(getUsername(), getLoginTimestamp()); + final List before = sessionLogEntryRepository.findByUsernameAndStrictlyBefore(getUsername(), getLoginTimestamp()); return !before.isEmpty() ? before.get(0) : SessionLogEntry.this; } 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 index d8b64a79033..2798abbed96 100644 --- 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 @@ -7,7 +7,6 @@ import javax.inject.Inject; import org.joda.time.LocalDate; -import org.springframework.stereotype.Service; import org.apache.isis.applib.query.Query; import org.apache.isis.applib.services.factory.FactoryService; @@ -32,7 +31,6 @@ protected SessionLogEntryRepository(@NonNull Class sessionLogEntryClass) { } public void logoutAllSessions(final Timestamp logoutTimestamp) { - val allSessions = repositoryService.allMatches( Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS)); for (val activeEntry : allSessions) { @@ -61,15 +59,15 @@ public Optional findBySessionId(final String sessionId) { } - public List findByUser(final String username) { + public List findByUsername(final String username) { return repositoryService.allMatches( - Query.named(sessionLogEntryClass, "findByUsername") + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME) .withParameter("username", username)); } - public List findByUserAndFromAndTo( - final String user, + public List findByUsernameAndFromAndTo( + final String username, final LocalDate from, final LocalDate to) { val fromTs = toTimestampStartOfDayWithOffset(from, 0); @@ -78,23 +76,23 @@ public List findByUserAndFromAndTo( final Query query; if(from != null) { if(to != null) { - query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BETWEEN) - .withParameter("user", user) + 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_USER_AND_TIMESTAMP_AFTER) - .withParameter("user", user) + 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_USER_AND_TIMESTAMP_BEFORE) - .withParameter("user", user) + 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_USER) - .withParameter("user", user); + query = Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME) + .withParameter("username", username); } } return repositoryService.allMatches(query); @@ -129,23 +127,23 @@ public List findByFromAndTo( } - public List findByUserAndStrictlyBefore( - final String user, + public List findByUsernameAndStrictlyBefore( + final String username, final Timestamp from) { return repositoryService.allMatches( - Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_BEFORE) - .withParameter("user", user) + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_BEFORE) + .withParameter("username", username) .withParameter("from", from)); } - public List findByUserAndStrictlyAfter( - final String user, + public List findByUsernameAndStrictlyAfter( + final String username, final Timestamp from) { return repositoryService.allMatches( - Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER) - .withParameter("user", user) + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_STRICTLY_AFTER) + .withParameter("username", username) .withParameter("from", from)); } @@ -158,10 +156,11 @@ public List findActiveSessions() { - public List findRecentByUser(final String user) { + public List findRecentByUsername(final String username) { return repositoryService.allMatches( - Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_RECENT_BY_USER) - .withParameter("user", user)); + Query.named(sessionLogEntryClass, SessionLogEntry.Nq.FIND_RECENT_BY_USERNAME) + .withParameter("username", username) + .withLimit(10)); } diff --git a/extensions/security/sessionlog/persistence-jdo/pom.xml b/extensions/security/sessionlog/persistence-jdo/pom.xml index 28ebe5d1148..e3bb2844695 100644 --- a/extensions/security/sessionlog/persistence-jdo/pom.xml +++ b/extensions/security/sessionlog/persistence-jdo/pom.xml @@ -27,7 +27,7 @@ ../pom.xml - sis-extensions-sessionlog-persistence-jdo + isis-extensions-sessionlog-persistence-jdo Apache Isis Ext - Session Log Persistence (using JDO) 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 index 7464eff1900..9048dd1f4a1 100644 --- 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 @@ -1,14 +1,7 @@ package org.apache.isis.sessionlog.jdo.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 javax.inject.Inject; import javax.jdo.annotations.Column; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; @@ -16,29 +9,10 @@ import javax.jdo.annotations.Queries; import javax.jdo.annotations.Query; -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; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry.Nq; @PersistenceCapable( identityType=IdentityType.APPLICATION, @@ -46,89 +20,89 @@ table = SessionLogEntry.TABLE) @Queries( { @Query( - name= SessionLogEntry.Nq.FIND_BY_SESSION_ID, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE sessionId == :sessionId"), + name = Nq.FIND_BY_SESSION_ID, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE sessionId == :sessionId"), @Query( - name= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BETWEEN, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE user == :user " - + "&& loginTimestamp >= :from " - + "&& logoutTimestamp <= :to " - + "ORDER BY loginTimestamp DESC"), + 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= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_AFTER, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE user == :user " - + "&& loginTimestamp >= :from " - + "ORDER BY loginTimestamp DESC"), + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_AFTER, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " && loginTimestamp >= :from " + + " ORDER BY loginTimestamp DESC"), @Query( - name= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_BEFORE, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE user == :user " - + "&& loginTimestamp <= :from " - + "ORDER BY loginTimestamp DESC"), + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " && loginTimestamp <= :from " + + " ORDER BY loginTimestamp DESC"), @Query( - name= SessionLogEntry.Nq.FIND_BY_USER, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE user == :user " - + "ORDER BY loginTimestamp DESC"), + name = Nq.FIND_BY_USERNAME, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " ORDER BY loginTimestamp DESC"), @Query( - name= SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BETWEEN, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE loginTimestamp >= :from " - + "&& logoutTimestamp <= :to " - + "ORDER BY loginTimestamp DESC"), + name = Nq.FIND_BY_TIMESTAMP_BETWEEN, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE loginTimestamp >= :from " + + " && logoutTimestamp <= :to " + + " ORDER BY loginTimestamp DESC"), @Query( - name= SessionLogEntry.Nq.FIND_BY_TIMESTAMP_AFTER, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE loginTimestamp >= :from " - + "ORDER BY loginTimestamp DESC"), + name = Nq.FIND_BY_TIMESTAMP_AFTER, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE loginTimestamp >= :from " + + " ORDER BY loginTimestamp DESC"), @Query( - name= SessionLogEntry.Nq.FIND_BY_TIMESTAMP_BEFORE, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE loginTimestamp <= :to " - + "ORDER BY loginTimestamp DESC"), + name = Nq.FIND_BY_TIMESTAMP_BEFORE, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE loginTimestamp <= :to " + + " ORDER BY loginTimestamp DESC"), @Query( - name= SessionLogEntry.Nq.FIND, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "ORDER BY loginTimestamp DESC"), + name = Nq.FIND, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " ORDER BY loginTimestamp DESC"), @Query( - name= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_BEFORE, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE user == :user " - + "&& loginTimestamp < :from " - + "ORDER BY loginTimestamp DESC"), + 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= SessionLogEntry.Nq.FIND_BY_USER_AND_TIMESTAMP_STRICTLY_AFTER, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE user == :user " - + "&& loginTimestamp > :from " - + "ORDER BY loginTimestamp ASC"), + 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= SessionLogEntry.Nq.FIND_ACTIVE_SESSIONS, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE logoutTimestamp == null " - + "ORDER BY loginTimestamp ASC"), + name = Nq.FIND_ACTIVE_SESSIONS, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE logoutTimestamp == null " + + " ORDER BY loginTimestamp ASC"), @Query( - name= SessionLogEntry.Nq.FIND_RECENT_BY_USER, - value="SELECT " - + "FROM " + SessionLogEntry.FQCN + " " - + "WHERE user == :user " - + "ORDER BY loginTimestamp DESC " - + "RANGE 0,10") + name = Nq.FIND_RECENT_BY_USERNAME, + value = "SELECT " + + " FROM " + SessionLogEntry.FQCN + " " + + " WHERE username == :username " + + " ORDER BY loginTimestamp DESC " + + " RANGE 0,10") }) @DomainObject( logicalTypeName = SessionLogEntry.LOGICAL_TYPE_NAME, @@ -148,7 +122,7 @@ public SessionLogEntry( @PrimaryKey - @Column(allowsNull="false", length=15) + @Column(allowsNull = "false", length=15) private String sessionId; @Override @SessionId @@ -176,7 +150,7 @@ public void setUsername(String username) { - @Column(allowsNull="false") + @Column(allowsNull = "false") private Timestamp loginTimestamp; @Override @LoginTimestamp @@ -190,7 +164,7 @@ public void setLoginTimestamp(Timestamp loginTimestamp) { - @Column(allowsNull="true") + @Column(allowsNull = "true") private Timestamp logoutTimestamp; @Override @LogoutTimestamp 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..ce809887301 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/pom.xml @@ -0,0 +1,69 @@ + + + + 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.core + isis-core-runtime + provided + + + + org.apache.isis.testing + isis-testing-fixtures-applib + + + org.apache.isis.persistence + isis-persistence-jdo-applib + + + + + + + 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..7a10a1c2c1b --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/IsisModuleExtSessionLogPersistenceJpa.java @@ -0,0 +1,32 @@ +package org.apache.isis.sessionlog.jpa; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +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.fixturescripts.FixtureScript; +import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixtures; +import org.apache.isis.testing.fixtures.applib.teardown.jdo.TeardownFixtureJdoAbstract; + + +@Configuration +@Import({ + IsisModuleExtSessionLogApplib.class, + + SessionLogEntryRepository.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..ccc898d2479 --- /dev/null +++ b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/sessionlog/jpa/dom/SessionLogEntry.java @@ -0,0 +1,207 @@ +package org.apache.isis.sessionlog.jpa.dom; + +import java.sql.Timestamp; + +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.eclipse.persistence.annotations.PrimaryKey; +import org.springframework.data.jpa.repository.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.persistence.jpa.applib.integration.IsisEntityListener; +import org.apache.isis.sessionlog.applib.dom.SessionLogEntry.Nq; + +import lombok.NoArgsConstructor; + +@Entity +@Table( + schema = SessionLogEntry.SCHEMA, + name = SessionLogEntry.TABLE) + +@NamedQueries( { + @NamedQuery( + name = Nq.FIND_BY_SESSION_ID, + query = "SELECT e " + + " FROM SessionLogEntry e " + + " WHERE e.sessionId = :sessionId"), + @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 == 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) +@DomainObject( + logicalTypeName = SessionLogEntry.LOGICAL_TYPE_NAME, + editing = Editing.DISABLED +) +public class SessionLogEntry extends org.apache.isis.sessionlog.applib.dom.SessionLogEntry { + + + public SessionLogEntry( + final String sessionId, + final String username, + final SessionLogService.CausedBy causedBy, + final Timestamp loginTimestamp) { + super(sessionId, username, causedBy, loginTimestamp); + } + + public SessionLogEntry() { + super(null, null, null, null); + } + + + @Id + @Column(nullable = false, length=15) + private String sessionId; + + @Override + @SessionId + public String getSessionId() { + return sessionId; + } + @Override + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + + + @Column(nullable = false, length = Username.MAX_LENGTH) + private String username; + @Override + @Username + public String getUsername() { + return username; + } + @Override + public void setUsername(String username) { + this.username = username; + } + + + + @Column(nullable = false) + private Timestamp loginTimestamp; + @Override + @LoginTimestamp + public Timestamp getLoginTimestamp() { + return loginTimestamp; + } + @Override + public void setLoginTimestamp(Timestamp loginTimestamp) { + this.loginTimestamp = loginTimestamp; + } + + + + @Column(nullable = true) + private Timestamp logoutTimestamp; + @Override + @LogoutTimestamp + public Timestamp getLogoutTimestamp() { + return logoutTimestamp; + } + @Override + public void setLogoutTimestamp(Timestamp logoutTimestamp) { + this.logoutTimestamp = logoutTimestamp; + } + + + + @Column(nullable = false) + private SessionLogService.CausedBy causedBy; + @Override + @CausedBy + public SessionLogService.CausedBy getCausedBy() { + return causedBy; + } + @Override + public void setCausedBy(SessionLogService.CausedBy causedBy) { + this.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/pom.xml b/extensions/security/sessionlog/pom.xml index 8ba18f30f76..21f78a86b01 100644 --- a/extensions/security/sessionlog/pom.xml +++ b/extensions/security/sessionlog/pom.xml @@ -47,13 +47,13 @@ org.apache.isis.extensions - sis-extensions-sessionlog-persistence-jpa + isis-extensions-sessionlog-persistence-jpa 2.0.0-SNAPSHOT org.apache.isis.extensions - sis-extensions-sessionlog-persistence-jdo + isis-extensions-sessionlog-persistence-jdo 2.0.0-SNAPSHOT @@ -80,8 +80,6 @@ applib persistence-jdo - From fcd54441ca2c6b6ba850d98489a0ff3e158ab3d2 Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Wed, 25 May 2022 15:11:54 +0100 Subject: [PATCH 17/43] ISIS-3062: adds in SessionLogEntry and splits out Command for jdo/jpa. Also minor clean up of secman entities. Also, different approach to derive sessionId for SessionLogService --- .../applib/mixins/security/HasUsername.java | 28 + .../mixins/system/DomainChangeRecord.java | 157 +++- .../mixins/system/HasInteractionId.java | 36 + .../mixins/system/HasTransactionId.java | 22 +- .../applib/services/bookmark/HasTarget.java | 56 ++ .../isis/applib/services/command/Command.java | 2 +- .../services/commanddto/HasCommandDto.java | 25 +- .../IsisModuleCoreRuntimeServices.java | 2 + .../session/InteractionIdGenerator.java | 14 + .../session/InteractionServiceDefault.java | 9 +- .../_commands/ExposePersistedCommands.java | 1 - .../ExposePersistedCommands_commands.java | 5 +- extensions/core/commandlog/applib/pom.xml | 4 - .../applib/IsisModuleExtCommandLogApplib.java | 11 +- .../applib/app/CommandLogServiceMenu.java | 147 ++++ .../commandlog/applib/command/CommandLog.java | 477 ----------- .../applib/command/ICommandLog.java | 88 -- .../applib/command/ICommandLogRepository.java | 150 ---- .../command/ui/CommandLogServiceMenu.java | 140 ---- .../HasInteractionId_command.java | 20 +- .../HasUsername_recentCommandsByUser.java | 18 +- .../applib/contributions/Object_recent.java} | 33 +- .../contributions}/Object_recentCommands.java | 12 +- .../applib/dom/CommandLogEntry.java | 763 ++++++++++++++++++ .../CommandLogEntry.layout.fallback.xml} | 0 .../CommandLogEntry.png} | Bin .../applib/dom/CommandLogEntryRepository.java | 376 +++++++++ .../applib/{command => dom}/ReplayState.java | 2 +- .../CommandLogEntry_childCommands.java} | 21 +- .../CommandLogEntry_openResultObject.java} | 16 +- .../CommandLogEntry_openTargetObject.java} | 16 +- .../mixins/CommandLogEntry_retry.java} | 28 +- .../CommandLogEntry_siblingCommands.java} | 24 +- .../CommandSubscriberForCommandLog.java | 21 +- .../applib/util/BigDecimalUtils.java | 23 - .../commandlog/applib/util/StringUtils.java | 18 - .../util/StringUtils_trimmed_Test.java | 6 +- .../jdo/IsisModuleExtCommandLogJdo.java | 27 +- .../commandlog/jdo/dom/CommandLogEntry.java | 312 +++++++ .../jdo/dom/CommandLogEntryRepository.java | 46 ++ .../commandlog/jdo/entities/CommandJdo.java | 317 -------- .../jdo/entities/CommandJdoRepository.java | 326 -------- .../jpa/IsisModuleExtCommandLogJpa.java | 26 +- .../commandlog/jpa/dom/CommandLogEntry.java | 299 +++++++ .../jpa/dom/CommandLogEntryRepository.java | 79 ++ .../commandlog/jpa/entities/CommandJpa.java | 283 ------- .../jpa/entities/CommandJpaRepository.java | 332 -------- .../CommandRetrievalOnPrimaryService.java | 12 +- .../spiimpl/CaptureResultOfCommand.java | 6 +- .../ui/CommandReplayOnPrimaryService.java | 18 +- .../analyser/CommandReplayAnalyser.java | 6 +- .../CommandReplayAnalyserException.java | 8 +- .../analyser/CommandReplayAnalyserResult.java | 8 +- .../CommandReplayAnalysisService.java | 12 +- .../secondary/fetch/CommandFetcher.java | 6 +- .../jobcallables/ReplicateAndRunCommands.java | 30 +- ....java => CommandLogEntry_replayQueue.java} | 18 +- .../secondary/mixins/CommandLog_exclude.java | 14 +- .../ui/CommandReplayOnSecondaryService.java | 12 +- .../applib/IsisModuleExtSecmanApplib.java | 13 + .../permission/dom/ApplicationPermission.java | 68 +- .../applib/role/dom/ApplicationRole.java | 38 +- .../tenancy/dom/ApplicationTenancy.java | 47 +- .../secman/applib/tenancy/dom/HasAtPath.java | 30 + .../applib/user/dom/ApplicationUser.java | 204 +++-- .../mixins/ApplicationUser_updateLocale.java | 27 +- .../permission/dom/ApplicationPermission.java | 79 +- .../secman/jdo/role/dom/ApplicationRole.java | 49 +- .../jdo/tenancy/dom/ApplicationTenancy.java | 61 +- .../secman/jdo/user/dom/ApplicationUser.java | 208 ++--- .../permission/dom/ApplicationPermission.java | 81 +- .../secman/jpa/role/dom/ApplicationRole.java | 48 +- .../jpa/tenancy/dom/ApplicationTenancy.java | 60 +- .../secman/jpa/user/dom/ApplicationUser.java | 213 ++--- .../applib/IsisModuleExtSessionLogApplib.java | 18 +- .../applib/dom/SessionLogEntry.java | 64 +- ...ult.java => SessionLogServiceDefault.java} | 3 +- .../sessionlog/jdo/dom/SessionLogEntry.java | 73 +- .../sessionlog/jpa/dom/SessionLogEntry.java | 75 +- .../AuthenticatedWebSessionForIsis.java | 29 +- 80 files changed, 3161 insertions(+), 3295 deletions(-) create mode 100644 api/applib/src/main/java/org/apache/isis/applib/services/bookmark/HasTarget.java create mode 100644 core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/session/InteractionIdGenerator.java create mode 100644 extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/app/CommandLogServiceMenu.java delete mode 100644 extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java delete mode 100644 extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java delete mode 100644 extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java delete mode 100644 extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java rename extensions/core/commandlog/{jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins => applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions}/HasInteractionId_command.java (80%) rename extensions/core/commandlog/{jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins => applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions}/HasUsername_recentCommandsByUser.java (76%) rename extensions/core/commandlog/{jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins/T_recent.java => applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions/Object_recent.java} (66%) rename extensions/core/commandlog/{jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/mixins => applib/src/main/java/org/apache/isis/extensions/commandlog/applib/contributions}/Object_recentCommands.java (87%) create mode 100644 extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntry.java rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command/CommandLog.layout.fallback.xml => dom/CommandLogEntry.layout.fallback.xml} (100%) rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command/CommandLog.png => dom/CommandLogEntry.png} (100%) create mode 100644 extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/dom/CommandLogEntryRepository.java rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command => dom}/ReplayState.java (95%) rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command/mixins/CommandLog_childCommands.java => dom/mixins/CommandLogEntry_childCommands.java} (68%) rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command/mixins/CommandLog_openResultObject.java => dom/mixins/CommandLogEntry_openResultObject.java} (79%) rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command/mixins/CommandLog_openTargetObject.java => dom/mixins/CommandLogEntry_openTargetObject.java} (79%) rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command/mixins/CommandLog_retry.java => dom/mixins/CommandLogEntry_retry.java} (76%) rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command/mixins/CommandLog_siblingCommands.java => dom/mixins/CommandLogEntry_siblingCommands.java} (66%) rename extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/{command => }/subscriber/CommandSubscriberForCommandLog.java (81%) rename extensions/core/commandlog/applib/src/test/java/org/apache/isis/extensions/commandlog/{model => applib}/util/StringUtils_trimmed_Test.java (91%) create mode 100644 extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java create mode 100644 extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntryRepository.java delete mode 100644 extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java delete mode 100644 extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java create mode 100644 extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java create mode 100644 extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryRepository.java delete mode 100644 extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java delete mode 100644 extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java rename extensions/core/commandreplay/secondary/src/main/java/org/apache/isis/extensions/commandreplay/secondary/mixins/{CommandLog_replayQueue.java => CommandLogEntry_replayQueue.java} (74%) rename extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/{SessionLoggingServiceDefault.java => SessionLogServiceDefault.java} (95%) 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..dc53d43993c 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,82 @@ 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(); + @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(); + + @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 +151,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 +182,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 +225,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 +252,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..7d51d28a7eb 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,15 @@ */ 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.services.iactn.Interaction; @@ -32,9 +39,38 @@ */ public interface HasInteractionId { + @Property( + editing = Editing.DISABLED, + 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/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/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/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/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..f1492260ef1 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,6 @@ import org.apache.isis.applib.annotation.PriorityPrecedence; import org.apache.isis.applib.services.tablecol.TableColumnOrderForCollectionTypeAbstract; -import org.apache.isis.extensions.commandlog.applib.command.ICommandLog; /** * Marker interface for mixins to contribute to. 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..6c856b53512 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,7 @@ 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.CommandLogEntryRepository; import lombok.RequiredArgsConstructor; @@ -43,6 +42,6 @@ public List coll() { return commandModelRepository.findCompleted(); } - @Inject ICommandLogRepository commandModelRepository; + @Inject CommandLogEntryRepository commandModelRepository; } //end::class[] diff --git a/extensions/core/commandlog/applib/pom.xml b/extensions/core/commandlog/applib/pom.xml index 781127edbbb..714c146b543 100644 --- a/extensions/core/commandlog/applib/pom.xml +++ b/extensions/core/commandlog/applib/pom.xml @@ -66,10 +66,6 @@ isis-core-runtimeservices - - org.datanucleus - javax.jdo - diff --git a/extensions/core/commandlog/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 index 4fee06ff2f6..b83122a8f78 100644 --- a/extensions/core/commandlog/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 { } 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..82ab1765060 --- /dev/null +++ b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/app/CommandLogServiceMenu.java @@ -0,0 +1,147 @@ +/* + * 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/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/CommandLog.java deleted file mode 100644 index 2ed11557065..00000000000 --- a/extensions/core/commandlog/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.inject.Named; -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). - */ -@Named(CommandLog.LOGICAL_TYPE_NAME) -@DomainObject( - 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/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLog.java deleted file mode 100644 index 8a597512298..00000000000 --- a/extensions/core/commandlog/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/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ICommandLogRepository.java deleted file mode 100644 index 1f659ae88da..00000000000 --- a/extensions/core/commandlog/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/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java b/extensions/core/commandlog/applib/src/main/java/org/apache/isis/extensions/commandlog/applib/command/ui/CommandLogServiceMenu.java deleted file mode 100644 index 32a8183fcca..00000000000 --- a/extensions/core/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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..67bb903f57f --- /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.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.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). + */ +@DomainObject( + logicalTypeName = CommandLogEntry.LOGICAL_TYPE_NAME, + 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; + } + + + + @Property( + domainEvent = InteractionIdStr.DomainEvent.class + ) + @HasInteractionId.InteractionIdStr + @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) + @Retention(RetentionPolicy.RUNTIME) + public @interface InteractionIdStr { + int MAX_LENGTH = HasInteractionId.InteractionIdStr.MAX_LENGTH; + boolean NULLABLE = HasInteractionId.InteractionIdStr.NULLABLE; + String ALLOWS_NULL = HasInteractionId.InteractionIdStr.ALLOWS_NULL; + String NAME = HasInteractionId.InteractionIdStr.NAME; + class DomainEvent extends PropertyDomainEvent {} + } + @InteractionIdStr + public abstract String getInteractionIdStr(); + public abstract void setInteractionIdStr(String interactionIdStr); + + + + @Override + @DomainChangeRecord.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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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/commandlog/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 index 813227f862d..92263780838 100644 --- 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 @@ -1,32 +1,10 @@ -/* - * 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. */ @@ -46,5 +24,4 @@ private static BigDecimal toSeconds(long 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 index 21cb229b9ac..f6c80e61e8c 100644 --- 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 @@ -1,21 +1,3 @@ -/* - * 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; diff --git a/extensions/core/commandlog/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/commandlog/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/commandlog/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/commandlog/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 index ff0cf14343c..47812eae41e 100644 --- a/extensions/core/commandlog/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..34abfe50f60 --- /dev/null +++ b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/dom/CommandLogEntry.java @@ -0,0 +1,312 @@ +/* + * 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.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 +}) +@DomainObject( + logicalTypeName = CommandLogEntry.LOGICAL_TYPE_NAME, + 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/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdo.java deleted file mode 100644 index 7e5a80586e1..00000000000 --- a/extensions/core/commandlog/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.inject.Named; -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"), -@Named(CommandJdo.LOGICAL_TYPE_NAME) -@DomainObject( - 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/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java b/extensions/core/commandlog/jdo/src/main/java/org/apache/isis/extensions/commandlog/jdo/entities/CommandJdoRepository.java deleted file mode 100644 index 5096f51b678..00000000000 --- a/extensions/core/commandlog/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/commandlog/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 index 0abb185c9d0..1fdbd4ca7a2 100644 --- a/extensions/core/commandlog/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..5580d59f134 --- /dev/null +++ b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntry.java @@ -0,0 +1,299 @@ +/* + * 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.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 +}) +@DomainObject( + logicalTypeName = CommandLogEntry.LOGICAL_TYPE_NAME, + 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/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java deleted file mode 100644 index e728108a687..00000000000 --- a/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpa.java +++ /dev/null @@ -1,283 +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.inject.Named; -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"), - -@Named(CommandJpa.LOGICAL_TYPE_NAME) -@DomainObject( - 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/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java b/extensions/core/commandlog/jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/entities/CommandJpaRepository.java deleted file mode 100644 index 54cfc9a053e..00000000000 --- a/extensions/core/commandlog/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/commandreplay/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 index 209a354957c..a211ba96c4b 100644 --- a/extensions/core/commandreplay/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; @@ -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/commandreplay/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 index de0cba00c09..0eba355d109 100644 --- a/extensions/core/commandreplay/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/commandreplay/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 index 7071d1f8987..3fbda006a5e 100644 --- a/extensions/core/commandreplay/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; @@ -68,7 +67,7 @@ //@Log4j2 public class CommandReplayOnPrimaryService { - @Inject final ICommandLogRepository commandLogRepository; + @Inject final CommandLogEntryRepository commandLogEntryRepository; @Inject final JaxbService jaxbService; @Inject final MessageService messageService; @Inject final ContentMappingServiceForCommandsDto contentMappingServiceForCommandsDto; @@ -91,7 +90,7 @@ public class ActionEvent extends ActionDomainEvent { } * @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; @@ -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"; } - } @@ -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/commandreplay/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 index 3125d76972b..360cb73cc00 100644 --- a/extensions/core/commandreplay/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/commandreplay/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 index 10a467445ec..ba123061950 100644 --- a/extensions/core/commandreplay/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/commandreplay/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 index 992feb44cd3..b395bb16428 100644 --- a/extensions/core/commandreplay/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/commandreplay/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 index 6fee1e151fe..c37b7f2ba7d 100644 --- a/extensions/core/commandreplay/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/commandreplay/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 index 1281e3383e3..249a2456133 100644 --- a/extensions/core/commandreplay/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/commandreplay/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 index 654a8ad770d..0dec69a4a98 100644 --- a/extensions/core/commandreplay/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/commandreplay/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/commandreplay/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/commandreplay/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/commandreplay/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/CommandLog_exclude.java index 2c64253b85c..9aa95ec594b 100644 --- a/extensions/core/commandreplay/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/CommandLog_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; @@ -49,19 +49,19 @@ public class CommandLog_exclude { public static class 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/commandreplay/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 index 1a1ec34a263..56edcd76540 100644 --- a/extensions/core/commandreplay/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/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 09a71f96919..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 @@ -188,6 +188,19 @@ 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/permission/dom/ApplicationPermission.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/permission/dom/ApplicationPermission.java index 85417c31554..fbcaff029d8 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,11 +28,14 @@ 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; @@ -81,8 +84,15 @@ * * @since 2.0 {@index} */ -@Named(ApplicationPermission.LOGICAL_TYPE_NAME) -@DomainObject +@DomainObject( + logicalTypeName = ApplicationPermission.LOGICAL_TYPE_NAME +) +@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"; @@ -100,14 +110,19 @@ public static class Nq { } - @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() { @@ -150,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 @@ -172,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); @@ -193,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); @@ -227,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 @@ -243,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. @@ -284,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/role/dom/ApplicationRole.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/role/dom/ApplicationRole.java index 2f7d761792d..3263ad63b59 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,11 +27,11 @@ 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; @@ -53,8 +53,15 @@ /** * @since 2.0 {@index} */ -@Named(ApplicationRole.LOGICAL_TYPE_NAME) -@DomainObject +@DomainObject( + logicalTypeName = ApplicationRole.LOGICAL_TYPE_NAME +) +@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"; @@ -70,7 +77,12 @@ public static class Nq { @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 {} @@ -105,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); @@ -141,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); @@ -164,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(); @@ -184,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/tenancy/dom/ApplicationTenancy.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/tenancy/dom/ApplicationTenancy.java index c0a0934cab7..6fcc1d95002 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,10 +25,9 @@ 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; @@ -42,14 +41,23 @@ 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} */ -@Named(ApplicationTenancy.LOGICAL_TYPE_NAME) -@DomainObject +@DomainObject( + logicalTypeName = ApplicationTenancy.LOGICAL_TYPE_NAME +) +@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"; @@ -64,7 +72,12 @@ public static class Nq { } - // -- DOMAIN 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 {} @@ -100,12 +113,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); @@ -114,20 +127,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); @@ -148,17 +161,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( @@ -171,8 +188,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/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/user/dom/ApplicationUser.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java index e8987b9cd04..2870f749e65 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,16 +23,15 @@ 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; @@ -69,8 +68,15 @@ /** * @since 2.0 {@index} */ -@Named(ApplicationUser.LOGICAL_TYPE_NAME) -@DomainObject +@DomainObject( + logicalTypeName = ApplicationUser.LOGICAL_TYPE_NAME +) +@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 { @@ -86,6 +92,16 @@ public static class Nq { 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; @Inject private transient UserService userService; @@ -118,10 +134,6 @@ protected Secman getSecmanConfig() { } - // -- DOMAIN EVENTS - - public static abstract class PropertyDomainEvent extends IsisModuleExtSecmanApplib.PropertyDomainEvent {} - public static abstract class CollectionDomainEvent extends IsisModuleExtSecmanApplib.CollectionDomainEvent {} @@ -172,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(); @@ -224,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); @@ -257,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); @@ -290,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); @@ -305,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" @@ -320,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); @@ -351,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); @@ -384,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" @@ -407,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); + + + @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 = 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); - @UserLocale - public abstract Locale getTimeFormat(); - public abstract void setTimeFormat(Locale locale); - // -- AT PATH @Property( - domainEvent = AtPath.DomainEvent.class, - editing = Editing.DISABLED, - optionality = Optionality.OPTIONAL + 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); @@ -477,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); @@ -496,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); @@ -551,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/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/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 f81887816f2..a6f28b5afaf 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 @@ -43,6 +43,9 @@ 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 = ApplicationPermission.SCHEMA, @@ -110,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 - @Override - public ApplicationRole getRole() { - return role; - } + @Getter + private org.apache.isis.extensions.secman.jdo.role.dom.ApplicationRole role; @Override 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(final 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(final 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(final 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(final 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 994f1748e62..fe4317b24e0 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 @@ -42,6 +42,9 @@ import org.apache.isis.extensions.secman.applib.role.dom.ApplicationRole.Nq; import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; +import lombok.Getter; +import lombok.Setter; + @PersistenceCapable( identityType = IdentityType.DATASTORE, @@ -83,50 +86,24 @@ 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(final 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(final 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 - @Override - public SortedSet getUsers() { - return _Casts.uncheckedCast(users); - } + @Getter + private SortedSet users = new TreeSet<>(); // 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 100abe70c3e..2399da32b68 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 @@ -42,6 +42,10 @@ 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( @@ -90,66 +94,33 @@ 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(final 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(final 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 - @Override - public SortedSet getChildren() { - return _Casts.uncheckedCast(children); - } + @Getter + private SortedSet children = new TreeSet<>(); public void setChildren(final SortedSet children) { this.children = _Casts.uncheckedCast(children); } 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 13bf0d69be3..2f18d8f33f9 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,7 +18,6 @@ */ package org.apache.isis.extensions.secman.jdo.user.dom; -import java.util.Locale; import java.util.SortedSet; import java.util.TreeSet; @@ -42,8 +41,6 @@ import org.apache.isis.applib.annotation.BookmarkPolicy; 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; @@ -106,209 +103,102 @@ 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; - } - - - // -- FAX NUMBER + @Getter @Setter + private String phoneNumber; - @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; + private java.util.Locale numberFormat; - // -- AT PATH - @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 - @Override - public SortedSet getRoles() { - return _Casts.uncheckedCast(roles); - } - + @Getter + private SortedSet roles = new TreeSet<>(); } 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 ec8b028b31b..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 @@ -47,6 +47,9 @@ import static org.apache.isis.extensions.secman.applib.permission.dom.ApplicationPermission.*; +import lombok.Getter; +import lombok.Setter; + @Entity @Table( schema = ApplicationPermission.SCHEMA, @@ -115,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; - } - + @Getter @Setter + private ApplicationPermissionRule rule; - // -- MODE - - @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/role/dom/ApplicationRole.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/role/dom/ApplicationRole.java index b5df0cc196b..b0bd199553a 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 @@ -44,6 +44,9 @@ import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; +import lombok.Getter; +import lombok.Setter; + @Entity @Table( schema = ApplicationRole.SCHEMA, @@ -86,51 +89,24 @@ 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; - } - + @Getter @Setter + private String name; - // -- DESCRIPTION - - @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}) + @Getter private Set users = new TreeSet<>(); - - @Users - @Override - public Set getUsers() { - return _Casts.uncheckedCast(users); - } // necessary for integration tests - public void addToUsers(final ApplicationUser applicationUser) { + public void addToUsers(final org.apache.isis.extensions.secman.jpa.user.dom.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 fda4f6daa70..24922da25a3 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 @@ -40,6 +40,9 @@ 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( @@ -79,71 +82,38 @@ 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(final 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(final 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") - private Set children = new TreeSet<>(); - + @OneToMany(mappedBy = Children.MAPPED_BY) @Children - @Override - public Set getChildren() { - return _Casts.uncheckedCast(children); - } + @Getter + private Set children = new TreeSet<>(); public void setChildren(final Set children) { this.children = _Casts.uncheckedCast(children); } 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 87653ab78e8..35e1f4efead 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,7 +18,6 @@ */ package org.apache.isis.extensions.secman.jpa.user.dom; -import java.util.Locale; import java.util.Set; import java.util.TreeSet; @@ -43,8 +42,6 @@ import org.apache.isis.applib.annotation.BookmarkPolicy; 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.persistence.jpa.applib.integration.IsisEntityListener; @@ -98,222 +95,112 @@ 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; - } - + @Getter @Setter + private String givenName; - // -- KNOWN AS - - @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; - } - + @Getter @Setter + private String knownAs; - // -- EMAIL ADDRESS - - @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; - } - - - // -- FAX NUMBER + @Getter @Setter + private String phoneNumber; - @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; - } - + @Getter @Setter + private ApplicationUserStatus status; - // -- ENCRYPTED PASSWORD - - @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 - @Override - public Set getRoles() { - return _Casts.uncheckedCast(roles); - } + @Getter + private Set roles = new TreeSet<>(); } 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 index 08eb12c263b..f500daff8d6 100644 --- 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 @@ -4,8 +4,7 @@ import org.springframework.context.annotation.Import; import org.apache.isis.sessionlog.applib.app.SessionLogMenu; -import org.apache.isis.sessionlog.applib.dom.SessionLogEntryRepository; -import org.apache.isis.sessionlog.applib.spiimpl.SessionLoggingServiceDefault; +import org.apache.isis.sessionlog.applib.spiimpl.SessionLogServiceDefault; import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib; @@ -14,13 +13,26 @@ IsisModuleTestingFixturesApplib.class, SessionLogMenu.class, - SessionLoggingServiceDefault.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 {} 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 index 2717510cd62..db7e5a1cd73 100644 --- 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 @@ -13,6 +13,7 @@ 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; @@ -36,6 +37,12 @@ logicalTypeName = SessionLogEntry.LOGICAL_TYPE_NAME, 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"; @@ -59,6 +66,13 @@ public static class Nq { 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 { } @@ -108,7 +122,8 @@ public String iconName() { @Property( domainEvent = SessionId.DomainEvent.class, editing = Editing.DISABLED, - maxLength = SessionId.MAX_LENGTH + maxLength = SessionId.MAX_LENGTH, + optionality = Optionality.MANDATORY ) @PropertyLayout( fieldSetId="identity", @@ -116,17 +131,16 @@ public String iconName() { sequence = "1" ) @Parameter( - maxLength = SessionId.MAX_LENGTH - ) - @ParameterLayout( - named = "Session Id" + maxLength = SessionId.MAX_LENGTH, + optionality = Optionality.MANDATORY ) @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface SessionId { - int MAX_LENGTH = 15; - class DomainEvent extends PropertyDomainEvent {} + int MAX_LENGTH = 32; // to hold UUID.randomUuid().toString() + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } @SessionId public abstract String getSessionId(); @@ -135,27 +149,21 @@ class DomainEvent extends PropertyDomainEvent {} @Property( - domainEvent = Username.DomainEvent.class, - editing = Editing.DISABLED, - maxLength = Username.MAX_LENGTH + domainEvent = Username.DomainEvent.class ) @PropertyLayout( fieldSetId="Identity", hidden = Where.PARENTED_TABLES, sequence = "2" ) - @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; } @Username public abstract String getUsername(); @@ -165,13 +173,17 @@ class DomainEvent extends PropertyDomainEvent {} @Property( domainEvent = LoginTimestamp.DomainEvent.class, - editing = Editing.DISABLED + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY ) @PropertyLayout( fieldSetId="Identity", hidden = Where.PARENTED_TABLES, sequence = "3" ) + @Parameter( + optionality = Optionality.MANDATORY + ) @ParameterLayout( named = "Login timestamp" ) @@ -179,6 +191,8 @@ class DomainEvent extends PropertyDomainEvent {} @Retention(RetentionPolicy.RUNTIME) public @interface LoginTimestamp { class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = false; + String ALLOWS_NULL = "false"; } @LoginTimestamp public abstract Timestamp getLoginTimestamp(); @@ -207,6 +221,8 @@ class DomainEvent extends PropertyDomainEvent {} @Retention(RetentionPolicy.RUNTIME) public @interface LogoutTimestamp { class DomainEvent extends PropertyDomainEvent {} + boolean NULLABLE = true; + String ALLOWS_NULL = "true"; } @LogoutTimestamp public abstract Timestamp getLogoutTimestamp(); @@ -216,12 +232,16 @@ class DomainEvent extends PropertyDomainEvent {} @Property( domainEvent = CausedBy.DomainEvent.class, - editing = Editing.DISABLED + editing = Editing.DISABLED, + optionality = Optionality.MANDATORY ) @PropertyLayout( fieldSetId="Details", sequence = "1" ) + @Parameter( + optionality = Optionality.MANDATORY + ) @ParameterLayout( named = "Caused by" ) @@ -229,9 +249,9 @@ class DomainEvent extends PropertyDomainEvent {} @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); diff --git a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLoggingServiceDefault.java b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceDefault.java similarity index 95% rename from extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLoggingServiceDefault.java rename to extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceDefault.java index 6f8710e7709..79c753e5276 100644 --- a/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLoggingServiceDefault.java +++ b/extensions/security/sessionlog/applib/src/main/java/org/apache/isis/sessionlog/applib/spiimpl/SessionLogServiceDefault.java @@ -24,7 +24,7 @@ */ @Service @RequiredArgsConstructor(onConstructor_ = {@Inject}) -public class SessionLoggingServiceDefault implements SessionLogService { +public class SessionLogServiceDefault implements SessionLogService { final SessionLogEntryRepository sessionLogEntryRepository; final ClockService clockService; @@ -35,7 +35,6 @@ public void init() { sessionLogEntryRepository.logoutAllSessions(timestamp); } - @Programmatic @Override public void log(final Type type, final String username, final Date date, final CausedBy causedBy, final String sessionId) { val timestamp = clockService.getClock().nowAsJavaSqlTimestamp(); 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 index 9048dd1f4a1..11e31d0041e 100644 --- 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 @@ -11,9 +11,13 @@ import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.mixins.security.HasUsername; 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, @@ -122,73 +126,34 @@ public SessionLogEntry( @PrimaryKey - @Column(allowsNull = "false", length=15) - private String sessionId; - @Override + @Column(allowsNull = SessionId.ALLOWS_NULL, length = SessionId.MAX_LENGTH) @SessionId - public String getSessionId() { - return sessionId; - } - @Override - public void setSessionId(String sessionId) { - this.sessionId = sessionId; - } - + @Getter @Setter + private String sessionId; - @Column(allowsNull = "false", length = Username.MAX_LENGTH) - private String username; - @Override + @Column(allowsNull = Username.ALLOWS_NULL, length = Username.MAX_LENGTH) @Username - public String getUsername() { - return username; - } - @Override - public void setUsername(String username) { - this.username = username; - } - + @Getter @Setter + private String username; - @Column(allowsNull = "false") - private Timestamp loginTimestamp; - @Override + @Column(allowsNull = LoginTimestamp.ALLOWS_NULL) @LoginTimestamp - public Timestamp getLoginTimestamp() { - return loginTimestamp; - } - @Override - public void setLoginTimestamp(Timestamp loginTimestamp) { - this.loginTimestamp = loginTimestamp; - } - + @Getter @Setter + private Timestamp loginTimestamp; - @Column(allowsNull = "true") - private Timestamp logoutTimestamp; - @Override + @Column(allowsNull = LogoutTimestamp.ALLOWS_NULL) @LogoutTimestamp - public Timestamp getLogoutTimestamp() { - return logoutTimestamp; - } - @Override - public void setLogoutTimestamp(Timestamp logoutTimestamp) { - this.logoutTimestamp = logoutTimestamp; - } - + @Getter @Setter + private Timestamp logoutTimestamp; - @Column(allowsNull = "false") - private SessionLogService.CausedBy causedBy; - @Override + @Column(allowsNull = CausedBy.ALLOWS_NULL) @CausedBy - public SessionLogService.CausedBy getCausedBy() { - return causedBy; - } - @Override - public void setCausedBy(SessionLogService.CausedBy causedBy) { - this.causedBy = causedBy; - } + @Getter @Setter + private SessionLogService.CausedBy causedBy; } 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 index ccc898d2479..98e53650368 100644 --- 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 @@ -15,11 +15,14 @@ import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.Editing; +import org.apache.isis.applib.mixins.security.HasUsername; 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.NoArgsConstructor; +import lombok.Setter; @Entity @Table( @@ -102,7 +105,7 @@ name = Nq.FIND_ACTIVE_SESSIONS, query = "SELECT e" + " FROM SessionLogEntry e " - + " WHERE e.logoutTimestamp == null " + + " WHERE e.logoutTimestamp IS null " + " ORDER BY e.loginTimestamp ASC"), @NamedQuery( name = Nq.FIND_RECENT_BY_USERNAME, @@ -134,74 +137,34 @@ public SessionLogEntry() { @Id - @Column(nullable = false, length=15) - private String sessionId; - - @Override + @Column(nullable = SessionId.NULLABLE, length = SessionId.MAX_LENGTH) @SessionId - public String getSessionId() { - return sessionId; - } - @Override - public void setSessionId(String sessionId) { - this.sessionId = sessionId; - } - + @Getter @Setter + private String sessionId; - @Column(nullable = false, length = Username.MAX_LENGTH) - private String username; - @Override + @Column(nullable = Username.NULLABLE, length = Username.MAX_LENGTH) @Username - public String getUsername() { - return username; - } - @Override - public void setUsername(String username) { - this.username = username; - } - + @Getter @Setter + private String username; - @Column(nullable = false) - private Timestamp loginTimestamp; - @Override + @Column(nullable = LoginTimestamp.NULLABLE) @LoginTimestamp - public Timestamp getLoginTimestamp() { - return loginTimestamp; - } - @Override - public void setLoginTimestamp(Timestamp loginTimestamp) { - this.loginTimestamp = loginTimestamp; - } - + @Getter @Setter + private Timestamp loginTimestamp; - @Column(nullable = true) - private Timestamp logoutTimestamp; - @Override + @Column(nullable = LogoutTimestamp.NULLABLE) @LogoutTimestamp - public Timestamp getLogoutTimestamp() { - return logoutTimestamp; - } - @Override - public void setLogoutTimestamp(Timestamp logoutTimestamp) { - this.logoutTimestamp = logoutTimestamp; - } - + @Getter @Setter + private Timestamp logoutTimestamp; - @Column(nullable = false) - private SessionLogService.CausedBy causedBy; - @Override + @Column(nullable = CausedBy.NULLABLE) @CausedBy - public SessionLogService.CausedBy getCausedBy() { - return causedBy; - } - @Override - public void setCausedBy(SessionLogService.CausedBy causedBy) { - this.causedBy = causedBy; - } + @Getter @Setter + private SessionLogService.CausedBy causedBy; } 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 49cfc338b5d..e7b87776faa 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 @@ -63,7 +63,9 @@ public static AuthenticatedWebSessionForIsis get() { @Getter protected transient IsisAppCommonContext commonContext; + @Getter private BreadcrumbModel breadcrumbModel; + @Getter private BookmarkedPagesModel bookmarkedPagesModel; /** @@ -71,6 +73,15 @@ public static AuthenticatedWebSessionForIsis get() { */ private InteractionContext authentication; + private String cachedSessionId; + + public String getCachedSessionId() { + if (cachedSessionId == null && Session.exists()) { + cachedSessionId = getId(); + } + return cachedSessionId; + } + public AuthenticatedWebSessionForIsis(final Request request) { super(request); } @@ -79,7 +90,6 @@ public void init(final IsisAppCommonContext commonContext) { this.commonContext = commonContext; bookmarkedPagesModel = new BookmarkedPagesModel(commonContext); breadcrumbModel = new BreadcrumbModel(commonContext); - } @Override @@ -204,19 +214,7 @@ 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(); @@ -235,10 +233,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 sessionId = AuthenticatedWebSessionForIsis.this.getCachedSessionId(); sessionLoggingServices.forEach(sessionLoggingService -> - sessionLoggingService.log(type, username, now, causedBy, Integer.toString(sessionHashCode)) + sessionLoggingService.log(type, username, now, causedBy, sessionId) ); }; From 5bcbef2f29ad3725c8d8504a3865607ec7fb5cf9 Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Wed, 25 May 2022 15:19:22 +0100 Subject: [PATCH 18/43] ISIS-3062: fixes compile issues... ... too much lombok. --- .../primary/ui/CommandReplayOnPrimaryService.java | 6 +++--- .../secman/jdo/role/dom/ApplicationRole.java | 7 +++++-- .../secman/jdo/tenancy/dom/ApplicationTenancy.java | 5 ++++- .../secman/jdo/user/dom/ApplicationUser.java | 8 ++++++-- .../secman/jpa/role/dom/ApplicationRole.java | 13 +++++++++---- .../secman/jpa/tenancy/dom/ApplicationTenancy.java | 6 +++++- .../secman/jpa/user/dom/ApplicationUser.java | 10 +++++++--- 7 files changed, 39 insertions(+), 16 deletions(-) diff --git a/extensions/core/commandreplay/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 index 3fbda006a5e..9d799817235 100644 --- a/extensions/core/commandreplay/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 @@ -84,7 +84,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. @@ -114,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. @@ -158,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. 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 fe4317b24e0..6d7db7bdbef 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 @@ -40,7 +40,7 @@ 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.Nq; -import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; +import org.apache.isis.extensions.secman.jdo.user.dom.ApplicationUser; import lombok.Getter; import lombok.Setter; @@ -100,8 +100,11 @@ public class ApplicationRole @Persistent(mappedBy = Users.MAPPED_BY) @Users - @Getter private SortedSet users = new TreeSet<>(); + @Override + public SortedSet getUsers() { + return _Casts.uncheckedCast(users); + } // necessary for integration tests 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 2399da32b68..68c2664c91a 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 @@ -119,8 +119,11 @@ public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.Appli @Persistent(mappedBy = Children.MAPPED_BY) @Children - @Getter private SortedSet children = new TreeSet<>(); + @Override + public SortedSet getChildren() { + return _Casts.uncheckedCast(children); + } public void setChildren(final SortedSet children) { this.children = _Casts.uncheckedCast(children); } 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 2f18d8f33f9..ddf496f68a9 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 @@ -41,8 +41,10 @@ import org.apache.isis.applib.annotation.BookmarkPolicy; 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.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; @@ -198,7 +200,9 @@ public void setAccountType(final org.apache.isis.extensions.secman.applib.user.d @Join(column = Roles.Persistence.JOIN_COLUMN) @Element(column = Roles.Persistence.INVERSE_JOIN_COLUMN) @Roles - @Getter private SortedSet roles = new TreeSet<>(); - + @Override + public SortedSet getRoles() { + return _Casts.uncheckedCast(roles); + } } 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 b0bd199553a..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 @@ -41,7 +41,7 @@ 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.Nq; -import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser; +import org.apache.isis.extensions.secman.jpa.user.dom.ApplicationUser; import org.apache.isis.persistence.jpa.applib.integration.IsisEntityListener; import lombok.Getter; @@ -103,10 +103,15 @@ public class ApplicationRole @ManyToMany(mappedBy = Users.MAPPED_BY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) @Users - @Getter - private Set users = new TreeSet<>(); + private Set users = new TreeSet<>(); + + @Override + public Set getUsers() { + return _Casts.uncheckedCast(users); + } + // necessary for integration tests - public void addToUsers(final org.apache.isis.extensions.secman.jpa.user.dom.ApplicationUser applicationUser) { + 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 24922da25a3..f9a3536b5a1 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 @@ -112,8 +112,12 @@ public void setParent(org.apache.isis.extensions.secman.applib.tenancy.dom.Appli @OneToMany(mappedBy = Children.MAPPED_BY) @Children - @Getter private Set children = new TreeSet<>(); + + @Override + public Set getChildren() { + return _Casts.uncheckedCast(children); + } public void setChildren(final Set children) { this.children = _Casts.uncheckedCast(children); } 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 35e1f4efead..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 @@ -42,8 +42,10 @@ import org.apache.isis.applib.annotation.BookmarkPolicy; 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.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; @@ -199,8 +201,10 @@ public void setAccountType(final org.apache.isis.extensions.secman.applib.user.d joinColumns = {@JoinColumn(name = Roles.Persistence.JOIN_COLUMN)}, inverseJoinColumns = {@JoinColumn(name = Roles.Persistence.INVERSE_JOIN_COLUMN)}) @Roles - @Getter - private Set roles = new TreeSet<>(); - + private Set roles = new TreeSet<>(); + @Override + public Set getRoles() { + return _Casts.uncheckedCast(roles); + } } From 879372e9a08b38457dc76c13f49ddcfa69799af6 Mon Sep 17 00:00:00 2001 From: Dan Haywood Date: Wed, 25 May 2022 17:10:18 +0100 Subject: [PATCH 19/43] ISIS-3062: adds httpSessionId to SessionLogEntry --- .../apache/isis/applib/IsisModuleApplib.java | 4 +- .../mixins/system/DomainChangeRecord.java | 17 +++- .../mixins/system/HasInteractionId.java | 4 +- .../services/session/SessionLogService.java | 13 ++-- ...ing.java => SessionLogServiceLogging.java} | 32 ++++---- .../_commands/ExposePersistedCommands.java | 5 +- .../ExposePersistedCommands_commands.java | 5 +- .../applib/dom/CommandLogEntry.java | 29 ++++--- .../applib/dom/SessionLogEntry.java | 78 +++++++++++++------ .../applib/dom/SessionLogEntryRepository.java | 26 +++++-- .../spiimpl/SessionLogServiceDefault.java | 10 +-- .../sessionlog/jdo/dom/SessionLogEntry.java | 28 +++++-- .../sessionlog/jpa/dom/SessionLogEntry.java | 34 ++++---- .../AuthenticatedWebSessionForIsis.java | 9 ++- 14 files changed, 190 insertions(+), 104 deletions(-) rename api/applib/src/main/java/org/apache/isis/applib/services/session/{SessionLoggingServiceLogging.java => SessionLogServiceLogging.java} (67%) 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/mixins/system/DomainChangeRecord.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/system/DomainChangeRecord.java index dc53d43993c..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 @@ -81,7 +81,14 @@ public String toString() { ChangeType getType(); - @PropertyLayout(fieldSetId="Identifiers",sequence = "50") + + @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) @@ -100,7 +107,13 @@ public String toString() { - @PropertyLayout(fieldSetId="Identifiers",sequence = "10") + @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) 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 7d51d28a7eb..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 @@ -27,6 +27,7 @@ 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; @@ -40,7 +41,7 @@ public interface HasInteractionId { @Property( - editing = Editing.DISABLED, + hidden = Where.EVERYWHERE, maxLength = InteractionIdStr.MAX_LENGTH ) @Parameter( @@ -55,6 +56,7 @@ public interface HasInteractionId { String NAME = "interactionId"; } + @Property( editing = Editing.DISABLED ) diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogService.java b/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogService.java index a450716b527..0a4019e8f65 100644 --- a/api/applib/src/main/java/org/apache/isis/applib/services/session/SessionLogService.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 @@ -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 cbfa504eb88..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 SessionLogService { +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/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 f1492260ef1..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,6 +25,7 @@ import org.apache.isis.applib.annotation.PriorityPrecedence; import org.apache.isis.applib.services.tablecol.TableColumnOrderForCollectionTypeAbstract; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; /** * Marker interface for mixins to contribute to. @@ -34,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 6c856b53512..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,6 +24,7 @@ import org.apache.isis.applib.annotation.Collection; import org.apache.isis.applib.annotation.CollectionLayout; +import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntry; import org.apache.isis.extensions.commandlog.applib.dom.CommandLogEntryRepository; import lombok.RequiredArgsConstructor; @@ -38,10 +39,10 @@ public class ExposePersistedCommands_commands { private final ExposePersistedCommands exposePersistedCommands; //tag::class[] - public List coll() { + public List coll() { return commandModelRepository.findCompleted(); } - @Inject CommandLogEntryRepository commandModelRepository; + @Inject CommandLogEntryRepository commandModelRepository; } //end::class[] 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 index 67bb903f57f..088b147bb2c 100644 --- 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 @@ -42,6 +42,7 @@ 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; @@ -223,28 +224,26 @@ public ChangeType getType() { - @Property( - domainEvent = InteractionIdStr.DomainEvent.class - ) - @HasInteractionId.InteractionIdStr - @java.lang.annotation.Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE }) - @Retention(RetentionPolicy.RUNTIME) - public @interface InteractionIdStr { - int MAX_LENGTH = HasInteractionId.InteractionIdStr.MAX_LENGTH; - boolean NULLABLE = HasInteractionId.InteractionIdStr.NULLABLE; - String ALLOWS_NULL = HasInteractionId.InteractionIdStr.ALLOWS_NULL; - String NAME = HasInteractionId.InteractionIdStr.NAME; - class DomainEvent extends PropertyDomainEvent {} - } @InteractionIdStr public abstract String getInteractionIdStr(); public abstract void setInteractionIdStr(String interactionIdStr); - @Override + @Property( + domainEvent = InteractionId.DomainEvent.class + ) @DomainChangeRecord.InteractionId - public UUID getInteractionId() {return UUID.fromString(getInteractionIdStr());} + @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()); + } 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 index db7e5a1cd73..4ca1375592f 100644 --- 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 @@ -7,6 +7,7 @@ import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.List; +import java.util.UUID; import javax.inject.Inject; @@ -51,7 +52,8 @@ public abstract class SessionLogEntry implements HasUsername, Comparable