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 2019/10/05 22:34:38 UTC

[isis] branch v2 updated: ISIS-2158: some minor refinements reg. MixinFacet

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

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


The following commit(s) were added to refs/heads/v2 by this push:
     new f2af6d8  ISIS-2158: some minor refinements reg. MixinFacet
f2af6d8 is described below

commit f2af6d8282532887b1235496f301d182e3bf65a6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Oct 6 00:34:25 2019 +0200

    ISIS-2158: some minor refinements reg. MixinFacet
---
 .../isis/commons/internal/reflection/_Reflect.java | 13 +++++++++
 .../facets/object/mixin/MixinIntendedAs.java       |  4 +--
 .../facets/object/mixin/MixinFacetAbstract.java    |  8 +++---
 .../mixin/MixinFacetForDomainObjectAnnotation.java | 25 ++++++++---------
 .../object/mixin/MixinFacetForMixinAnnotation.java | 31 +++++++++++-----------
 .../mixin/MixinFacetForMixinAnnotationFactory.java |  2 +-
 6 files changed, 45 insertions(+), 38 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/reflection/_Reflect.java b/core/commons/src/main/java/org/apache/isis/commons/internal/reflection/_Reflect.java
index 258fb50..46a97e9 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/reflection/_Reflect.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/reflection/_Reflect.java
@@ -29,10 +29,12 @@ import java.beans.PropertyDescriptor;
 import java.lang.annotation.Annotation;
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.Optional;
 import java.util.Spliterator;
 import java.util.Spliterators;
 import java.util.function.Consumer;
@@ -408,5 +410,16 @@ public final class _Reflect {
         return false;
     }
 
+    public static Optional<Constructor<?>> getPublic1ArgConstructor(Class<?> cls) {
+        val constructors = cls.getConstructors();
+        for (val constructor : constructors) {
+            if(constructor.getParameterCount()==1 && 
+                    Modifier.isPublic(constructor.getModifiers())) {
+                return Optional.of(constructor);
+            }
+        }
+        return Optional.empty();
+    }
+
 
 }
diff --git a/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/object/mixin/MixinIntendedAs.java b/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/object/mixin/MixinIntendedAs.java
index 26839e8..4ee2062 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/object/mixin/MixinIntendedAs.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/object/mixin/MixinIntendedAs.java
@@ -88,8 +88,8 @@ abstract class MixinIntendedAs {
                         facetHolder);
         
         programmingModel.getList().stream()
-        .filter(facetFactory->!facetFactory.getClass().getSimpleName().startsWith("Grid"))
-        .peek(facetFactory->System.out.println("### " + facetFactory.getClass().getName()))
+//        .filter(facetFactory->!facetFactory.getClass().getSimpleName().startsWith("Grid"))
+//        .peek(facetFactory->System.out.println("### " + facetFactory.getClass().getName()))
         .forEach(facetFactory->facetFactory.process(processClassContext));
         
         return facetHolder;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetAbstract.java
index d3bfb11..b4c399c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetAbstract.java
@@ -19,8 +19,6 @@
 
 package org.apache.isis.metamodel.facets.object.mixin;
 
