You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/03/05 07:44:29 UTC

[isis] branch master updated (a1fd2dc -> d1f0b81)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from a1fd2dc  ISIS-2877: fixes regr.: setup InlinePromptContext only when needed
     new f6cde42  ISIS-2877: fa-icon css fixes
     new d1f0b81  ISIS-2877: mixins must be created by MixinFacet

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../progmodel/ProgrammingModelConstants.java       |  8 ++++++
 .../metamodel/facets/object/mixin/MixinFacet.java  |  3 ++-
 .../facets/object/mixin/MixinFacetAbstract.java    | 31 +++++++++++++---------
 .../mixin/MixinFacetForDomainObjectAnnotation.java | 15 +++++------
 .../specloader/specimpl/ObjectMemberAbstract.java  | 16 ++++++-----
 .../factory/FactoryServiceDefault.java             | 27 +++++--------------
 .../cal/jpa/IsisCalendarEventJpa_update.java       |  2 ++
 .../wicket/model/models/FormExecutorContext.java   |  4 ++-
 .../wicket/ui/pages/bootstrap-overrides-all-v2.css |  4 ---
 .../ComponentFactoryRegistrarDefault.java          |  2 +-
 10 files changed, 58 insertions(+), 54 deletions(-)

[isis] 01/02: ISIS-2877: fa-icon css fixes

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit f6cde42e311178f6efbbf7e119d9feadc2e4f4be
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Mar 5 08:43:16 2022 +0100

    ISIS-2877: fa-icon css fixes
---
 .../apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css
index 51b5e97..c97a8b5 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-all-v2.css
@@ -528,10 +528,6 @@ span.containedButtonPanel {
 
 /* from additionalLinksPanel.css */
 
-span .fontAwesomeIcon {
-    margin-right: 6px;
-}
-
 .additionalLinkList {
     float:left;
     margin:0;

[isis] 02/02: ISIS-2877: mixins must be created by MixinFacet

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit d1f0b81517ad9475331c525e8719ff3bda5c4ebf
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Mar 5 08:44:16 2022 +0100

    ISIS-2877: mixins must be created by MixinFacet
    
    - ensure service injection
---
 .../progmodel/ProgrammingModelConstants.java       |  8 ++++++
 .../metamodel/facets/object/mixin/MixinFacet.java  |  3 ++-
 .../facets/object/mixin/MixinFacetAbstract.java    | 31 +++++++++++++---------
 .../mixin/MixinFacetForDomainObjectAnnotation.java | 15 +++++------
 .../specloader/specimpl/ObjectMemberAbstract.java  | 16 ++++++-----
 .../factory/FactoryServiceDefault.java             | 27 +++++--------------
 .../cal/jpa/IsisCalendarEventJpa_update.java       |  2 ++
 .../wicket/model/models/FormExecutorContext.java   |  4 ++-
 .../ComponentFactoryRegistrarDefault.java          |  2 +-
 9 files changed, 58 insertions(+), 50 deletions(-)

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 df75f7b..4528682 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
@@ -190,6 +190,14 @@ public final class ProgrammingModelConstants {
                             + "when using type '%s' as first argument",
                             mixinClass.getName(), mixinClass.getName())));
         }
+
+        // while this enum only has a single value, we just provide a (quasi) static method here
+        public <T> Can<Constructor<T>> getConstructors(final Class<T> candidateMixinType) {
+            val mixinContructors = _Reflect
+                    .getPublicConstructors(candidateMixinType)
+                    .filter(paramCount(1));
+            return _Casts.uncheckedCast(mixinContructors);
+        }
     }
 
     // -- LIFECYCLE CALLBACKS
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
index 58b58ef..08475b3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
@@ -50,7 +50,8 @@ public interface MixinFacet extends SingleValueFacet<String> {
     }
 
     /**
-     * Returns the mix-in around the provided domain object (<i>holder</i>)
+     * Returns the mix-in around the provided domain object (<i>holder</i>),
+     * also resolving any injection points.
      */
     Object instantiate(Object holderPojo);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
index 7f39491..8aa7df4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
 
+import lombok.NonNull;
 import lombok.val;
 
 //@Log4j2