-import static org.apache.isis.commons.internal.base._With.tryOrDefault;
-
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
@@ -47,13 +45,13 @@ extends SingleValueFacetAbstract<String> implements MixinFacet {
     public MixinFacetAbstract(
             final Class<?> mixinType,
             final String value, 
-            final Class<?> constructorType,
+            final Constructor<?> constructor,
             final FacetHolder holder) {
 
         super(type(), value, holder);
         this.mixinType = mixinType;
-        this.constructorType = constructorType;
-        this.constructor = tryOrDefault(()->mixinType.getConstructor(constructorType), null); 
+        this.constructor = constructor;
+        this.constructorType = constructor.getParameterTypes()[0];
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
index 331b653..1e67e52 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
@@ -19,11 +19,13 @@
 
 package org.apache.isis.metamodel.facets.object.mixin;
 
+import java.lang.reflect.Constructor;
 import java.util.Optional;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 
@@ -38,7 +40,7 @@ public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
     private MixinFacetForDomainObjectAnnotation(
             final Class<?> mixinType,
             final String value, 
-            final Class<?> constructorType,
+            final Constructor<?> constructorType,
             final FacetHolder holder) {
 
         super(mixinType, value, constructorType, holder);
@@ -53,21 +55,16 @@ public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
         return domainObjectIfAny
                 .filter(domainObject -> domainObject.nature() == Nature.MIXIN)
                 .map(domainObject -> {
-                    val constructors = candidateMixinType.getConstructors();
-                    for (val constructor : constructors) {
-                        if(constructor.getParameterCount() != 1) {
-                            continue;
-                        }
-                        val constructorTypes = constructor.getParameterTypes();
-                        val constructorType = constructorTypes[0];
-                        return new MixinFacetForDomainObjectAnnotation(
+                    
+                    val constructorIfAny = _Reflect.getPublic1ArgConstructor(candidateMixinType);
+                    
+                    return constructorIfAny
+                    .map(constructor -> new MixinFacetForDomainObjectAnnotation(
                                 candidateMixinType, 
                                 domainObject.mixinMethod(), 
-                                constructorType, 
-                                facetHolder);
-                    }
-                    // else
-                    return null;
+                                constructor, 
+                                facetHolder))
+                    .orElse(null);
                 })
                 .orElse(null);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
index c12ae82..f8aaad2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
@@ -23,9 +23,12 @@ import java.lang.reflect.Constructor;
 
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 
+import lombok.val;
+
 public class MixinFacetForMixinAnnotation extends MixinFacetAbstract {
 
     public static Class<? extends Facet> type() {
@@ -35,31 +38,27 @@ public class MixinFacetForMixinAnnotation extends MixinFacetAbstract {
     private MixinFacetForMixinAnnotation(
             final Class<?> mixinType,
             final String value, 
-            final Class<?> constructorType,
+            final Constructor<?> constructor,
             final FacetHolder holder) {
 
-        super(mixinType, value, constructorType, holder);
+        super(mixinType, value, constructor, holder);
     }
 
     public static MixinFacet create(
+            final Mixin mixin, 
             final Class<?> candidateMixinType, 
             final FacetHolder facetHolder,
             final ServiceInjector servicesInjector) {
         
-        final Mixin mixin = candidateMixinType.getAnnotation(Mixin.class);
-        if(mixin == null) {
-            return null;
-        }
-        final Constructor<?>[] constructors = candidateMixinType.getConstructors();
-        for (Constructor<?> constructor : constructors) {
-            final Class<?>[] constructorTypes = constructor.getParameterTypes();
-            if(constructorTypes.length != 1) {
-                continue;
-            }
-            final Class<?> constructorType = constructorTypes[0];
-            return new MixinFacetForMixinAnnotation(candidateMixinType, mixin.method(), constructorType, facetHolder);
-        }
-        return null;
+        val constructorIfAny = _Reflect.getPublic1ArgConstructor(candidateMixinType);
+        return constructorIfAny
+                .map(constructor -> new MixinFacetForMixinAnnotation(
+                        candidateMixinType, 
+                        mixin.method(), 
+                        constructor, 
+                        facetHolder))
+                .orElse(null);
+
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
index d0671c4..1c0a4ba 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
@@ -52,7 +52,7 @@ extends FacetFactoryAbstract implements MetaModelValidatorRefiner {
         val facetHolder = processClassContext.getFacetHolder();
         
         val mixinFacet = MixinFacetForMixinAnnotation
-                .create(candidateMixinType, facetHolder, getServiceInjector());
+                .create(mixinIfAny.get(), candidateMixinType, facetHolder, getServiceInjector());
         facetHolder.addFacet(mixinFacet);
     }