@@ -35,9 +36,9 @@ public abstract class MixinFacetAbstract
 extends SingleValueFacetAbstract<String>
 implements MixinFacet {
 
-    private final Class<?> mixinType;
-    private final Class<?> holderType;
-    private final Constructor<?> constructor;
+    private final @NonNull Class<?> mixinType;
+    private final @NonNull Class<?> holderType;
+    private final @NonNull Constructor<?> constructor;
 
     private static final Class<? extends Facet> type() {
         return MixinFacet.class;
@@ -61,30 +62,36 @@ implements MixinFacet {
         if (candidateDomainType == null) {
             return false;
         }
+
         return holderType.isAssignableFrom(candidateDomainType);
     }
 
     @Override
-    public Object instantiate(final Object domainPojo) {
+    public Object instantiate(final Object mixee) {
         if(constructor == null) {
             throw _Exceptions.unrecoverableFormatted(
-                    "invalid mix-in declaration of type %s, missing contructor", mixinType);
+                    "Failed to instantiate mixin. "
+                    + "Invalid mix-in declaration of type %s, missing contructor", mixinType);
         }
-        if(domainPojo == null) {
+        if(mixee == null) {
             return null;
         }
-        if(!isMixinFor(domainPojo.getClass())) {
-            throw _Exceptions.unrecoverableFormatted(
-                    "invalid mix-in declaration of type %s, unexpect owner type %s",
-                    mixinType, domainPojo.getClass());
+        if(!isMixinFor(mixee.getClass())) {
+            throw _Exceptions.illegalArgument(
+                    "Failed to instantiate mixin. "
+                    + "Mixin class %s is not a mixin for supplied object [%s]. "
+                    + "Mixin construction expects type: %s",
+                    mixinType.getName(), mixee, holderType);
         }
         try {
-            val mixinPojo = constructor.newInstance(domainPojo);
+            val mixinPojo = constructor.newInstance(mixee);
             getServiceInjector().injectServicesInto(mixinPojo);
             return mixinPojo;
         } catch (InvocationTargetException | InstantiationException | IllegalAccessException e) {
             throw _Exceptions.unrecoverableFormatted(
-                    "invalid mix-in declaration of type %s, failing instance construction with %s", mixinType, e);
+                    "Failed to instantiate mixin. "
+                    + "Invalid mix-in declaration of type %s, "
+                    + "failing instance construction with %s", mixinType, e);
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
index 4462c9d..b4f23f0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
@@ -23,11 +23,9 @@ import java.util.Optional;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
-import org.apache.isis.commons.internal.reflection._Reflect;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-import static org.apache.isis.commons.internal.reflection._Reflect.Filter.paramCount;
-
 import lombok.val;
 
 public class MixinFacetForDomainObjectAnnotation
@@ -43,9 +41,9 @@ extends MixinFacetAbstract {
         .filter(domainObject -> domainObject.nature() == Nature.MIXIN)
         .map(domainObject -> {
 
-            val mixinContructors = _Reflect
-                    .getPublicConstructors(candidateMixinType)
-                    .filter(paramCount(1));
+            val mixinContructors =
+                    ProgrammingModelConstants.MixinConstructor.PUBLIC_SINGLE_ARG_RECEIVING_MIXEE
+                    .getConstructors(candidateMixinType);
 
             return mixinContructors.getSingleton() // empty if cardinality!=1
             .map(constructor -> new MixinFacetForDomainObjectAnnotation(
@@ -60,9 +58,8 @@ extends MixinFacetAbstract {
     private MixinFacetForDomainObjectAnnotation(
             final Class<?> mixinClass,
             final String mixinMethodName,
-            final Constructor<?> constructorType,
+            final Constructor<?> constructor,
             final FacetHolder holder) {
-
-        super(mixinClass, mixinMethodName, constructorType, holder);
+        super(mixinClass, mixinMethodName, constructor, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 319f254..8ebec66 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import java.util.Objects;
 import java.util.Optional;
 import java.util.UUID;
 import java.util.function.Function;
@@ -43,7 +42,6 @@ import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
 import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
-import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.interactions.AccessContext;
 import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
 import org.apache.isis.core.metamodel.interactions.HidingInteractionAdvisor;
@@ -54,6 +52,7 @@ import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.services.command.CommandDtoFactory;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 
@@ -278,10 +277,15 @@ implements
             final @NonNull Class<?> mixinType,
             final @NonNull ManagedObject mixee) {
 
-        val spec = getSpecificationLoader().loadSpecification(mixinType);
-        val mixinFacet = spec.getFacet(MixinFacet.class);
-        val mixinPojo = mixinFacet.instantiate(mixee.getPojo() /*nullable for action parameter mixins*/);
-        return ManagedObject.of(spec, Objects.requireNonNull(mixinPojo));
+        val mixinSpec = getSpecificationLoader().loadSpecification(mixinType);
+
+        // nullable for action parameter mixins
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(mixee)) {
+            return ManagedObject.empty(mixinSpec);
+        }
+
+        val mixinPojo = getMetaModelContext().getFactoryService().mixin(mixinType, mixee.getPojo());
+        return ManagedObject.of(mixinSpec, mixinPojo);
     }
 
     // -- OBJECT CONTRACT
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 5920783..045235b 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
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.runtimeservices.factory;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.Optional;
 
 import javax.annotation.Priority;
@@ -37,7 +36,6 @@ import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
-import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MixinConstructor;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.services.objectlifecycle.ObjectLifecyclePublisher;
@@ -99,30 +97,19 @@ public class FactoryServiceDefault implements FactoryService {
     }
 
     @Override
-    public <T> T mixin(final @NonNull Class<T> mixinClass, final @NonNull Object mixedIn) {
+    public <T> T mixin(final @NonNull Class<T> mixinClass, final @NonNull Object mixee) {
         val mixinSpec = loadSpec(mixinClass);
         val mixinFacet = mixinSpec.getFacet(MixinFacet.class);
         if(mixinFacet == null) {
-            throw _Exceptions.illegalArgument("Class '%s' is not a mixin", mixinClass.getName());
+            throw _Exceptions.illegalArgument("Class '%s' is not a mixin",
+                    mixinClass.getName());
         }
         if(mixinSpec.isAbstract()) {
-            throw _Exceptions.illegalArgument("Cannot instantiate abstract type '%s' as a mixin", mixinClass.getName());
-        }
-        if(!mixinFacet.isMixinFor(mixedIn.getClass())) {
-            throw _Exceptions.illegalArgument("Mixin class '%s' is not a mixin for supplied object '%s'",
-                    mixinClass.getName(), mixedIn);
-        }
-        val mixinConstructor = MixinConstructor.PUBLIC_SINGLE_ARG_RECEIVING_MIXEE
-                .getConstructorElseFail(mixinClass, mixedIn.getClass());
-
-        try {
-            val mixin = mixinConstructor.newInstance(mixedIn);
-            return _Casts.uncheckedCast(serviceInjector.injectServicesInto(mixin));
-        } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
-            throw _Exceptions.illegalArgument(
-                    "Failed to invoke constructor of '%s' using single argument '%s'",
-                    mixinClass.getName(), mixedIn);
+            throw _Exceptions.illegalArgument("Cannot instantiate abstract type '%s' as a mixin",
+                    mixinClass.getName());
         }
+        val mixin = mixinFacet.instantiate(mixee);
+        return _Casts.uncheckedCast(mixin);
     }
 
     @Override
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jpa/IsisCalendarEventJpa_update.java b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jpa/IsisCalendarEventJpa_update.java
index 50b14fe..f6f6637 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jpa/IsisCalendarEventJpa_update.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/types/isisext/cal/jpa/IsisCalendarEventJpa_update.java
@@ -37,11 +37,13 @@ import lombok.val;
         semantics = SemanticsOf.IDEMPOTENT
 )
 @ActionLayout(
+        named = "Update (experimental)",
         associateWith = "readWriteProperty"
         //promptStyle = PromptStyle.INLINE_AS_IF_EDIT
         )
 @RequiredArgsConstructor
 //FIXME[ISIS-2877] intermediate, remove when resolved
+@Deprecated
 public class IsisCalendarEventJpa_update {
 
     private final IsisCalendarEventJpa mixee;
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
index 83f8b17..28289ea 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
@@ -25,7 +25,9 @@ import org.apache.isis.core.runtime.context.IsisAppCommonContext.HasCommonContex
 import org.apache.isis.viewer.common.model.HasParentUiModel;
 
 public interface FormExecutorContext
-extends HasParentUiModel<EntityModel>, HasCommonContext {
+extends
+    HasParentUiModel<EntityModel>,
+    HasCommonContext {
 
     PromptStyle getPromptStyle();
 
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 856fb12..724bdfb 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -364,7 +364,7 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
     public static <T extends Serializable> ComponentFactoryScalarAbstract
     createScalarPanelForComposite(final Class<T> valueTypeClass) {
 
-        // assuming there is no primitive temporal type
+        // assuming there is no primitive composite type
         val valueTypeClasses = Can.<Class<?>>ofSingleton(valueTypeClass);
 
         return new ComponentFactoryScalarAbstract(